Ir para conteúdo
  • Cadastre-se

dev botao

Erro Ao Tentar Confirmar Pagamento de PIX Dinâmico


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

Recommended Posts

  • Membros Pro
Postado (editado)

Bom dia,

Estamos tendo um erro na hora de confirmar se um PIX dinâmico, banco Inter, foi pago.
Gostaria de ajuda para ver se há alguma coisa errada em nosso código ou se pode ser algum problema no componente.

O que ocorre é que são gerados e confirmados 6, 7, ...PIX ou mais, tudo normal, ou seja, é gerado o qrCode e depois a confirmação.
Porém, aleatoriamente acontece um erro. Como eu disse, vários PIX processam normalmente e, de repente, um deles dá problema, sem que nada diferente seja feito em relação aos PIX anteriores que processaram corretamente.

A consulta é feita por um timer com interval de 5 segundos. 

O erro é: "Argument out of range". Acreditamos (não temos certeza porque não há como debbugar) que ocorra nessas linhas de nosso código:
 begin
  VRetorno.FValorPago := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].valor;
  VRetorno.FEndToEnd := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].endToEndId;
 end; 


O código todo de tratamento da confirmação é este:

try
  if not ACBrPixCD1.PSP.epCob.ConsultarCobrancaImediata(VID_PIXGerado) then  //se não conseguiu fazer a consulta.
   begin
    TimerConsultarPIX.Enabled := false;

    VRetorno.FStatus := stcNENHUM;
    VRetorno.FErro := 'Não foi possível efetuar a consulta.';
   end
  else
   begin
    VRetorno.FStatus := ACBrPixCD1.PSP.epCob.CobCompleta.status;

    if VRetorno.FStatus <> stcATIVA then //se estivar ativa, ou seja, se não foi paga nem baixada, não sai.
     begin
      TimerConsultarPIX.Enabled := false;

      if VRetorno.FStatus = stcCONCLUIDA then
       begin
        VRetorno.FValorPago := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].valor;
        VRetorno.FEndToEnd := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].endToEndId;
       end
      else  ChamaErro('O PIX mudou status, mas não foi pago. Seu status está: ' + PIXStatusCobrancaToString(VRetorno.FStatus));
    end;
   end;
 except
  on e:exception do
   begin
    TimerConsultarPIX.Enabled := false;
    VMsg := 'Ocorreu um erro ao tentar buscar o status de pagamento do PIX.';
    VMsg := VMsg + '- exception: ' + e.message + sLineBreak + '- Status do PIX: ' + PIXStatusCobrancaToString(VRetorno.FStatus);
    if NaoEstaVazio(ACBrPixCD1.PSP.epCob.CobCompleta.AsJSON) then
      VMsg := VMsg + sLineBreak + '- Json retornado: ' + ACBrPixCD1.PSP.epCob.CobCompleta.AsJSON;

    WriteToTXT(VG.FDirTemp + 'logPIX.txt', VMsg, false);
    ChamaErro(VMsg);
   end;
 end;

Ou tem alguma coisa que estamos fazendo errado (o tempo do timer talvez?), ou, em algum momento o componente se perde e não alimenta a lista do ACBrPixCD1.PSP.epCob.CobCompleta.pix[0], pois a consulta retorna tudo certo no, conforme dá para ver no arquivo logPIX.txt que é gravado e estou anexando aqui.

 Obrigado

logPIX.txt

Editado por Valdir Dill
Texto errado

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Fundadores
Postado
2 horas atrás, Valdir Dill disse:

VRetorno.FValorPago := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].valor;

Você não deve escrever um código como esse... pois ele está presumindo que sempre haverá um elemento PIX na resposta, o que pode não ser verdadeiro...

Quando for trabalhar com Arrays ou Listas, sempre verifique primeiro a propriedade Count para depois tentar acessar os elementos...

Exemplo

If ACBrPixCD1.PSP.epCob.CobCompleta..pix.Count > 0 then
   VRetorno.FValorPago := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].valor;
else
   VRetorno.FValorPago := 0;

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Membros Pro
Postado
3 minutos atrás, Daniel Simoes disse:

Você não deve escrever um código como esse... pois ele está presumindo que sempre haverá um elemento PIX na resposta, o que pode não ser verdadeiro...

Quando for trabalhar com Arrays ou Listas, sempre verifique primeiro a propriedade Count para depois tentar acessar os elementos...

Exemplo

If ACBrPixCD1.PSP.epCob.CobCompleta..pix.Count > 0 then
   VRetorno.FValorPago := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].valor;
esse
   VRetorno.FValorPago := 0;

 

Sim, eu concordo que ao varrer uma lista, deve ser verificado antes o seu count. A boa prática de código seria essa.

Mas note que o código (na rotina completa que coloquei) só pega o index 0 se ACBrPixCD1.PSP.epCob.CobCompleta.status = stcCONCLUIDA.
E veja também (no .txt que anexei) que, no momento em que ocorre a exceção, em ACBrPixCD1.PSP.epCob.CobCompleta.AsJSON tem sim um PIX.

Então, se status = stcCONCLUIDA e ACBrPixCD1.PSP.epCob.CobCompleta.AsJSON contém retorno de um PIX pago, o ACBrPixCD1.PSP.epCob.CobCompleta.pix.count não deveria estar necessariamente > 0?

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Fundadores
Postado
2 horas atrás, Valdir Dill disse:

Então, se status = stcCONCLUIDA e ACBrPixCD1.PSP.epCob.CobCompleta.AsJSON contém retorno de um PIX pago, o ACBrPixCD1.PSP.epCob.CobCompleta.pix.count não deveria estar necessariamente > 0?

@Valdir Dill, agora no PC, consegui abrir o seu Log...

Observe que não há um Objeto PIX, no retorno...

{
    "chave": "8f92dc50-64ef-4618-94bf-3eb166c71f23",
    "solicitacaoPagador": "Venda72790",
    "pixCopiaECola": "00020101021226930014BR.GOV.BCB.PIX2571spi-qrcode.bancointer.com.br/spi/pj/v2/7de7f89931294960a377750795dac53e52040000530398654047.005802BR5901*6007BACABAL61086570000062070503***6304B135",
    "calendario": {
        "criacao": "2024-02-27T19:08:20.655Z",
        "expiracao": 180
    },
    "loc": {
        "id": 32150206,
        "tipoCob": "cob",
        "criacao": "2024-02-27T19:08:20.639Z",
        "location": "https://spi-qrcode.bancointer.com.br/spi/pj/v2/7de7f89931294960a377750795dac53e"
    },
    "valor": {
        "original": "7.00"
    },
    "txid": "VendaGFILYK72790YK31029602239503061",
    "location": "https://spi-qrcode.bancointer.com.br/spi/pj/v2/7de7f89931294960a377750795dac53e",
    "status": "CONCLUIDA"
}

 

@EliasCesar, tem alguma dica ?

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Consultores
  • Solution
Postado

Olá @Valdir Dill,

Realmente como o Daniel comentou, na resposta do PSP não há nenhuma informação sobre o pagamento. 

Tente consultar novamente essa mesma cobrança, utilizando o txID (Pode ser pelo nosso demo).
Dessa forma podemos verificar se as informações de pagamento vão vir "atrasadas".

Se vierem, a sugestão seria continuar consultando a cobrança até "CobCompleta.pix.Count > 0".

Caso não venham, então isso seria realmente um problema no retorno do PSP. Precisaria entrar em contato com eles para verificar o motivo.

  • Curtir 1
Consultor SAC ACBr

Elias César Vieira
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil
Assine o
SAC

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