Ir para conteúdo
  • Cadastre-se

dev botao

Envio de boletos em lote Banco Inter API


jefferson01
Ver Solução Respondido por Daniel InfoCotidiano,
  • Este tópico foi criado há 302 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa tarde!

Estou com dúvida de como gerar enviar vários boletos utilizando a API do banco Inter. No envio para cada boleto é gerado um token, porém esse banco tem um limite de 5 token por minuto. Como fazer para gerar apenas 1 token e enviar todos os boletos preenchidos?

Desde já agradeço pela atenção.

Editado por jefferson01
Escrevi errado
Link para o comentário
Compartilhar em outros sites

tem que colocar no cadastro da sua conta corrente, um campo campo com data e hora

Ex: pega no cadastro de conta:

        Clear;
          Add('select ');
          Add('    CONTA_CORRENTE_SERV_BANCARIO.CODIGO_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.CLIENT_ID_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.CLIENT_SECRET_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_DATA_HORA_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_VALIDADE_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.NOME_CRT_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.CRT_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.NOME_KEY_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.KEY_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.NOME_PFX_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.PFX_SER');

          // SENHA_CRT_KEY_SER
          Add('from CONTA_CORRENTE_SERV_BANCARIO');
          Add('where CONTA_CORRENTE_SERV_BANCARIO.CODIGO_SER = ' + AServicoBancario.ToString);

          TFuncoesBancoDeDados.ExecuteReaderFD(Text, ATransacao, FDS);
        finally
          DisposeOf;
        end;

      AToken       := FDS.FieldByName('SESSAO_TOKEN_SER').AsString;
      ATokenTime   := FDS.FieldByName('SESSAO_TOKEN_VALIDADE_SER').AsDateTime;
      ClientId     := FDS.FieldByName('CLIENT_ID_SER').AsString;
      ClientSecret := FDS.FieldByName('CLIENT_SECRET_SER').AsString;

 

 // venceu ou nao tem
  if (AToken = '') or (ATokenTime <= Now) then
  begin
    HoraTmp := Now;

    Inter := TBancoInter.Create(nil);
    try

      Inter.ClientId     := ClientId;
      Inter.ClientSecret := ClientSecret;
      Inter.CertFile     := CrtTmp;
      Inter.KeyFile      := KeyTmp;

      Inter.GetToken;

      AToken     := Inter.Token;
      ATokenTime := Inter.TokenTime;

      if AToken <> '' then
      begin
        with TStringList.Create do
          try
            Clear;
            Add('update CONTA_CORRENTE_SERV_BANCARIO set');
            Add('       CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_SER           = ' + QuotedStr(AToken));
            Add('      ,CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_DATA_HORA_SER = ' + TFuncoesSQL.DataHoraSQL(HoraTmp));
            Add('      ,CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_VALIDADE_SER  = ' + TFuncoesSQL.DataHoraSQL(HoraTmp));
            Add('where CONTA_CORRENTE_SERV_BANCARIO.CODIGO_SER = ' + AServicoBancario.ToString);

            TFuncoesBancoDeDados.ExecuteCommand(Text, ATransacao);
          finally
            DisposeOf;
          end;
      end;
    finally
      Inter.DisposeOf;
    end;
  end;

Link para o comentário
Compartilhar em outros sites

43 minutos atrás, Antonio Gomes disse:

tem que colocar no cadastro da sua conta corrente, um campo campo com data e hora

Ex: pega no cadastro de conta:

        Clear;
          Add('select ');
          Add('    CONTA_CORRENTE_SERV_BANCARIO.CODIGO_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.CLIENT_ID_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.CLIENT_SECRET_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_DATA_HORA_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_VALIDADE_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.NOME_CRT_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.CRT_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.NOME_KEY_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.KEY_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.NOME_PFX_SER');
          Add('   ,CONTA_CORRENTE_SERV_BANCARIO.PFX_SER');

          // SENHA_CRT_KEY_SER
          Add('from CONTA_CORRENTE_SERV_BANCARIO');
          Add('where CONTA_CORRENTE_SERV_BANCARIO.CODIGO_SER = ' + AServicoBancario.ToString);

          TFuncoesBancoDeDados.ExecuteReaderFD(Text, ATransacao, FDS);
        finally
          DisposeOf;
        end;

      AToken       := FDS.FieldByName('SESSAO_TOKEN_SER').AsString;
      ATokenTime   := FDS.FieldByName('SESSAO_TOKEN_VALIDADE_SER').AsDateTime;
      ClientId     := FDS.FieldByName('CLIENT_ID_SER').AsString;
      ClientSecret := FDS.FieldByName('CLIENT_SECRET_SER').AsString;

 

 // venceu ou nao tem
  if (AToken = '') or (ATokenTime <= Now) then
  begin
    HoraTmp := Now;

    Inter := TBancoInter.Create(nil);
    try

      Inter.ClientId     := ClientId;
      Inter.ClientSecret := ClientSecret;
      Inter.CertFile     := CrtTmp;
      Inter.KeyFile      := KeyTmp;

      Inter.GetToken;

      AToken     := Inter.Token;
      ATokenTime := Inter.TokenTime;

      if AToken <> '' then
      begin
        with TStringList.Create do
          try
            Clear;
            Add('update CONTA_CORRENTE_SERV_BANCARIO set');
            Add('       CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_SER           = ' + QuotedStr(AToken));
            Add('      ,CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_DATA_HORA_SER = ' + TFuncoesSQL.DataHoraSQL(HoraTmp));
            Add('      ,CONTA_CORRENTE_SERV_BANCARIO.SESSAO_TOKEN_VALIDADE_SER  = ' + TFuncoesSQL.DataHoraSQL(HoraTmp));
            Add('where CONTA_CORRENTE_SERV_BANCARIO.CODIGO_SER = ' + AServicoBancario.ToString);

            TFuncoesBancoDeDados.ExecuteCommand(Text, ATransacao);
          finally
            DisposeOf;
          end;
      end;
    finally
      Inter.DisposeOf;
    end;
  end;

Ola Antonio, sempre ajudando por aqui hein... obrigado, mais no caso estou usando o componente do ACBR precisa ver onde ele faz a requisição do Token, vou tentar debugar o codigo para entender, pois pelo que vi na documentação, o token é valido por 1 hora.

 

 

Código HTTP 401 - Token inválido

Você precisa adicionar o Bearer token OAuth que foi gerado em Como gerar um token OAuth?. Caso já esteja adicionado, este token provavelmente expirou (validade de 1h) e é necessário emitir um novo.

Link para o comentário
Compartilhar em outros sites

10 horas atrás, Luiz Carlos Panoni Junior disse:

Ola Antonio, sempre ajudando por aqui hein... obrigado, mais no caso estou usando o componente do ACBR precisa ver onde ele faz a requisição do Token, vou tentar debugar o codigo para entender, pois pelo que vi na documentação, o token é valido por 1 hora.

 

 

Código HTTP 401 - Token inválido

Você precisa adicionar o Bearer token OAuth que foi gerado em Como gerar um token OAuth?. Caso já esteja adicionado, este token provavelmente expirou (validade de 1h) e é necessário emitir um novo.

o meu tem uma falha ali, ao salvar o valor do tokentime.

a proposito, no acbr, é aqui que valida o token

 

function TBoletoW_Inter_API.GerarTokenAutenticacao: string;
begin
  OAuth.Payload := True;
  Result := inherited GerarTokenAutenticacao;
end;

Na funcao: GerarTokenAutenticacao chama a funcao da boletaws base dessa derivacao:   TBoletoW_Inter_API = class(TBoletoWSREST)

o tempo de validade, vem no retorno do 

 if OAuth.GerarToken then
      Result := OAuth.Token

para mim, o tempo deve ser aqui:  property Expire          : TDateTime        read FExpire; na unit ACBrBoletoWS.Rest.OAuth

Sempre que posso ajudo ...

Link para o comentário
Compartilhar em outros sites

Bom dia!

@Antonio Gomes, obrigado pela orientação. Na função tem o código abaixo:

function TOAuth.GerarToken: Boolean;
begin

  if ( Token <> '' ) and ( CompareDateTime( Expire, Now ) = 1 ) then                                        //Token ja gerado e ainda válido
    Result := True
  else                                                                                                      //Converte Basic da Autenticação em Base64
    Result := Executar( 'Basic ' + String(EncodeBase64(AnsiString(ClientID + ':' + ClientSecret))) );

end;

Vou verificar o motivo para está sempre sendo gerado o token.

Editado por jefferson01
Link para o comentário
Compartilhar em outros sites

1 hora atrás, jefferson01 disse:

Bom dia!

@Antonio Gomes, obrigado pela orientação. Na função tem o código abaixo:

function TOAuth.GerarToken: Boolean;
begin

  if ( Token <> '' ) and ( CompareDateTime( Expire, Now ) = 1 ) then                                        //Token ja gerado e ainda válido
    Result := True
  else                                                                                                      //Converte Basic da Autenticação em Base64
    Result := Executar( 'Basic ' + String(EncodeBase64(AnsiString(ClientID + ':' + ClientSecret))) );

end;

Vou verificar o motivo para está sempre sendo gerado o token.

Se conseguir entender o motivo da um toque por favor

Link para o comentário
Compartilhar em outros sites

Seguindo a sugestão do @Antonio Gomes, fiz alteração nos fontes criando 2 propriedades no TACBrWebService, que são Token e Expire. Ao gerar o Token eu armazeno as informações nessas novas propriedades com isso consigo gerar um novo token apenas se já tiver expirado ou se não existir um token gerado.

Segue os fontes para analise. Já fiz testes em produção e funcionou corretamente enviando vários boletos(mais de 5) por fez.

Att. Jefferson

ACBrBoleto.zip

Link para o comentário
Compartilhar em outros sites

3 minutos atrás, jefferson01 disse:

Seguindo a sugestão do @Antonio Gomes, fiz alteração nos fontes criando 2 propriedades no TACBrWebService, que são Token e Expire. Ao gerar o Token eu armazeno as informações nessas novas propriedades com isso consigo gerar um novo token apenas se já tiver expirado ou se não existir um token gerado.

Segue os fontes para analise. Já fiz testes em produção e funcionou corretamente enviando vários boletos(mais de 5) por fez.

Att. Jefferson

ACBrBoleto.zip 48.57 kB · 0 downloads

Eu salvo o meu no banco de dados, e se caso o operador sair do sistema, fica gravado os dados do token, para nao precisar processar de novo, a cada boleto, é verificado o tempo. Pois ele é fixo, o retorno do inter ja vem com o tempo somado, bom, era assim...

Tipo, entra o comando no endpoint as 15hs, vem que ele vale ate 16hs

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
Em 13/03/2023 at 14:53, jefferson01 disse:

Seguindo a sugestão do @Antonio Gomes, fiz alteração nos fontes criando 2 propriedades no TACBrWebService, que são Token e Expire. Ao gerar o Token eu armazeno as informações nessas novas propriedades com isso consigo gerar um novo token apenas se já tiver expirado ou se não existir um token gerado.

Segue os fontes para analise. Já fiz testes em produção e funcionou corretamente enviando vários boletos(mais de 5) por fez.

Att. Jefferson

ACBrBoleto.zip 48.57 kB · 0 downloads

@Juliana Tamizou
Acredito ser uma boa idéia essa alteração!

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Consultores
Em 14/03/2023 at 19:56, Jean Peixoto disse:

Acredito ser uma boa idéia essa alteração!

@Jean Peixoto
Boa tarde , coloquei na mesma tarefa da sua outra contribuição para análise TK-3798

  • Curtir 1
Consultor SAC ACBr

Daniel de Morais (Infocotidiano)
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Consultores

@jefferson01
Bom dia !
Primeiramente obrigado pela contribuição.
Estava falando com o time de boleto e como padrão de autenticação OAuth ele só gera outro token caso necessário automaticamente.
Poderia detalhar melhor por favor a necessidade de salvar no banco por exemplo, igual citado no post acima.
Obrigado

Consultor SAC ACBr

Daniel de Morais (Infocotidiano)
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Link para o comentário
Compartilhar em outros sites

7 minutos atrás, Daniel InfoCotidiano disse:

@jefferson01
Bom dia !
Primeiramente obrigado pela contribuição.
Estava falando com o time de boleto e como padrão de autenticação OAuth ele só gera outro token caso necessário automaticamente.
Poderia detalhar melhor por favor a necessidade de salvar no banco por exemplo, igual citado no post acima.
Obrigado

Uai, suspeito que seja pelo tempo que ele pede, vc nao pode gerar outro token, se o anterior tiver valido, mas apenas usar, contar o tempo em minutos.

Senao eles poem a gente na geladeira: olha:

Obter token oAuth

A autenticação OAuth é a mais recente forma de autenticar os novos serviços disponibilizados pelo Inter. O Token gerado será necessário para consumir as APIs do Inter.

  • O tempo de vida de um token gerado é de uma hora. Com isso, é possível realizar um número determinado de requisições nas apis, de acordo com o rate limit de cada api, utilizando um único token.
  • Rate limit: 5 chamadas por minuto

fonte: https://developers.bancointer.com.br/reference/token-1

 

Link para o comentário
Compartilhar em outros sites

Bom dia!

@Daniel InfoCotidiano, o detalhamento que o @Antonio Gomes fez acima é exatamente o motivo da necessidade de armazenar o token gerado, pois se for enviado uma sequencia de 10 boletos por exemplo, a API vai recusar, já que só pode solicitar 5 token por minuto. No caso salvando o token, podemos utilizar o mesmo dentro do prazo, que no caso é de 1 hora.

Att. Jefferson

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Consultores
  • Solution

@jefferson01 @Antonio Gomes
Foram criado os eventos OnAntesAutenticar, onDepoisAutenticar para que possam capturar ou informar as informações
Captura de tela 2023-05-08 110612.png
Favor atualizar seus repositórios e rodar o instalador.
 

 

 

  • Curtir 1
Consultor SAC ACBr

Daniel de Morais (Infocotidiano)
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Link para o comentário
Compartilhar em outros sites

Em 17/04/2023 at 09:15, Antonio Gomes disse:

Uai, suspeito que seja pelo tempo que ele pede, vc nao pode gerar outro token, se o anterior tiver valido, mas apenas usar, contar o tempo em minutos.

Senao eles poem a gente na geladeira: olha:

Obter token oAuth

A autenticação OAuth é a mais recente forma de autenticar os novos serviços disponibilizados pelo Inter. O Token gerado será necessário para consumir as APIs do Inter.

  • O tempo de vida de um token gerado é de uma hora. Com isso, é possível realizar um número determinado de requisições nas apis, de acordo com o rate limit de cada api, utilizando um único token.
  • Rate limit: 5 chamadas por minuto

fonte: https://developers.bancointer.com.br/reference/token-1

 

Nesse caso, com o mesmo token, podemos realizar quantas requisições precisarmos? Exemplo, podemos enviar 10, 20, 30 requisições por minuto?

Ou são apenas 5 requisições po minuto, independete de qual Token está utilizando?

Saberia informar?

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Moderadores
On 5/10/2023 at 3:38 PM, Leandro Ricardo Quadros Faria said:

Ou são apenas 5 requisições po minuto, independete de qual Token está utilizando?

Essa limitação é apenas para a requisição de obtenção de novos tokens.

Já a limitação para emissão de boletos é de 120 por minuto, conforme a documentação:

image.png

Fonte: https://developers.inter.co/references/cobranca#tag/Boletos

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.