Ir para conteúdo
  • Cadastre-se

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

Recommended Posts

Postado

Boa tarde.

 

Não estou conseguindo gerar múltiplos na API banco Inter. 
Envia o primeiro e da OK Certinho .. .ai no segundo da "06/03/26 14:36:37:276 -03:00 - Código do Envio: 429 1.1 Too Many Requests"
ja tentei mandar 1 por um em um loop e colocar uns sleep e nada .. 

minha rotina esta assim 

procedure Tfrprincipal.EnviarBoletos;
var
  SLRemessa: TStringList;
  i, j: Integer;
  MinhaQueryUpdate: TFDQuery;
  xSeuNumeroRaw, xFiltro, xRef, xParcela, sMsgErro: string;
  Partes: TArray<string>;
begin
  if FACBrBoleto.ListadeBoletos.Count <= 0 then Exit;
  if not ConfirmMessage('Deseja enviar ' + FACBrBoleto.ListadeBoletos.Count.ToString + ' Boleto(s)?', True) then
    Abort;

  SLRemessa := TStringList.Create;
  try
    MostraEspera('Enviando boletos...');

    // Envia tudo de uma vez, igual ao exemplo do ACBr
    FACBrBoleto.Configuracoes.WebService.Operacao := tpInclui;
    FACBrBoleto.Enviar;

    SLRemessa.Add('=== ENVIO: ' + FormatDateTime('dd/mm/yyyy hh:nn:ss', Now) +
      ' | Boletos: ' + FACBrBoleto.ListadeBoletos.Count.ToString +
      ' | Retornos: ' + FACBrBoleto.TotalListaRetornoWeb.ToString + ' ===');

    if FACBrBoleto.TotalListaRetornoWeb <= 0 then
    begin
      SLRemessa.Add('NENHUM retorno recebido da API.');
      Exit;
    end;

    MinhaQueryUpdate := TFDQuery.Create(nil);
    try
      MinhaQueryUpdate.Connection := frdm.FDConn;

      for i := 0 to Pred(FACBrBoleto.TotalListaRetornoWeb) do
      begin
        SLRemessa.Add('---');
        SLRemessa.Add('HTTP=' + IntToStr(FACBrBoleto.ListaRetornoWeb[i].HTTPResultCode));
        SLRemessa.Add('Msg=' + FACBrBoleto.ListaRetornoWeb[i].MsgRetorno);
        SLRemessa.Add('JSON=' + FACBrBoleto.ListaRetornoWeb[i].JSON);

        // Só grava no banco se foi sucesso (200 ou 201)
        if FACBrBoleto.ListaRetornoWeb[i].HTTPResultCode in [200, 201] then
        begin
          xSeuNumeroRaw := FACBrBoleto.ListaRetornoWeb[i].DadosRet.TituloRet.SeuNumero;

          // Se vier vazio no retorno, pega do boleto enviado pelo índice
          if (xSeuNumeroRaw = '') and (FACBrBoleto.ListadeBoletos.Count > i) then
            xSeuNumeroRaw := FACBrBoleto.ListadeBoletos[i].SeuNumero;

          SLRemessa.Add('SeuNumero=' + xSeuNumeroRaw);
          SLRemessa.Add('NossoNumero=' + FACBrBoleto.ListaRetornoWeb[i].DadosRet.TituloRet.NossoNumero);
          SLRemessa.Add('CodBarras=' + FACBrBoleto.ListaRetornoWeb[i].DadosRet.TituloRet.CodBarras);
          SLRemessa.Add('LinhaDig=' + FACBrBoleto.ListaRetornoWeb[i].DadosRet.TituloRet.LinhaDig);

          if xSeuNumeroRaw = '' then
          begin
            SLRemessa.Add('ERRO: SeuNumero vazio, não foi possível localizar no banco.');
            Continue;
          end;

          Partes := xSeuNumeroRaw.Split(['-']);
          if Length(Partes) < 2 then
          begin
            SLRemessa.Add('ERRO: formato de SeuNumero inválido: ' + xSeuNumeroRaw);
            Continue;
          end;

          xRef     := Partes[0].Trim;
          xParcela := Partes[Length(Partes)-1].Trim;

          if Pos('P', UpperCase(xRef)) = 1 then
          begin
            xRef    := StringReplace(UpperCase(xRef), 'P', '', [rfReplaceAll]).Trim;
            xFiltro := Format(' and idpedido = %s and nparcela = %s', [xRef, QuotedStr(xParcela)]);
          end
          else
            xFiltro := Format(' and numnf = %s and nparcela = %s', [xRef, QuotedStr(xParcela)]);

          try
            MinhaQueryUpdate.SQL.Text :=
              'UPDATE TBCTAREC SET '                 +
              '  NOSSONUMERO    = :NOSSONUMERO,    ' +
              '  CODIGOBARRAS   = :CODIGOBARRAS,   ' +
              '  IDCONTA        = :IDCONTA,        ' +
              '  LINHADIGITAVEL = :LINHADIGITAVEL, ' +
              '  STATUS_API     = :STATUS_API,     ' +
              '  QRCODE         = :QRCODE,         ' +
              '  STSBOLETO      = ''T''            ' +
              'WHERE 1=1 ' + xFiltro;

            MinhaQueryUpdate.ParamByName('IDCONTA').AsInteger       := cbSelConta.Value;
            MinhaQueryUpdate.ParamByName('NOSSONUMERO').AsString    := FACBrBoleto.ListaRetornoWeb[i].DadosRet.TituloRet.NossoNumero;
            MinhaQueryUpdate.ParamByName('CODIGOBARRAS').AsString   := FACBrBoleto.ListaRetornoWeb[i].DadosRet.TituloRet.CodBarras;
            MinhaQueryUpdate.ParamByName('LINHADIGITAVEL').AsString := FACBrBoleto.ListaRetornoWeb[i].DadosRet.TituloRet.LinhaDig;
            MinhaQueryUpdate.ParamByName('STATUS_API').AsString     := FACBrBoleto.ListaRetornoWeb[i].DadosRet.TituloRet.EstadoTituloCobranca;
            MinhaQueryUpdate.ParamByName('QRCODE').AsString         := FACBrBoleto.ListaRetornoWeb[i].DadosRet.TituloRet.EMV;
            MinhaQueryUpdate.ExecSQL;

            SLRemessa.Add('SUCESSO gravado no banco: ' + xSeuNumeroRaw);
          except
            on E: Exception do
              SLRemessa.Add('ERRO ao gravar banco ' + xSeuNumeroRaw + ': ' + E.Message);
          end;
        end
        else
        begin
          // Loga erros e rejeições
          sMsgErro := FACBrBoleto.ListaRetornoWeb[i].MsgRetorno;
          for j := 0 to Pred(FACBrBoleto.ListaRetornoWeb[i].ListaRejeicao.Count) do
            sMsgErro := sMsgErro + ' | ' + FACBrBoleto.ListaRetornoWeb[i].ListaRejeicao[j].Mensagem;
          SLRemessa.Add('FALHA HTTP ' +
            IntToStr(FACBrBoleto.ListaRetornoWeb[i].HTTPResultCode) + ': ' + sMsgErro);
        end;
      end;

    finally
      MinhaQueryUpdate.Free;
    end;

    imprimirBoleto;
  finally
    SLRemessa.SaveToFile(arqRetorno + 'Log_Final_' + FormatDateTime('hhmmss', Now) + '.txt');
    SLRemessa.Free;
    FechaEspera;
  end;
end;

Coloquei o retorno .. so dei uma bagunçada nos dados sensíveis ...  mas o retorno é esse .. vai o primeiro e os demais não .. 

retorno.txt

  • Consultores
Postado

senão me engano é o token que tu deve gravar ele e usar o mesmo até ele vencer. senão o ccomportamento do componente será gerar um novo

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
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 !!

  • 2 semanas depois ...
  • Membro Pro Verificado
Postado

Estou passando pelo mesmo problema com o Banco Inter, pelo que entendi quando envio uma lista de boletos para o ACBr enviar para a API, o próprio ACBr faz o controle do token e utiliza o mesmo para todos os boletos enviados.

O que está ocorrendo é que logo após o envio do primeiro boleto, já no segundo boleto a API retorna o erro 429.

Não faz sentido, porque não ultrapassou o limite de 5 tokens por minuto. O que notei é que ocorrem vários envios no mesmo segundo de tempo por conta da rapidez, e acredito que seja esse o motivo da API rejeitar.

Infelizmente não encontrei nada na documentação do banco relacionado a isso, mas imagino que talvez um delay de 1 segundo entre cada requisição à API, dentro dos fontes do ACBr poderia resolver.

Mais alguém passou por isso ou tem alguma solução?

Postado

isso .. o meu foi o seguinte .. eu estava enviando na versão 2.0 que esta sendo descontinuada .. 
mesmo no campo de versão se voce colocar 3.0 ele entra o 2.0

 

O que determina a versão no acbr é o indicadorPIX .. se voce colcoar ele como true, ele envia para o endereço do webservice 3.0 se colocar false envia no 2.0

 

 

  • Curtir 1
  • Este tópico foi criado há 122 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.

The popup will be closed in 10 segundos...