Painel de líderes
Conteúdo popular
Showing content with the highest reputation on 13-08-2023 em todas as áreas
-
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.zip1 ponto
-
Olá, estou homologando o SiTEF, com o componente ACBrTEFAPI. Porém quando configuramos para recebimento por PIX, exibir o QrCode na tela ou imprimir, os parâmetros adicionais estão sendo enviados de forma que retorna um erro. Atualmente está sendo enviado neste formato: ParamAdic: [10;18;27;28;35;44;{DevolveStringQRCode=1}] Em contado com a SiTEF, comentaram que o formato correto, deveria ser: ParamAdic: [10;18;27;28;35;44];{DevolveStringQRCode=1} Fiz o ajuste no arquivo ACBrTEFAPICliSiTef.pas, e estou subindo ele aqui para analisarem se é possível subir ao repositório. O que foi alterado, é a partir da linha 896 em diante. // Convertendo para formato de parâmetro, conforme esperado if (SL.Count > 0) then begin Restricoes := StringReplace(Trim(SL.Text), sLineBreak, ';', [rfReplaceAll]); if Restricoes <> '' then Restricoes := '['+Restricoes+']'; if fParamAdicConfig.Count > 0 then Restricoes := Restricoes + ';'+ Trim(fParamAdicConfig.Text); if (Restricoes <> '') then fParamAdicFuncao.Add( Restricoes ); end; ACBrTEFAPICliSiTef.pas1 ponto