Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 855 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Pessoal

Neste topico 

Parece que tinha solução para API do banco inter. 

 

Vejo o site dos cara eles fizeram favor de mudar a forma que fala com a API, antes geravam um arquivo certificado e agora aponta pra outo endereço https://developers.bancointer.com.br/reference/token-1

 

Me tire uma duvida basedo neste link como que faço pra passar os parametros corretos no postman por exemplo? Onde devo informar 

client_id e client_secret e scope 

 

 

Postado (editado)
13 horas atrás, johnbh3 disse:

Eu até consegui pegar o token

 

Agora eu n seu como pegar os boletos pelo postman conforme documentação : https://developers.bancointer.com.br/reference/pesquisarboletos

 

Onde eu passo esses 

QUERY PARAMS no postman? 

https://cdpj.partners.bancointer.com.br/cobranca/v2/boletos?dataInicial=2022-07-20&dataFinal=2022-07-21

isso é query params:

?dataInicial=2022-07-20&dataFinal=2022-07-21

o primeiro parametro é iniciado por "?" os proximos iniciam com "&"

ai vem o NomeDoParametro=ValorDoParametro

Editado por datilas
Postado
13 horas atrás, johnbh3 disse:

Eu até consegui pegar o token

 

Agora eu n seu como pegar os boletos pelo postman conforme documentação : https://developers.bancointer.com.br/reference/pesquisarboletos

 

Onde eu passo esses 

QUERY PARAMS no postman? 

 

image.thumb.png.a1d4481aedc6f487fb192fd4204d7ebd.png

No caso você só precisa testar se nas rotas de geração de token ou de consulta de boletos usam form-data ou form-urlencoded

Isso porque no link da documentação que você enviou o título é form-data mas no exemplo cURL que eles disponibilizam informam urlencoded 

😅 Vai entender. API do Inter ainda tem que evoluir muito.

Postado (editado)

Bom dia

 

Ainda mechendo no componente do post 

 

 

 

Consegui avançar um pouco !

 

Consigui recuperar o boleto  e gerar o PDF dele.

Mas o endpoint de envio do boleto da erro - ao chamar a GerarBoleto

 

Porem o envio do boleto retorna erro:

HTTP/1.0 400 Bad Request
{"status":400,"title":"Falha durante a execução da request","detail":"Verifique se os dados informados estão de acordo com a documentação disponibilizada e tente novamente","violacoes":[{"razao":"O valor requerido no Body não foi informado","propriedade":"body"}]}
Código de retorno: 400

 

 

O json gerado fica assim

'{'#$D#$A'  "pagador":{'#$D#$A'    "cnpjCpf":"01281218000124",'#$D#$A'    "nome":"BIO MOVEIS E DECORACOES LTDA - ME",'#$D#$A'    "email":"",'#$D#$A'    "telefone":"",'#$D#$A'    "cep":"09133000",'#$D#$A'    "numero":"552",'#$D#$A'    "complemento":"",'#$D#$A'    "bairro":"VILA GUARARA",'#$D#$A'    "cidade":"S�O PAULO",'#$D#$A'    "uf":"SP",'#$D#$A'    "endereco":"EST DO PEDROSO",'#$D#$A'    "ddd":"",'#$D#$A'    "tipoPessoa":"FISICA"'#$D#$A'  },'#$D#$A'  "dataEmissao":"2022-07-23",'#$D#$A'  "seuNumero":"1377",'#$D#$A'  "dataVencimento":"2022-07-19",'#$D#$A'  "mensagem":{'#$D#$A'    "linha1":"",'#$D#$A'    "linha2":"",'#$D#$A'    "linha3":"",'#$D#$A'    "linha4":"",'#$D#$A'    "linha5":""'#$D#$A'  },'#$D#$A'  "desconto1":{'#$D#$A'    "codigoDesconto":"NAOTEMDESCONTO",'#$D#$A'    "taxa":0,'#$D#$A'    "valor":0,'#$D#$A'    "data":""'#$D#$A'  },'#$D#$A'  "desconto2":{'#$D#$A'    "codigoDesconto":"NAOTEMDESCONTO",'#$D#$A'    "taxa":0,'#$D#$A'    "valor":0,'#$D#$A'    "data":""'#$D#$A'  },'#$D#$A'  "desconto3":{'#$D#$A'    "codigoDesconto":"NAOTEMDESCONTO",'#$D#$A'    "taxa":0,'#$D#$A'    "valor":0,'#$D#$A'    "data":""'#$D#$A'  },'#$D#$A'  "valorNominal":64.87,'#$D#$A'  "valorAbatimento":0,'#$D#$A'  "multa":{'#$D#$A'    "codigoMulta":"NAOTEMMULTA",'#$D#$A'    "data":"",'#$D#$A'    "valor":0,'#$D#$A'    "taxa":0'#$D#$A'  },'#$D#$A'  "mora":{'#$D#$A'    "codigoMora":"ISENTO",'#$D#$A'    "data":"",'#$D#$A'    "valor":0,'#$D#$A'    "taxa":0'#$D#$A'  },'#$D#$A'  "cnpjCPFBeneficiario":"08030107000194",'#$D#$A'  "numDiasAgenda":"SESSENTA"'#$D#$A'}'

 

Logo apos passar na linha:   SJson := GenerateReadableText(js,i);

Por fim tenta enviar e da o erro no post 

   idhttp.Post('https://cdpj.partners.bancointer.com.br/cobranca/v2/boletos',JsonStreamEnvio,JsonStreamRetorno);

A proposito o codigo completo da unit

 

unit uBancoInter;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Controls, Vcl.Dialogs, Vcl.StdCtrls, IdServerIOHandler, IdSSL,
  IdSSLOpenSSL, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdCoderMIME,
  uLkJSON,XSuperObject;

const
  numDiasAgenda:array[0..2] of string = (
    'ZERO',
    'TRINTA',
    'SESSENTA');

  codigoDesconto:array[0..6] of string = (
     'NAOTEMDESCONTO',
     'VALORFIXODATAINFORMADA',
     'PERCENTUALDATAINFORMADA',
     'VALORANTECIPACAODIACORRIDO',
     'VALORANTECIPACAODIAUTIL',
     'PERCENTUALVALORNOMINALDIACORRIDO',
     'PERCENTUALVALORNOMINALDIAUTIL');

  codigoMulta:array[0..2] of string = (
     'NAOTEMMULTA',
     'VALORFIXO',
     'PERCENTUAL');

  codigoMora:array[0..2] of string = (
     'VALORDIA',
     'TAXAMENSAL',
     'ISENTO');

  filtaPor:array[0..3] of string = (
     'PAGOS',
     'EXPIRADOS',
     'VENCIDOSAVENCER',
     'TODOSBAIXADOS');

  ordenarPor:array[0..6] of string = (
     'NOSSONUMERO',
     'DATAVENCIMENTO_DSC',
     'NOMESACADO',
     'VALOR_ASC',
     'VALOR_DSC',
     'STATUS_ASC',
     'STATUS_DS');

  codigoBaixa:array[0..7] of string = (
     'ACERTOS',
     'PROTESTADO',
     'DEVOLUCAO',
     'PROTESTOAPOSBAIXA',
     'PAGODIRETOAOCLIENTE',
     'SUBISTITUICAO',
     'FALTADESOLUCAO',
     'APEDIDODOCLIENTE');

  diasBaixas:array[0..3] of string = (
    'Hoje',
    'SeteDias',
    'QuinzeDias',
    'TrintaDias');



type

  TVariantArray = array of array of variant;

  TipoData = (
    Vencimento,
    Emissao);

  TipoSituacao = (
    Pagos,
    Expirados,
    VencidosAVencer,
    TodosBaixados
  );

  TipoDiasBaixa = (
    Hoje,
    SeteDias,
    QuinzeDias,
    TrintaDias);

  TipoBaixa = (
    Acertos,
    Protestado,
    Devolucao,
    ProtestoAposBaixa,
    PagoDiretoAoCliente,
    Subistituicao,
    FaltaDeSolucao,
    APedidoDoCliente);

  TipoOrdem = (
     NossoNumero,
     DataVencimento_DSC,
     NomeSacado,
     Valor_ASC,
     Valor_DSC,
     Status_ASC,
     Status_DS);



  TipoMora = (
    ValorDia,
    TaxaMensal,
    Isento);

  TipoMulta = (
    NaoTemMulta,
    ValorFixo,
    Percentual);

  TipoDesconto = (
     NaoTemDesconto,
     ValorFixoDataInformada,
     PercentualDataInformada,
     ValorAntecipadoDiaCorrido,
     ValorAntecipadoDiaUtil,
     PercentualValorNominalDiaCorrido,
     PercentualValorNominalDiaUtil);

  TipoAgenda = (
    Zero,
    Trinta,
    Sessenta);

  TipoPessoa = (
    Fisica,
    Juridica);





TPagador = Class(Tcomponent)
    private
      ftipopessoa:TipoPessoa;
      fnome:string; // max 100
      fendereco:string; //max 90
      fnumero:string; // max 10
      fcomplemento:string; //max 30
      fbairro:string; // max 60
      fcidade:string;
      fuf:string;
      fcep:string; // max 8
      fcnpjCPF:string;
      femail:string; // max 50
      fddd:string; // max 2
      ftelefone:string; //max 9
    public
    published
      property TipoPessoa:TipoPessoa read ftipopessoa write ftipopessoa;
      property Nome:string read fnome write fnome;
      property Endereco:string read fendereco write fendereco;
      property Numero:string read fnumero write fnumero;
      property Complemento:string read fcomplemento write fcomplemento;
      property Bairro:string read fbairro write fbairro;
      property UF:string read fuf write fuf;
      property CEP:string read fcep write fcep;
      property CNPJ_CPF:string read fcnpjCPF write fcnpjCPF;
      property Email:string read femail write femail;
      property Telefone:string read ftelefone write ftelefone;
      property DDD:string read fddd write fddd;
      property Cidade:string read fcidade write fcidade;

 End;




TDesconto1 = Class(TComponent)
  private
    fcodigodesc:TipoDesconto;
    fdatadesc:tdate;
    ftaxa:double;
    fvalor:double;
  public
  published
    property CodigoDesconto:TipoDesconto read fcodigodesc write fcodigodesc;
    property DataDesconto:tdate read fdatadesc write fdatadesc;
    property Taxa:double read ftaxa write ftaxa;
    property Valor:double read fvalor write fvalor;
End;

TDesconto2 = Class(TComponent)
  private
    fcodigodesc:TipoDesconto;
    fdatadesc:tdate;
    ftaxa:double;
    fvalor:double;
  public
  published
    property CodigoDesconto:TipoDesconto read fcodigodesc write fcodigodesc;
    property DataDesconto:tdate read fdatadesc write fdatadesc;
    property Taxa:double read ftaxa write ftaxa;
    property Valor:double read fvalor write fvalor;
End;

TDesconto3 = Class(TComponent)
  private
    fcodigodesc:TipoDesconto;
    fdatadesc:tdate;
    ftaxa:double;
    fvalor:double;
  public
  published
    property CodigoDesconto:TipoDesconto read fcodigodesc write fcodigodesc;
    property DataDesconto:tdate read fdatadesc write fdatadesc;
    property Taxa:double read ftaxa write ftaxa;
    property Valor:double read fvalor write fvalor;
End;







 //Classe responsavel por retornar uma lista de boletos gerando a patir de um dia após


 //Classe responsavel por recuperar os dados do Boleto detalhado
 TDadosDoBoleto = class(Tcomponent)
   public
   private

   protected
   published
 end;



 //Classe responsavel por baixar um boleto no formato pdf em base64
 TPDFdoBoleto = class(Tcomponent)
   public
   private
     fNossoNumero:string;
   protected
   published
    property NossoNumero: String read fNossoNumero write fNossoNumero;
 end;

 TMesangem = class(Tcomponent)
   public
   private
     fmensagem1,fmensagem2,fmensagem3,fmensagem4,fmensagem5:string;
   protected
   published
     //maximo 78 caracteres por mensagem
     property Mensagem1: String read fMensagem1 write fMensagem1;
     property Mensagem2: String read fMensagem2 write fMensagem2;
     property Mensagem3: String read fMensagem3 write fMensagem3;
     property Mensagem4: String read fMensagem4 write fMensagem4;
     property Mensagem5: String read fMensagem5 write fMensagem5;

 end;





 TMulta = class(Tcomponent)
   public
   private
     fcodigoMulta:TipoMulta;
     fdata:tdate;
     ftaxa:double;
     fvalor:double;
   protected
   published
     property CodigoMulta: TipoMulta read fcodigoMulta write fcodigoMulta;
     property DataAContar: Tdate read fdata write fdata;
     property Taxa: double read ftaxa write ftaxa;
     property Valor: double read fvalor write fvalor;
 end;

 TMora = class(Tcomponent)
   public
   private
     fcodigoMora:TipoMora;
     fdata:tdate;
     ftaxa:double;
     fvalor:double;
   protected
   published
     property CodigoMora: TipoMora read fcodigoMora write fcodigoMora;
     property DataAContar: Tdate read fdata write fdata;
     property Taxa: double read ftaxa write ftaxa;
     property Valor: double read fvalor write fvalor;
 end;


 TCertificado = class(Tcomponent)
   private
     fcertfile:string;
     fkeyfile:string;
     frootcertfile:string;
   published
     property CertFile:string read fcertfile write fcertfile;
     property KeyFile:string read fkeyfile write fkeyfile;
     property RootCertFile:string read frootcertfile write frootcertfile;
 end;

//Classe resposavel por gerar novo boleto no banco
 TBancoInter = class(Tcomponent)
   private
     fconta:string;
     fseuNumero:string;  //15 maximo
     fvalorNorminal:double;
     fvalorAbatimento:double;
     fDataEmissao:Tdate;
     fDataVencimento:Tdate;
     fpagador:TPagador;
     fmensagem:TMesangem;
     fmulta:TMulta;
     fmora:TMora;
     //fdataLimite:TipoAgenda;
     fdesconto1:TDesconto1;
     fdesconto2:TDesconto2;
     fdesconto3:TDesconto3;
     fCodigoBarras:string;
     fLinhaDigitavel:string;
     fNossoNumero:string;
     fcpf_cnpj:string;
     fnumDiasAgenda:TipoAgenda;
     fcertificado:TCertificado;
     fSitpagamento:string;
     fSituacao:string;
     fValorPago:double;
     fDataPagamento:tdate;


     function MontaDados:Tstringlist;

   public
     constructor Create( AOwner : TComponent); override;
     Destructor Destroy; override ;
     Function GerarBoleto:TStringList;
     function GetCodigoBarras:string;
     function GetLinhaDigitavel:string;
     function GetNossoNumero:string;

     //Consulta Pagamento
     procedure Consulta(NossoNumero:string);
     

     function ConsultaLita(FiltraPorSituacao:TipoSituacao;FiltrarPorData:TipoData;FiltrarDias:TipoDiasBaixa):Tstringlist;
     function ConsultaUmBoleto(NossoNumero:string):Tstringlist;
     procedure BaixaBoleto(NossoNumero:string;CodigoBaixa:TipoBaixa);
     procedure RecuperaBoletoPDF(NossoNumero,LocalPath:string);



   protected
   published

     property NumeroConta: String read fconta write fconta;
     property CPF_CNPJ_Beneficiario:string read fcpf_cnpj write fcpf_cnpj;
     property SeuNumero: String read fseuNumero write fseuNumero;
     property ValorNorminal: double read fvalorNorminal write fvalorNorminal;
     property ValorAbatimento: double read fvalorAbatimento write fvalorAbatimento;
     property DataEmissao: Tdate read fDataEmissao write fDataEmissao;
     property Vencimento: Tdate read fDataVencimento write fDataVencimento;
     //property DataLimite: TipoAgenda read fdataLimite write fdataLimite;

     property Pagador: TPagador read fpagador write fpagador ;
     property Mensagem: TMesangem read fMensagem write fmensagem ;
     property Multa: TMulta read fmulta write fmulta;
     property Mora: TMora read fmora write fmora ;
     property Desconto1:TDesconto1 read fdesconto1 write fdesconto1;
     property Desconto2:TDesconto2 read fdesconto2 write fdesconto2;
     property Desconto3:TDesconto3 read fdesconto3 write fdesconto3;
     property NumDiasAgenda:TipoAgenda read fnumDiasAgenda write fnumDiasAgenda;
     property Certificado:TCertificado read fcertificado write fcertificado;


 end;


function RetCodigoDesconto(valor:TipoDesconto):string;
function RetCodigoBaixa(valor:TipoBaixa):string;
function RetTipoOrdem(valor:TipoOrdem):string;

function RetCodigoMora(valor:TipoMora):string;
function RetCodigoMulta(valor:TipoMulta):string;
function RetDiasAgenda(valor:TipoAgenda):string;
function RetData(data:tdate):string;
function strzero(valor1:integer;valor2:integer):string;
function numdos(valor:double):string;
function RetTipoPessoa(valor:TipoPessoa):string;
function RetSituacao(valor:TipoSituacao):string;
function RetDataFiltro(valor:TipoData):string;
procedure ConfiguraSSl(ConfSSL:TIdSSLIOHandlerSocketOpenSSL;ArqCertFile,ArqKeyFile:string);
Procedure ConfiguraIndy(ConfInd:TIdHTTP;NumConta:string);


procedure Register;


implementation

procedure Register;
begin
  RegisterComponents('Aprendendo', [TBancoInter]);
end;




function numdos(valor:double):string;
var
vtexto,resultado:string;
begin
 vtexto    := FloatToStr(valor);
 resultado := StringReplace(vtexto,'.','',[rfReplaceAll]);
 resultado := StringReplace(resultado,',','.',[rfReplaceAll]);
 result    := trim(resultado);
end;


procedure ConfiguraSSl(ConfSSL:TIdSSLIOHandlerSocketOpenSSL;ArqCertFile,ArqKeyFile:string);
begin
  //configurando o soketssl
  with ConfSSL.SSLOptions do
    begin
      Method       := sslvSSLv23;
      SSLVersions  := [sslvSSLv23];
      CertFile     := ArqCertFile;
      KeyFile      := ArqKeyFile;
    end;

end;


Procedure ConfiguraIndy(ConfInd:TIdHTTP;NumConta:string);
begin
  ConfInd.HandleRedirects:=True;

  with confind.Request.CustomHeaders do
    begin
      Clear;
      Values['Authorization'] := 'Bearer bddsss7e-a749-4cce-9dfe-b30fdfdfdac7e446';

    end;

 {
  with confind.Request.CustomHeaders do
    begin
      Clear;
      Add('Content-Type: application/json');
    /Add('x-inter-conta-corrente: '+NumConta);
    end;
  }
end;


function strzero(valor1:integer;valor2:integer):string;
var
monta:string;
tira,ia:integer;
begin
  if valor2=0 then
     begin
       result:='';
       exit;
     end;
  monta:=trim(inttostr(valor1));
  tira:=length(monta);
  if tira>valor2 then
     result := inttostr(valor1);
  tira:=valor2-tira;
  monta:='';
  for ia:=1 to tira do
    monta:=monta+'0';
  monta:=monta+trim(inttostr(valor1));
  result := monta
end;


function RetData(data:tdate):string;
var
year,month,day:word;
begin
  DecodeDate(data,year,month,day);
  if year<2021 then
     result := ''
  else
     result := strzero(year,4)+ '-' + strzero(month,2) + '-' + strzero(day,2);
end;

function RetTipoOrdem(valor:TipoOrdem):string;
begin
  case valor of
   NossoNumero:        result := ordenarPor[0] ;
   DataVencimento_DSC: result := ordenarPor[1] ;
   NomeSacado:         result := ordenarPor[2] ;
   Valor_ASC:          result := ordenarPor[3] ;
   Valor_DSC:          result := ordenarPor[4] ;
   Status_ASC:         result := ordenarPor[5] ;
   Status_DS:          result := ordenarPor[6] ;
  end;
end;



function RetSituacao(valor:TipoSituacao):string;
begin
  case valor of
   Pagos:           result := filtaPor[0];
   Expirados:       result := filtaPor[1];
   VencidosAVencer: result := filtaPor[2];
   TodosBaixados:   result := filtaPor[3];
  end;
end;

function RetCodigoMora(valor:TipoMora):string;
begin
  case valor of
   ValorDia: result   := codigoMora[0];
   TaxaMensal: result := codigoMora[1];
   Isento: result     := codigoMora[2];
  end;
end;

function RetCodigoMulta(valor:TipoMulta):string;
begin
  case valor of
   NaoTemMulta: result := codigoMulta[0];
   ValorFixo:   result := codigoMulta[1];
   Percentual:  result := codigoMulta[2];
  end;
end;

function RetDiasAgenda(valor:TipoAgenda):string;
begin
  case valor of
   Zero:     result := numDiasAgenda[0];
   Trinta:   result := numDiasAgenda[1];
   Sessenta: result := numDiasAgenda[2];
  end;
end;

function RetDataFiltro(valor:TipoData):string;
begin
  case valor of
    Vencimento: result := 'VENCIMENTO' ;
    Emissao:    result := 'EMISSAO';
  end;
end;



function RetCodigoBaixa(valor:TipoBaixa):string;
begin
  case valor  of
   Acertos:             result := codigoBaixa[0];
   Protestado:          result := codigoBaixa[1];
   Devolucao:           result := codigoBaixa[2];
   ProtestoAposBaixa:   result := codigoBaixa[3];
   PagoDiretoAoCliente: result := codigoBaixa[4];
   Subistituicao:       result := codigoBaixa[5];
   FaltaDeSolucao:      result := codigoBaixa[6];
   APedidoDoCliente:    result := codigoBaixa[7];
  end;
end;


function RetCodigoDesconto(valor:TipoDesconto):string;
begin
  case valor of
   NaoTemDesconto:                   result := codigoDesconto[0];
   ValorFixoDataInformada:           result := codigoDesconto[1];
   PercentualDataInformada:          result := codigoDesconto[2];
   ValorAntecipadoDiaCorrido:        result := codigoDesconto[3];
   ValorAntecipadoDiaUtil:           result := codigoDesconto[4];
   PercentualValorNominalDiaCorrido: result := codigoDesconto[5];
   PercentualValorNominalDiaUtil:    result := codigoDesconto[6];
  end;
end;


function RetTipoPessoa(valor:TipoPessoa):string;
begin
  case valor of
   Fisica: result := 'FISICA' ;
   Juridica: result := 'JURIDICA' ;
  end;
end;


{ TBancoInter }

procedure TBancoInter.BaixaBoleto(NossoNumero: string; CodigoBaixa: TipoBaixa);
var
  SJson,StringBaixa:string;
  DadosJson:TStringList;
  JsonStreamRetorno,JsonStreamEnvio : TStringStream;
  idHttp:TIdHTTP;
  SoketSSL:TIdSSLIOHandlerSocketOpenSSL;
  i:integer;

begin
  StringBaixa := NossoNumero+'/baixas';

  JsonStreamRetorno := TStringStream.Create;
  idHttp            := tidHttp.Create(self);
  SoketSSL          := TIdSSLIOHandlerSocketOpenSSL.Create(self);
  SJson             :='{"codigoBaixa":"'+RetCodigoBaixa(CodigoBaixa)+'"}';
  JsonStreamEnvio   := TStringStream.Create(SJson);

  //configurando o soketssl
  ConfiguraSSl(SoketSSL,Certificado.CertFile,Certificado.KeyFile);


  //linkando o soketssl ao idhttp
  idHttp.IOHandler  := SoketSSL;
  ConfiguraIndy(IdHTTP,NumeroConta);

  //enviando via https
  DadosJson := TStringList.Create;
  try
     idhttp.Post('https://apis.bancointer.com.br/openbanking/v1/certificado/boletos/'+StringBaixa,JsonStreamEnvio,JsonStreamRetorno);


    except
     on E:EIdHTTPProtocolException do
       DadosJson.Add(IdHTTP.ResponseText+#13#10+e.ErrorMessage)
     else
       showexception(exceptobject, exceptaddr);
    end;

    if IdHTTP.ResponseCode<>204 then
       begin
         DadosJson.Add('Código de retorno: '+inttostr(IdHTTP.ResponseCode));
         DadosJson.Add('');
       end;

    if JsonStreamRetorno.DataString<>'' then
       DadosJson.add(JsonStreamRetorno.DataString);


    if IdHTTP.ResponseCode<>204 then
       begin
         DadosJson.Add('Transação não pode ser inicada ('+inttostr(IdHTTP.ResponseCode)+').');
         showmessage(DadosJson.Text);
         DadosJson.Clear;
       end;

  JsonStreamRetorno.Free;
  JsonStreamEnvio.Free;
  SoketSSL.Free;
  idHttp.Free;

end;

procedure TBancoInter.Consulta(NossoNumero: string);
begin

end;

function TBancoInter.ConsultaLita(FiltraPorSituacao:TipoSituacao;FiltrarPorData:TipoData;FiltrarDias:TipoDiasBaixa):Tstringlist;
var
  DadosJson:TStringList;
  JsonStreamRetorno : TStringStream;
  idHttp:TIdHTTP;
  SoketSSL:TIdSSLIOHandlerSocketOpenSSL;
  i:integer;
  montaconsulta,SJson:string;
  js:TlkJSONobject;

begin

  JsonStreamRetorno := TStringStream.Create;
  idHttp            := tidHttp.Create(self);
  SoketSSL          := TIdSSLIOHandlerSocketOpenSSL.Create(self);

  //configurando o soketssl
  ConfiguraSSl(SoketSSL,Certificado.CertFile,Certificado.KeyFile);


  //linkando o soketssl ao idhttp
  idHttp.IOHandler  := SoketSSL;
  ConfiguraIndy(IdHTTP,NumeroConta);

  //enviando via https
  DadosJson := TStringList.Create;
  try
     montaconsulta := 'filtrarPor=' + RetSituacao(FiltraPorSituacao);
     montaconsulta := montaconsulta + '&filtrarDataPor=' + RetDataFiltro(FiltrarPorData);

     if FiltrarDias=Hoje then
        montaconsulta := montaconsulta + '&dataInicial='+RetData(now)
     else if FiltrarDias=SeteDias then
        montaconsulta := montaconsulta + '&dataInicial='+RetData(date - 7)
     else if FiltrarDias=QuinzeDias then
        montaconsulta := montaconsulta + '&dataInicial='+RetData(date - 15)
     else if FiltrarDias=TrintaDias then
        montaconsulta := montaconsulta + '&dataInicial='+RetData(date - 30);
     montaconsulta := montaconsulta + '&dataFinal=' + RetData(date + 30);

     IdHTTP.Get('https://cdpj.partners.bancointer.com.br/cobranca/v2/boletos?'+montaconsulta,JsonStreamRetorno);

    except
     on E:EIdHTTPProtocolException do
       DadosJson.Add(IdHTTP.ResponseText+#13#10+e.ErrorMessage)
     else
       showexception(exceptobject, exceptaddr);
    end;

    if IdHTTP.ResponseCode<>200 then
       begin
         DadosJson.Add('Código de retorno: '+inttostr(IdHTTP.ResponseCode));
         DadosJson.Add('');
       end;

    if JsonStreamRetorno.DataString<>'' then
       DadosJson.add(JsonStreamRetorno.DataString);


    if IdHTTP.ResponseCode<>200 then
       begin
         DadosJson.Add('Transação não pode ser inicada ('+inttostr(IdHTTP.ResponseCode)+').');
         showmessage(DadosJson.Text);
         DadosJson.Clear;
       end
    else
       begin
          //aqui tratamos os dados recebidos
          js := TlkJSON.ParseText(DadosJson.Text) as TlkJSONobject;
          i:=0;
          SJson := GenerateReadableText(js,i);
          DadosJson.Clear;
          DadosJson.Add(SJson);

          //result.Add(SJson);
       end;
  result := DadosJson;
  JsonStreamRetorno.Free;
  SoketSSL.Free;
  idHttp.Free;
end;

function TBancoInter.ConsultaUmBoleto(NossoNumero: string): Tstringlist;
var
  DadosJson:TStringList;
  JsonStreamRetorno : TStringStream;
  idHttp:TIdHTTP;
  SoketSSL:TIdSSLIOHandlerSocketOpenSSL;
  i:integer;
  SJson:string;
  js:TlkJSONobject;

begin

  JsonStreamRetorno := TStringStream.Create;
  idHttp            := tidHttp.Create(self);
  SoketSSL          := TIdSSLIOHandlerSocketOpenSSL.Create(self);

  //configurando o soketssl
  ConfiguraSSl(SoketSSL,Certificado.CertFile,Certificado.KeyFile);


  //linkando o soketssl ao idhttp
  idHttp.IOHandler  := SoketSSL;
  ConfiguraIndy(IdHTTP,NumeroConta);

  //enviando via https
  DadosJson := TStringList.Create;
  try

     IdHTTP.Get('https://cdpj.partners.bancointer.com.br/cobranca/v2/boletos/' + NossoNumero,JsonStreamRetorno);

    except
     on E:EIdHTTPProtocolException do
       DadosJson.Add(IdHTTP.ResponseText+#13#10+e.ErrorMessage)
     else
       showexception(exceptobject, exceptaddr);
    end;

    if IdHTTP.ResponseCode<>200 then
       begin
         DadosJson.Add('Código de retorno: '+inttostr(IdHTTP.ResponseCode));
         DadosJson.Add('');
       end;

    if JsonStreamRetorno.DataString<>'' then
       DadosJson.add(JsonStreamRetorno.DataString);


    if IdHTTP.ResponseCode<>200 then
       begin
         DadosJson.Add('Transação não pode ser inicada ('+inttostr(IdHTTP.ResponseCode)+').');
         showmessage(DadosJson.Text);
         DadosJson.Clear;
       end
    else
       begin
          //aqui tratamos os dados recebidos
          js := TlkJSON.ParseText(DadosJson.Text) as TlkJSONobject;
          i:=0;
          SJson := GenerateReadableText(js,i);
          DadosJson.Clear;
          DadosJson.Add(SJson);

          //result.Add(SJson);
       end;
  result := DadosJson;
  JsonStreamRetorno.Free;
  SoketSSL.Free;
  idHttp.Free;
end;

constructor TBancoInter.Create(AOwner: TComponent);
begin
  inherited;
  fpagador := TPagador.Create(SELF);
  fpagador.Name:='Pagador';
  fpagador.SetSubComponent(true);

  fmensagem := TMesangem.Create(self);
  fmensagem.Name := 'Mensagem';
  fmensagem.SetSubComponent(true);

  fmulta := TMulta.Create(self);
  fmulta.Name := 'Multa';
  fmulta.SetSubComponent(true);

  fmora := TMora.Create(self);
  fmora.Name := 'Mora';
  fmora.SetSubComponent(true);



  fdesconto1 := TDesconto1.Create(self);
  fdesconto1.Name:='Desconto1';
  fdesconto1.SetSubComponent(true);

  fdesconto2 := TDesconto2.Create(self);
  fdesconto2.Name:='Desconto2';
  fdesconto2.SetSubComponent(true);

  fdesconto3 := TDesconto3.Create(self);
  fdesconto3.Name:='Desconto3';
  fdesconto3.SetSubComponent(true);

  

  fcertificado := TCertificado.Create(self);
  fcertificado.Name:='Certificado';
  fcertificado.SetSubComponent(true);



end;

destructor TBancoInter.Destroy;
begin
  fmora.Free;
  fpagador.Free;
  fmensagem.Free;
  fmulta.Free;
  fdesconto1.Free;
  fdesconto2.Free;
  fdesconto3.Free;
  inherited;
end;





function TBancoInter.GerarBoleto: TStringList;
var
  DadosEnvio:TStringList;
  JsonStreamRetorno, JsonStreamEnvio: TStringStream;
  idHttp:TIdHTTP;
  SoketSSL:TIdSSLIOHandlerSocketOpenSSL;
  i:integer;
  js:TlkJSONobject;
  SJson:string;
  ws: TlkJSONstring;

begin
  idHttp            := tidHttp.Create(self);
  SoketSSL          := TIdSSLIOHandlerSocketOpenSSL.Create(self);

  //linkando o soketssl ao idhttp
  ConfiguraSSl(SoketSSL,Certificado.CertFile,Certificado.KeyFile);
  idHttp.IOHandler  := SoketSSL;

  //enviando via https
  ConfiguraIndy(IdHTTP,NumeroConta);


  DadosEnvio        := TStringList.Create;
  JsonStreamRetorno := TStringStream.Create('');
  DadosEnvio.Text   := MontaDados.Text;
  js := TlkJSON.ParseText(Dadosenvio.Text) as TlkJSONobject;
  i:=0;
  SJson := GenerateReadableText(js,i);


  JsonStreamEnvio   := TStringStream.Create(SJson);

  //JsonStreamEnvio   := TStringStream.Create(DadosEnvio.Text);
  DadosEnvio.Clear;


 try
   idhttp.Post('https://cdpj.partners.bancointer.com.br/cobranca/v2/boletos',JsonStreamEnvio,JsonStreamRetorno);

 except
   on E:EIdHTTPProtocolException do
      DadosEnvio.Add(IdHTTP.ResponseText+#13#10+e.ErrorMessage)
    else
      showexception(exceptobject, exceptaddr);
 end;
 if idhttp.ResponseCode<>200 then
    begin
      DadosEnvio.Add('Código de retorno: '+inttostr(IdHTTP.ResponseCode));
      DadosEnvio.Add('');
    end;

 if JsonStreamRetorno.DataString<>'' then
    DadosEnvio.add(JsonStreamRetorno.DataString);

 if idhttp.ResponseCode=200 then
    begin
      js := TlkJSON.ParseText(DadosEnvio.Text) as TlkJSONobject;
      fCodigoBarras   := vartostr(js.Field['codigoBarras'].Value);
      fLinhaDigitavel := vartostr(js.Field['linhaDigitavel'].Value);
      fNossoNumero    := vartostr(js.Field['nossoNumero'].Value);
      js.Free;
    end;

 if IdHTTP.ResponseCode<>200 then
    showmessage('Transação não pode ser inicada ('+inttostr(IdHTTP.ResponseCode)+').');
 idHttp.Free;
 JsonStreamRetorno.Free;
 JsonStreamEnvio.Free;
 result := DadosEnvio;


end;

function TBancoInter.GetCodigoBarras: string;
begin
  result := fCodigoBarras;
end;



function TBancoInter.GetLinhaDigitavel: string;
begin
  result := fLinhaDigitavel;
end;

function TBancoInter.GetNossoNumero: string;
begin
  result := fNossoNumero;
end;



function TBancoInter.MontaDados: Tstringlist;
var
Dados:tstringlist;
begin
  Dados := TStringList.Create;
  // dados do pagador
  Dados.Add('{');
  Dados.Add('   "pagador":{');
  dados.Add('      "cnpjCpf":"' +  Pagador.CNPJ_CPF + '",');
  dados.Add('      "nome":"' + pagador.Nome + '",');
  dados.Add('      "email":"'  + pagador.Email + '",');
  dados.Add('      "telefone":"' + pagador.Telefone + '",');
  dados.Add('      "cep":"' + pagador.CEP + '",');
  dados.Add('      "numero":"' + pagador.Numero + '",');
  dados.Add('      "complemento":"' + pagador.Complemento + '",');
  dados.Add('      "bairro":"' + pagador.Bairro + '",');
  dados.Add('      "cidade":"' + pagador.Cidade + '",');
  dados.Add('      "uf":"' + pagador.UF + '",');
  dados.Add('      "endereco":"' + pagador.Endereco + '",');
  dados.Add('      "ddd":"' + pagador.DDD + '",');
  dados.Add('      "tipoPessoa":"' + RetTipoPessoa(pagador.TipoPessoa) + '"');
  Dados.Add('   },');

  //dados do boleto

  Dados.Add('   "dataEmissao":"' + RetData(fDataEmissao) + '",');
  Dados.Add('   "seuNumero":"' + SeuNumero + '",');
  //Dados.Add('   "dataLimite":"' + RetData(Vencimento) + '",');
  Dados.Add('   "dataVencimento":"' + RetData(Vencimento) + '",');

  //mensagem no boleto
  Dados.Add('   "mensagem":{');
  dados.Add('      "linha1":"' + Mensagem.Mensagem1 + '",');
  dados.Add('      "linha2":"' + Mensagem.Mensagem2 + '",');
  dados.Add('      "linha3":"' + Mensagem.Mensagem3 + '",');
  dados.Add('      "linha4":"' + Mensagem.Mensagem4 + '",');
  dados.Add('      "linha5":"' + Mensagem.Mensagem5 + '"');
  Dados.Add('   },');


  Dados.Add('   "desconto1":{');
  dados.Add('      "codigoDesconto":"' + RetCodigoDesconto(desconto1.CodigoDesconto) + '",');
  dados.Add('      "taxa":' + numdos(Desconto1.Taxa) +  ',');
  dados.Add('      "valor":' + numdos(Desconto1.Valor) + ',');
  dados.Add('      "data":"' + RetData(desconto1.DataDesconto) + '"');
  Dados.Add('   },');

  Dados.Add('   "desconto2":{');
  dados.Add('      "codigoDesconto":"' + RetCodigoDesconto(desconto2.CodigoDesconto) + '",');
  dados.Add('      "taxa":' + numdos(Desconto2.Taxa) +  ',');
  dados.Add('      "valor":' + numdos(Desconto2.Valor) + ',');
  dados.Add('      "data":"' + RetData(desconto2.DataDesconto) + '"');
  Dados.Add('   },');

  Dados.Add('   "desconto3":{');
  dados.Add('      "codigoDesconto":"' + RetCodigoDesconto(desconto3.CodigoDesconto) + '",');
  dados.Add('      "taxa":' + numdos(Desconto3.Taxa) +  ',');
  dados.Add('      "valor":' + numdos(Desconto3.Valor) + ',');
  dados.Add('      "data":"' + RetData(desconto3.DataDesconto) + '"');
  Dados.Add('   },');

  Dados.Add('   "valorNominal":' + numdos(ValorNorminal) + ',');
  Dados.Add('   "valorAbatimento":' + numdos(ValorAbatimento) + ',');


  //multa a ser aplicada
  Dados.Add('   "multa":{');
  dados.Add('      "codigoMulta":"' + RetCodigoMulta(multa.CodigoMulta) + '",');
  dados.Add('      "data":"' + RetData(multa.DataAContar) + '",');
  dados.Add('      "valor":' + numdos(multa.Valor) + ',');
  dados.Add('      "taxa":' + numdos(multa.Taxa) );
  Dados.Add('   },');

  //mora diaria
  Dados.Add('   "mora":{');
  dados.Add('      "codigoMora":"' + RetCodigoMora(mora.CodigoMora) + '",');
  dados.Add('      "data":"' + RetData(multa.DataAContar) + '",');
  dados.Add('      "valor":' + numdos(mora.Valor) + ',');
  dados.Add('      "taxa":' + numdos(mora.Taxa) );
  Dados.Add('   },');

  Dados.Add('   "cnpjCPFBeneficiario":"' + CPF_CNPJ_Beneficiario + '",');
  Dados.Add('   "numDiasAgenda":"' + RetDiasAgenda(NumDiasAgenda)  + '"');
  Dados.Add('}');
  result := dados;
end;


procedure TBancoInter.RecuperaBoletoPDF(NossoNumero, LocalPath: string);
var
  DadosJson:TStringList;
  JsonStreamRetorno : TStringStream;
  idHttp:TIdHTTP;
  SoketSSL:TIdSSLIOHandlerSocketOpenSSL;

  MStream:TMemoryStream;
  Decoder:TIdDecoderMIME;
  Base64: string;

begin

  JsonStreamRetorno := TStringStream.Create;
  idHttp            := tidHttp.Create(self);
  SoketSSL          := TIdSSLIOHandlerSocketOpenSSL.Create(self);

  //configurando o soketssl
  ConfiguraSSl(SoketSSL,Certificado.CertFile,Certificado.KeyFile);


  //linkando o soketssl ao idhttp
  idHttp.IOHandler  := SoketSSL;
  ConfiguraIndy(IdHTTP,NumeroConta);

  //enviando via https
  DadosJson := TStringList.Create;
  try

     IdHTTP.Get('https://cdpj.partners.bancointer.com.br/cobranca/v2/boletos/' + NossoNumero + '/pdf',JsonStreamRetorno);

    except
     on E:EIdHTTPProtocolException do
       DadosJson.Add(IdHTTP.ResponseText+#13#10+e.ErrorMessage)
     else
       showexception(exceptobject, exceptaddr);
    end;

    if IdHTTP.ResponseCode<>200 then
       begin
         DadosJson.Add('Código de retorno: '+inttostr(IdHTTP.ResponseCode));
         DadosJson.Add('');
         DadosJson.Add('Transação não pode ser inicada ('+inttostr(IdHTTP.ResponseCode)+').');
         showmessage(DadosJson.Text);
         DadosJson.Clear;
       end;

    if (IdHTTP.ResponseCode=200) and (JsonStreamRetorno.DataString<>'') then
       begin
         Decoder := TIdDecoderMIME.Create(nil);
         MStream := TMemoryStream.Create;
         Base64  := JsonStreamRetorno.DataString;
         Decoder.DecodeStream(Base64,MStream);
         MStream.SaveToFile(LocalPath+'\boleto-inter-' + NossoNumero + '.pdf');
         FreeAndNil(Decoder);
         FreeAndNil(MStream);
         ShowMessage('Boleto Baixado Com Sucesso!');
       end;

  JsonStreamRetorno.Free;
  SoketSSL.Free;
  idHttp.Free;
end;


end.

 

Editado por johnbh3
Postado

No PostMan peguei o mesmo JSON gerado pelo delphi e enviou, so troquei claro o 

'#$D#$A' do JSON gerado pelo delphi

 

Retornou normalmente status  200

{
    "seuNumero""1383",
    "nossoNumero""00845404898",
    "codigoBarras""07791905600000010000001112050675100845404898",
    "linhaDigitavel""07790001161205067510208454048987190560000001000"
}

Postado

Muito estranho o idHttp esta enviando nada!

 

Eu até uma VCL zerado e coloquei apenas 

 

em uses
IdServerIOHandler, IdSSL,
  IdSSLOpenSSL, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdCoderMIME,
  uLkJSON,XSuperObject;


var
  idHttp:TIdHTTP;
  SoketSSL:TIdSSLIOHandlerSocketOpenSSL;
  JsonStreamRetorno, JsonStreamEnvio: TStringStream;
  SJson: String;
begin
  idHttp            := tidHttp.Create(self);

  with idHttp.Request.CustomHeaders do
    begin
      Clear;
      Values['Content-Type']   := 'application/json';
    end;

  SoketSSL          := TIdSSLIOHandlerSocketOpenSSL.Create(self);
  idHttp.IOHandler  := SoketSSL;
  SJson :='{  "pagador": {    "cpfCnpj": "13259086000113",    "nome:"TESTE"}}';
  JsonStreamEnvio   := TStringStream.Create(SJson);
  JsonStreamRetorno := TStringStream.Create('');


 idhttp.Post('http://webhookinbox.com/view/iiZ4ti1N/',JsonStreamEnvio,JsonStreamRetorno);
 ShowMessage(JsonStreamRetorno.DataString);

Inventei um conteudo JSON bobo atoa e tem mesmo comportamento não enviar pro webhookinbox que vc sugeriu! 

  • Solution
Postado

Resolvido pessoal, se puder fechar !

 

A solução e: UTF8Decode no JSON para envio OK!
Como postei toda solução aqui, caso alguém precise já fica a dica!

Forte a abraço a todos.

  • Curtir 1
  • Consultores
Postado

Uma consideração, por favor sempre anexem arquivos dos fontes ao invés de todo o conteúdo, a menos que seja um fragmento pequeno para o contexto.

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

  • Este tópico foi criado há 855 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.