HelioNeto Postado 9 Agosto, 2023 Postado 9 Agosto, 2023 Boa Tarde! Vi que ainda não tem o Boleto Híbrido do Bradesco implementado no ACBrBoleto. Consegui contato com o Gerente e geraram as chaves e me mandaram o manual de configuração. Fiquei meio perdido com o manual, e acho que é por isso que ainda não tem esse Boleto Hibrido aqui..kkkkk No fim de uns 2 dias fazendo testes consegui entender e fazer funcionar a Requisição do Token no Postman e no TidHttp. Inclusive para atender os clientes aqui da Empresa vou fazer usando o TidHttp do Indy. Para tentar colocar na ACBr fiz a copia dos arquivos do Bancoob e comecei a mexer. Criei o arquivo: ..\svn\trunk2\Fontes\ACBrBoleto\WS\ACBrBoletoW_Bradesco.pas ..\svn\trunk2\Fontes\ACBrBoleto\WS\ACBrBoletoRet_Bradesco.pas Abaixo, segue todo o código que fiz na função GerarTokenAutenticacao no arquvo ..\svn\trunk2\Fontes\ACBrBoleto\WS\ACBrBoletoW_Bradesco.pas: function TBoletoW_Bradesco.GerarTokenAutenticacao: string; var strheaderJSON, strPayloadJSON : String; JsonHeader, JsonPayload: TJsonObject; intMiliSegundos, intSegundos, intSegundos1h: int64; dataAtual: TDateTime; stremHeadPayload : TStringStream; strHeaderBase64, strPayloadBase64, strHeadPayloadAssinado, strAssertion: WideString; xRequestBody : TStringList; begin {*** BLOCO FORMATACAO DA DATA DO PAYLOAD***} dataAtual := Now; intSegundos := DateTimeToUnix(dataAtual, False); //Data Atual UTC em Segundos. intSegundos1h := DateTimeToUnix(IncHour(dataAtual, 1), False); //Data Atual UTC em Segundos + Horario 1h intMiliSegundos := DateTimeToUnix(dataAtual, False) * 1000 + MilliSecondsBetween(dataAtual, Trunc(dataAtual)); //Data Atual UTC em Milisegundos. {*** FIM BLOCO FORMATACAO DA DATA DO PAYLOAD***} {*** BLOCO MONTAGEM DO HEADER JSON ***} JsonHeader := TJsonObject.Create; try JsonHeader.Add('alg').Value.asString := 'RS256'; JsonHeader.Add('typ').Value.asString := 'JWT'; strheaderJSON := JsonHeader.Stringify; strHeaderBase64 := EncodeBase64(strheaderJSON); except end; {*** FIM BLOCO MONTAGEM DO HEADER JSON ***} {*** BLOCO MONTAGEM DO PAYLOAD JSON ***} JsonPayload := TJsonObject.Create; try JsonPayload.Add('aud').Value.asString := 'https://proxy.api.prebanco.com.br/auth/server/v1.1/token'; //URL; JsonPayload.Add('sub').Value.asString := 'cliente_id'; //Client ID; JsonPayload.Add('iat').Value.asString := IntToStr(intSegundos); //data atual em segundos; JsonPayload.Add('exp').Value.asString := IntToStr(intSegundos1h); //data atual adicionando uma hora à frente, em segundos; JsonPayload.Add('jti').Value.asString := IntToStr(intMiliSegundos); //data atual em milissegundos; JsonPayload.Add('ver').Value.asString := '1.1'; strPayloadJSON := JsonPayload.Stringify; strPayloadBase64 := EncodeBase64(strPayloadJSON); except end; {*** FIM BLOCO MONTAGEM DO PAYLOAD JSON ***} {*** BLOCO DE ASSINATURA ***} FSSLDigest := dgstSHA256; FSSLHashOutput := outBase64; DFeSSL.SSLCryptLib := cryOpenSSL; DFeSSL.SSLHttpLib := httpOpenSSL; DFeSSL.SSLXmlSignLib := xsLibXml2; DFeSSL.ArquivoPFX := 'certificado.pfx'; DFeSSL.Senha := 'senha'; DFeSSL.CarregarCertificado; stremHeadPayload := TStringStream.Create(strHeaderBase64+'.'+strPayloadBase64); //concatena conforme o manual. strHeadPayloadAssinado := CalcularHash(stremHeadPayload);//aqui realiza a assinatura. strAssertion := strHeaderBase64+'.'+strPayloadBase64+'.'+strHeadPayloadAssinado; //HeaderBase64 + PayloadBase64 + JWT assinado = JWS. {*** FIM BLOCO DE ASSINATURA ***} {*** MONTAGEM DO BODY COM O JWS (JSON Web Signature) ***} xRequestBody := TStringList.Create; xRequestBody.Add('grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer'); xRequestBody.Add('assertion='+strAssertion); HTTPSend.Document.Clear; //Esse xRequestBody precisa ser enviado no Body do Post, não consegui fazer funcionar. {*** FIM MONTAGEM BODY ***} OAuth.ContentType := 'application/x-www-form-urlencoded'; OAuth.Payload := true; OAuth.AuthorizationType := atNoAuth; //precisa alterar para NoAuth para não mandar o Basic. Result := inherited GerarTokenAutenticacao; end; Todo esse código é somente para Gerar o JWS (JSON Web Signature). Não segui muito as boas praticas, só queria fazer funcionar, e até consegui montar todos os dados, inclusive o JWS gerado aqui foi o que eu Utilizei no Postman. mas no momento de enviar, o FHTTPSend.HTTPMethod(MetodoHTTPToStr(htPOST), URL) manda esses dados pelo Header e o Bradesco só aceita se mandar pelo Body. Esse pequeno, grande detalhe foi o que fez eu não conseguir gerar o Token, a resposta que está vindo é esta: Erro: 400 - Bad Request { "code": "100", "message": "invalid token", "details": null } Pelo que li no manual, todos os endpoints precisam de Assinatura no Payload. Não encontrei outro Banco já configurado que tenha este tipo de abordagem e acho que o Bradesco só está dificultando as coisas. Se mais alguém quiser colaborar, para colocar no ACBrBoleto, está aí, pelo menos a parte de geração do Token. Segue em anexo o Manual e os arquivos alterados para conseguir utilizar no ACBrBoleto. ACBrBoleto-Bradesco.zip 5
Lucio Bittes Postado 23 Agosto, 2023 Postado 23 Agosto, 2023 (editado) Muito bom. Consegui o manual para a implementação mas como vi seu topico vou anexar junto. Clique aqui ManualAPI Editado 23 Agosto, 2023 por Lucio Bittes 1
rafabarzotto Postado 30 Agosto, 2023 Postado 30 Agosto, 2023 Fala pessoal, Estou implementando a comunicação com essa API do Bradesco também. Até agora gerar o token fluiu sem problemas. Estou com um pouco de dificuldade em assinar a requisição de Registro de Boleto, acusa erro de assinatura. Segue mais alguns manuais que tenho aqui: API Bradesco Docs. 1
HelioNeto Postado 30 Agosto, 2023 Autor Postado 30 Agosto, 2023 @rafabarzotto eu quebrei a cabeça também, mas consegui fazer a requisição. No meu caso, está retornando um ERRO que os caras do Bradesco estão tentando resolver internamente, abriram um Ticket para tentar resolver. mas vou colocar o código que eu fiz aqui para você dar uma olhada: const URL_CRIABOLETO = 'https://proxy.api.prebanco.com.br/v1/boleto/registrarBoleto'; URI_REG_BOLETO = '/v1/boleto/registrarBoleto'; procedure TfrmBradescoApi.CriarBoleto; var strResult: String; objJson: TJSONObject; strTimeStamp, strObj, strLinha1, strLinha2, strLinha3, strLinha4, strLinha5, strLinha6, strLinha7, strLinha8 : String; intMiliSegundos: int64; dataAtual: TDateTime; stremRequest : TStringStream; strRequestAssinado : WideString; xRequestBody : TStringStream; objCriaBoleto : TLibBradescoApiCriaBoleto; begin {*** BLOCO FORMATACAO DA DATA***} dataAtual := Now; intMiliSegundos := DateTimeToUnix(dataAtual, False) * 1000 + MilliSecondsBetween(dataAtual, Trunc(dataAtual)); //Data Atual UTC em Milisegundos. strTimeStamp := ConverteDateISO(dataAtual, False); {*** FIM BLOCO FORMATACAO DA***} {*** BLOCO DE ASSINATURA ***} DFeSSL.SSLCryptLib := cryOpenSSL; DFeSSL.ArquivoPFX := 'certificado.pfx'; DFeSSL.Senha := '123456'; DFeSSL.CarregarCertificado; strLinha1 := 'POST'+#10; //Methodo HTTP strLinha2 := URI_REG_BOLETO+#10; //URI de Requisição strLinha2 := ''+#10; //Parâmetros. quando houver, se não tem deixa linha em branco. strLinha4 := strObj+#10; //Json de criação do Boleto que vai no Body. strLinha5 := editToken.Text+#10; //Access-token retornado da API. strLinha6 := IntToStr(intMiliSegundos)+#10; //Hora Atual em Milisegundos. strLinha7 := strTimeStamp+#10; //TimeStamp; strLinha8 := 'SHA256'; //Algoritimo Usado. stremRequest := TStringStream.Create(strLinha1+strLinha2+strLinha3+strLinha4+strLinha5+strLinha6+strLinha7+strLinha8); //Aqui vai o arquivo para Assinar. stremRequest.SaveToFile('request.txt'); strRequestAssinado := CalcularHash(stremRequest);//aqui realiza a assinatura. {*** FIM BLOCO DE ASSINATURA ***} {*** CRIAÇAO DO PAYLOAD DO BOLETO ***} objCriaBoleto := TLibBradescoApiCriaBoleto.Create; //Classe contento todos os campos do boleto. objCriaBoleto.isacdoTitloCobr := 'HELIO NETO'; //NOME DO CLIENTE objCriaBoleto.elogdrSacdoTitlo := 'RUA AFONSO PENA'; //RUA. objCriaBoleto.enroLogdrSacdo := 999; //NUMERO objCriaBoleto.ccepSacdoTitlo := 79000000; //CEP objCriaBoleto.ebairoLogdrSacdo := 'CENTRO'; //BAIRRO objCriaBoleto.imunSacdoTitlo := 'CAMPO GRANDE'; //CIDADE CLIENTE objCriaBoleto.csglUfSacdo := 'MS'; //UF CLIENTE objCriaBoleto.indCpfCnpjSacdo := 1; //TIPO 1 CPF objCriaBoleto.nroCpfCnpjSacdo := '00000000000'; //CEP DO CLIENTE. objCriaBoleto.demisTitloCobr := FormatDateTime('dd.mm.yyyy', Now); //'30.08.2023'; //Data Emissão. objCriaBoleto.dvctoTitloCobr := FormatDateTime('dd.mm.yyyy', IncDay(Now,1)); //'31.08.2023'; //Data Vencimento. strObj := TJson.ObjectToJsonString(objCriaBoleto); //Converte de Objeto para Json. {*** FIM CRIAÇAO DO PAYLOAD DO BOLETO ***} {*** MONTAGEM DO HEADER ***} FHTTP.Request.Clear; FHTTP.Request.CustomHeaders.Clear; FHTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)'; FHTTP.Request.AcceptCharSet := 'UTF-8, *;q=0.8'; FHTTP.Request.AcceptEncoding := 'gzip, deflate, br'; FHTTP.Request.BasicAuthentication := False; FHTTP.Request.CustomHeaders.FoldLines := False; FHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; FHTTP.Request.CustomHeaders.Add('Authorization: Bearer ' + editToken.Text); //TOKEN OBTIDO. FHTTP.Request.CustomHeaders.Add('cpf-cnpj: 00000000000000'); //CNPJ DA EMPRESA FHTTP.Request.CustomHeaders.Add('X-Brad-Nonce: ' + IntToStr(intMiliSegundos)); FHTTP.Request.CustomHeaders.Add('X-Brad-Timestamp: ' + strTimeStamp); FHTTP.Request.CustomHeaders.Add('X-Brad-Algorithm: SHA256'); {*** FIM MONTAGEM DO HEADER ***} xRequestBody := TStringStream.Create(strObj); //Preenche o Body para enviar no Post. try strResult := FHTTP.Post(URL_CRIABOLETO, xRequestBody); //Envia. MemoResp.lines.add(strResult); objJson := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(strResult), 0) as TJSONObject; except on E: EIdHTTPProtocolException do begin MemoResp.Lines.add(E.ErrorMessage); end; end; FreeAndNil(xRequestBody); end; function TfrmBradescoApi.ConverteDateISO(AData: TDateTime; AInputIsUTC : Boolean = True): String; const SDateFormat: string = 'yyyy''-''mm''-''dd''T''hh'':''nn'':''ss''Z'''; { Do not localize } SOffsetFormat: string = '%s%s%.02d:%.02d'; { Do not localize } Neg: array[Boolean] of string = ('+', '-'); { Do not localize } var Bias: Integer; TimeZone: TTimeZone; begin Result := FormatDateTime(SDateFormat, AData); if not AInputIsUTC then begin TimeZone := TTimeZone.Local; Bias := Trunc(TimeZone.GetUTCOffset(AData).Negate.TotalMinutes); if Bias <> 0 then begin // Remove the Z, in order to add the UTC_Offset to the string. SetLength(Result, Result.Length - 1); Result := Format(SOffsetFormat, [Result, Neg[Bias > 0], Abs(Bias) div MinsPerHour, Abs(Bias) mod MinsPerHour]); end end; end; Entendo que eles tem essas regras de segurança, mas eles poderiam simplificar algumas coisas. Espero ter ajudado. 2
Consultores Daniel InfoCotidiano Postado 30 Agosto, 2023 Consultores Postado 30 Agosto, 2023 @HelioNeto Primeiro quero parabenizar pela iniciativa Lembrando que você pode criar um novo banco seguindo o exemplo de outros bancos para permanecer no mesmo padrão, utilizando algumas funções já existentes. Uma dica, aqui no fórum para o post não ficar muito grande, ao invés de publicar parte do código, utilize anexar arquivos ou units. Daniel de Morais (Infocotidiano) Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Discord
HelioNeto Postado 30 Agosto, 2023 Autor Postado 30 Agosto, 2023 (editado) @Daniel InfoCotidiano Obrigado! Pois é, eu tentei fazer, mas da forma como foi implementado o ACBrBoleto, não consegui fazer a requisição. Observei que a geração do Token faz a requisição com opção de adicionar parâmetros no "Header", mas o Bradesco tem uma particularidade que precisa enviar no "Body". O Bradesco usa uma abordagem diferente das demais, no Primeiro post aqui desse tópico, eu explico essa dificuldade que tive. Então acabei implementando de forma separada usando TIdHTTP do Indy juntamente com o DFeSSL para realizar as Assinaturas. Acredito que dá para adaptar o componente do ACBr que usa o synapse para enviar parâmetros no Body da requisição POST, mas eu não consegui. Editado 30 Agosto, 2023 por HelioNeto
rafabarzotto Postado 30 Agosto, 2023 Postado 30 Agosto, 2023 @HelioNeto Reparei que no seu seu Header para a requisição de registro de boleto não possui o parâmetro X-Brad-Signature ele não é necessário mesmo? E o X-Brad-Timestamp (2022-07-11T10:18:56-00:00) não estou passando o -03-00. Fora isso, testei também com aquele end-point /v1.1/jwt-service. Mas sem sucesso. Recebo o erro invalid signature Pensei também na possibilidade de ser a diferença de quebra de linha do windows/linux na hora de gerar a assinatura da request, nas a principio também está ok.
HelioNeto Postado 30 Agosto, 2023 Autor Postado 30 Agosto, 2023 @rafabarzotto Dessa forma que coloquei aí funcionou. o X-Brad-Signature não vai mesmo não, ele só vai no Body coloquei para gerar o arquivo Request.txt para mostrar como está sendo montado, no meu caso saiu conforme o anexo (Request.txt) No código que eu postei estava errado, tem a variável strLinha2 estava repetida e o strObj estava vazio por que eu movi ele para baixo antes de copiar para cá. Atualizei o Arquivo que segue em anexo(Exemplo-RegistroBoleto.txt) o X-Brad-Timestamp usa a variável strTimeStamp que gera a data no formato solicitado pelo Bradesco, conforme a função ConverteDateISO No meu caso, é -04:00 por que Estou em Campo Grande/MS, aí monta assim: 2023-08-30T14:20:06-04:00 Exemplo-RegistroBoleto.txt Request.txt
rafabarzotto Postado 30 Agosto, 2023 Postado 30 Agosto, 2023 @HelioNeto Maravilha meu amigo, as dicas foram valiosas. Acabei caindo aqui fórum do ACBR por acaso depois de um vídeo seu. Estou desenvolvendo um middleware de integração bancaria que recebe dados por meio de WSDL e comunica REST com o banco escolhido, isso em linguagem PHP. Deixo meu https://github.com/rafabarzotto, caso alguém encontre dificuldade e precise tirar alguma duvida sobre essa API do Bradesco. 2
HelioNeto Postado 30 Agosto, 2023 Autor Postado 30 Agosto, 2023 @rafabarzotto Que bom que deu Certo! Meu intuito era colaborar mesmo. Bacana seu projeto, eu desenvolvo em PHP também.
rafabarzotto Postado 31 Agosto, 2023 Postado 31 Agosto, 2023 @HelioNeto Aproveitando o tópico, se tiver conhecimento sobre consegue me responder esses casos: os end-points de: /v1/boleto/titulo-consultar, /v1/boleto/titulo-baixar, /v1/boleto/alterar-titulo estão disponíveis para ambiente de homologação? Pois eles retornam apenas o conteúdo do body enviado, com status 200, mesmo que não envie o header da requisição. E nesse do print da minha resposta acima, estou enviando os campos, mas mesmo assim acusa erro. Bem estranho.
Lucio Bittes Postado 11 Setembro, 2023 Postado 11 Setembro, 2023 Parabéns a todos que tomou a iniciativa. Conseguiu fazer a requisição pelo componente acbr boleto? Tenho interesse em ajudar.
HelioNeto Postado 11 Setembro, 2023 Autor Postado 11 Setembro, 2023 @Lucio Bittes Pelo que analisei, nos fontes da ACBr: Em 09/08/2023 at 17:51, HelioNeto disse: mas no momento de enviar, o FHTTPSend.HTTPMethod(MetodoHTTPToStr(htPOST), URL) manda esses dados pelo Header e o Bradesco só aceita se mandar pelo Body. Então teria que criar um overload desse método HTTPMethod com opção de enviar Parâmetros no Body Como este ajuste é na Base do componente, eu não quis tentar criar algo nesse sentido, mas acredito que se houver essa opção vai funcionar a geração do Token. Depois vem outros detalhes bem específicos da API do Bradesco na parte de Registrar o Boleto que pode ser que seja necessário mais algum ajuste. Eu Tive um problema nas minhas credenciais de teste com o Bradesco, eles abriram um Ticket Interno, estou esperando há umas 2 semanas eles me responderem para dar sequencia na implementação. 1
Consultores Victor H. Gonzales - Panda Postado 11 Setembro, 2023 Consultores Postado 11 Setembro, 2023 Em 30/08/2023 at 14:02, HelioNeto disse: @Daniel InfoCotidiano Obrigado! Pois é, eu tentei fazer, mas da forma como foi implementado o ACBrBoleto, não consegui fazer a requisição. Observei que a geração do Token faz a requisição com opção de adicionar parâmetros no "Header", mas o Bradesco tem uma particularidade que precisa enviar no "Body". O Bradesco usa uma abordagem diferente das demais, no Primeiro post aqui desse tópico, eu explico essa dificuldade que tive. Então acabei implementando de forma separada usando TIdHTTP do Indy juntamente com o DFeSSL para realizar as Assinaturas. Acredito que dá para adaptar o componente do ACBr que usa o synapse para enviar parâmetros no Body da requisição POST, mas eu não consegui. da uma olhada no Sicoob, é simples fazer com Synapse 3 horas atrás, HelioNeto disse: @Lucio Bittes Pelo que analisei, nos fontes da ACBr: Então teria que criar um overload desse método HTTPMethod com opção de enviar Parâmetros no Body Como este ajuste é na Base do componente, eu não quis tentar criar algo nesse sentido, mas acredito que se houver essa opção vai funcionar a geração do Token. Depois vem outros detalhes bem específicos da API do Bradesco na parte de Registrar o Boleto que pode ser que seja necessário mais algum ajuste. Eu Tive um problema nas minhas credenciais de teste com o Bradesco, eles abriram um Ticket Interno, estou esperando há umas 2 semanas eles me responderem para dar sequencia na implementação. não sendo no OAuth, que seria necessário um override. para mandar via body a requisição de envio de boleto por exemplo, é só ativar o payload constructor TBoletoW_Sicredi_APIV2.Create(ABoletoWS: TBoletoWS); begin inherited Create(ABoletoWS); FPAccept := C_ACCEPT; if Assigned(OAuth) then begin if OAuth.Ambiente = taHomologacao then OAuth.URL := C_URL_OAUTH_HOM else OAuth.URL := C_URL_OAUTH_PROD; OAuth.Payload := True; end; end; Victor H Gonzales - Pandaaa Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Discord Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !! "Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci "Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"
HelioNeto Postado 11 Setembro, 2023 Autor Postado 11 Setembro, 2023 28 minutos atrás, Victor H. Gonzales - Panda disse: não sendo no OAuth, que seria necessário um override. para mandar via body a requisição de envio de boleto por exemplo, é só ativar o payload @Victor H. Gonzales - Panda Eu já tentei mas não consegui fazer funcionar. Se você baixar o arquivo que eu anexei, vai ver que eu Copiei o arquivo ACBrBancoW_Bancoob.pas alterei para ACBrBoletoW_Bradesco.pas E fiz as modificações no Método: function TBoletoW_Bradesco.GerarTokenAutenticacao: {*** MONTAGEM DO BODY COM O JWS (JSON Web Signature) ***} xRequestBody := TStringList.Create; xRequestBody.Add('grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer'); xRequestBody.Add('assertion='+strAssertion); HTTPSend.Document.Clear; //Esse xRequestBody precisa ser enviado no Body do Post, não consegui fazer funcionar. {*** FIM MONTAGEM BODY ***} OAuth.ContentType := 'application/x-www-form-urlencoded'; OAuth.Payload := true; OAuth.AuthorizationType := atNoAuth; //precisa alterar para NoAuth para não mandar o Basic. Result := inherited GerarTokenAutenticacao;
Consultores Victor H. Gonzales - Panda Postado 11 Setembro, 2023 Consultores Postado 11 Setembro, 2023 19 minutos atrás, HelioNeto disse: @Victor H. Gonzales - Panda Eu já tentei mas não consegui fazer funcionar. Se você baixar o arquivo que eu anexei, vai ver que eu Copiei o arquivo ACBrBancoW_Bancoob.pas alterei para ACBrBoletoW_Bradesco.pas E fiz as modificações no Método: function TBoletoW_Bradesco.GerarTokenAutenticacao: {*** MONTAGEM DO BODY COM O JWS (JSON Web Signature) ***} xRequestBody := TStringList.Create; xRequestBody.Add('grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer'); xRequestBody.Add('assertion='+strAssertion); HTTPSend.Document.Clear; //Esse xRequestBody precisa ser enviado no Body do Post, não consegui fazer funcionar. {*** FIM MONTAGEM BODY ***} OAuth.ContentType := 'application/x-www-form-urlencoded'; OAuth.Payload := true; OAuth.AuthorizationType := atNoAuth; //precisa alterar para NoAuth para não mandar o Basic. Result := inherited GerarTokenAutenticacao; se quiser enviar as unit atualizadas suas e as credenciais... as credenciais envie em [email protected] posso verificar para ti, tentar ajudar. 1 Victor H Gonzales - Pandaaa Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Discord Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !! "Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci "Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"
HelioNeto Postado 11 Setembro, 2023 Autor Postado 11 Setembro, 2023 @Victor H. Gonzales - Panda Obrigado pela disponibilidade. Houve um problema nas minhas credenciais, estou esperando o Bradesco me responder, quando estiver com as Credenciais atualizadas ou quando eles resolverem eu vou retomar essa demanda, no momento, estou vendo outra tarefa. Mas se quiser fazer o teste, no Anexo que eu coloquei, informei os dados fictícios, com estes dados já consegue fazer os testes.
HelioNeto Postado 13 Setembro, 2023 Autor Postado 13 Setembro, 2023 @Victor H. Gonzales - Panda Consegui auxilio do pessoal do Bradesco e o Problema não é na minha credencial, eu estava enviando uma informação incorreta. Agora para tentar solucionar a assinatura, testei todos os tipos de assinatura que encontrei na ACBr: DFeSSL.CalcHashArquivo('request.txt', dgstSHA256, outBase64, True); //usando o PFX. ACBrEAD.CalcularAssinaturaArquivo('request.txt', dgstSHA256, outBase64); //usando o PEM na função ACBrEADGetChavePrivada. ACBrOpenSSLUtils.CalcHashFromFile('request.txt', algSHA256, sttBase64, True) //usando o PEM passando ele LoadPrivateKeyFromFile. Todas elas a Assinatura fica diferente do comando via LINUX passado via Manual de integração: echo -n "$(cat request.txt)" openssl dgst -sha256 -keyform pem -sign certificado.pem | base64 | tr -d '=[:space:]' | tr '+/' '-_' Na pasta eu tenho o certificado.pem e o arquivo request.txtrequest.txt Está ocorrendo erro de assinatura pois essa assinatura não está sendo validada pelo Bradesco.
Lucio Bittes Postado 19 Setembro, 2023 Postado 19 Setembro, 2023 Boa tarde. Conseguiu resolver a assinatura?
Lucio Bittes Postado 26 Outubro, 2023 Postado 26 Outubro, 2023 Boa tarde. Alguem conseguiu dar andamento no processo do boleto?
Membros Pro Ronaldo Negreiros Danieli Postado 30 Outubro, 2023 Membros Pro Postado 30 Outubro, 2023 Em 13/09/2023 at 16:09, HelioNeto disse: @Victor H. Gonzales - Panda Consegui auxilio do pessoal do Bradesco e o Problema não é na minha credencial, eu estava enviando uma informação incorreta. Agora para tentar solucionar a assinatura, testei todos os tipos de assinatura que encontrei na ACBr: DFeSSL.CalcHashArquivo('request.txt', dgstSHA256, outBase64, True); //usando o PFX. ACBrEAD.CalcularAssinaturaArquivo('request.txt', dgstSHA256, outBase64); //usando o PEM na função ACBrEADGetChavePrivada. ACBrOpenSSLUtils.CalcHashFromFile('request.txt', algSHA256, sttBase64, True) //usando o PEM passando ele LoadPrivateKeyFromFile. Todas elas a Assinatura fica diferente do comando via LINUX passado via Manual de integração: echo -n "$(cat request.txt)" openssl dgst -sha256 -keyform pem -sign certificado.pem | base64 | tr -d '=[:space:]' | tr '+/' '-_' Na pasta eu tenho o certificado.pem e o arquivo request.txtrequest.txt Está ocorrendo erro de assinatura pois essa assinatura não está sendo validada pelo Bradesco. Pode estar ficando diferente por conta dos comandos "tr" no final. tr -d '=[:space:]' nesse trecho são retirados todos os espaços e simbolos de = tr '+/' '-_' e aqui o comando substitui + por - e / por _
Jhonlenon Ribeiro Postado 11 Dezembro, 2023 Postado 11 Dezembro, 2023 HelioNeto Boa tarde...vc fez alguma atualização na unit do Bradesco? pode disponbilizar aqui....estou com as credenciais do Bradesco pra mim testar.
HelioNeto Postado 12 Dezembro, 2023 Autor Postado 12 Dezembro, 2023 @Jhonlenon Ribeiro Bom dia! Consegui fazer utilizando JavaScript via Postman, tiveram pessoas que me falaram que resolveram em PHP e C# Eu parei essa implementação com o Boleto Hibrido do Bradesco no Delphi, acredito que eu venha retomar só ano que vêm. Mas a princípio, não consegui fazer funcionar a parte da assinatura com o OpenSSL diretamente pelo Delphi, instanciando as funções da DLL. Ainda não tive uma conclusão mas a princípio o problema é na Forma de Assinar estando no S.O Windows, comparando ao S.O Linux, quando o Servidor do Bradesco vai Descriptografar acusa o erro.
Jhonlenon Ribeiro Postado 12 Dezembro, 2023 Postado 12 Dezembro, 2023 HelioNeto Entendi...é complicado trabalhar com esse tipo de assinatura no Delphi...eu já fiz uma integração com a outra API de Emissão de Boleto do Bradesco antigo....eu mais alguns colegas compramos uma DLL que assinava o json...até hoje ela funciona...mais não tem o boleto hibrido PIX....vou dá uma olhada no seu código...caso consigo sucesso posto aqui pra vc e para os outros...
Membros Pro Ronaldo Negreiros Danieli Postado 12 Dezembro, 2023 Membros Pro Postado 12 Dezembro, 2023 23 horas atrás, Jhonlenon Ribeiro disse: HelioNeto Boa tarde...vc fez alguma atualização na unit do Bradesco? pode disponbilizar aqui....estou com as credenciais do Bradesco pra mim testar. Você conseguiu as credenciais com o gerente ou precisou ligar em algum 0800? Eu tentei com meu gerente aqui e ele não conseguiu.
Recommended Posts