Membros Pro Valdir Dill Postado 28 Fevereiro Membros Pro Compartilhar Postado 28 Fevereiro (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 28 Fevereiro por Valdir Dill Texto errado Valdir Dill Rio de Janeiro - RJ Link para o comentário Compartilhar em outros sites More sharing options...
Fundadores Daniel Simoes Postado 28 Fevereiro Fundadores Compartilhar Postado 28 Fevereiro 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; Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Link para o comentário Compartilhar em outros sites More sharing options...
Membros Pro Valdir Dill Postado 28 Fevereiro Autor Membros Pro Compartilhar Postado 28 Fevereiro 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 Link para o comentário Compartilhar em outros sites More sharing options...
Fundadores Daniel Simoes Postado 28 Fevereiro Fundadores Compartilhar Postado 28 Fevereiro A msg de erro reportada indica que você tentou acessar um elemento não existente Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Link para o comentário Compartilhar em outros sites More sharing options...
Fundadores Daniel Simoes Postado 28 Fevereiro Fundadores Compartilhar Postado 28 Fevereiro 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 ? 1 Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Link para o comentário Compartilhar em outros sites More sharing options...
Consultores Solution EliasCesar Postado 28 Fevereiro Consultores Solution Compartilhar Postado 28 Fevereiro 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. 1 Elias César Vieira Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Assine o SAC Link para o comentário Compartilhar em outros sites More sharing options...
Recommended Posts