Jump to content

Delphi chamada_delphi.png acbr.png

C6 chamada_c6.png botao.png

Pay&GoWeb retornando TRANSACAO PENDENTE no ACBrTEFAPI


DatawebDev

Recommended Posts

  • Membros Pro

Usamos o ACBrTEFAPI sem confirmação automática, em uma nova aplicação nossa, ainda em fase de desenvolvimento.

Ao tentar autorizar um pagamento em cartão de crédito, componente solicita seleção da Rede Autorizadora, depois pede cartão e senha. Em seguida o Pay&Go retorna TRANSACAO PENDENTE.

Implementamos um tratamento de pendências no evento QuandoDetectarTransacaoPendente. Nossa aplicação espera que, durante a inicialização do componente, esse evento seja disparado, caso exista alguma transação pendente. Nesse caso, o componente inicializa, não detecta pendência (não dispara evento), e então aplicação prossegue com a autorização de pagamento.

Depois do retorno de TRANSACAO PENDENTE do Pay&Go, componente dispara o evento QuandoDetectarTransacaoPendente, mas o parâmetro RespostaTEF, passado pelo evento, vem vazio. Em anexo o trecho do nosso event handler (TForm1.ACBrTEFAPI1QuandoDetectarTransacaoPendente.pas), escrevendo os dados de RespostaTEF para um arquivo texto, e o arquivo texto contendo os dados de RespostaTEF (dadostransacao.txt).

Pelo que parece, o componente não conseguiu manter seu estado de "transação pendente" sincronizado com o Pay&Go, ou o ambiente de teste do Pay&Go está com algum problema, reportando pendência inexistente. Componente só dispararia o evento QuandoDetectarTransacaoPendente, na sua inicialização, quando tiver esse estado de pendência em seus arquivos temporários, correto? Método LimparRespostasTEF() limpa esse estado? Seguindo ACBrTEFAPI_Demo, estamos chamando LimparRespostasTEF() depois do método Inicializar(). Deveríamos fazer isso?

Queria saber se esse estado de "pendência no Pay&Go", que não é detectada na inicialização do ACBrTEFAPI, é um bug no ambiente de testes do Pay&Go, ou se devemos tratar esse caso em produção. Se for para tratar, como devemos fazer? Com RespostaTEF retornando vazio, não temos como decidir se a transação deve ser confirmada ou desfeita. Deveríamos desfazer sempre?

Em anexo os logs presentes nos diretórios de trabalho do componente e da PGWebLib.dll. Testei com a revision 24534 do ACBr (de 06/02/2022), e PGWebLib.dll v4.1.15.1 . Aplicação feita no Delphi 10.4.

TForm1.ACBrTEFAPI1QuandoDetectarTransacaoPendente.pas dadostransacao.txt ACBRTEFAPI.log comms_220216.log ppsers_220216.log

logoDW.png.043cb4b50e3275dc9614c728eb3fa617.png

Guilherme Costa

 

Link to comment
Share on other sites

  • Fundadores

@DatawebDev, por favor verifique se seus fontes estão atualizados...

Creio que esse problema só ocorre em ambiente de homologação, mas em todo caso, já foi corrigido...

Veja esse commit:

https://sourceforge.net/p/acbr/code/24048/

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.

Link to comment
Share on other sites

  • Membros Pro

Obrigado pela resposta rápida @Daniel Simoes.

Havia testado com a revision 24534 do SVN, e agora atualizei para a revision 24639 e testei novamente. Mesmo resultado.

Sendo uma situação que só ocorre em homologação, tratarei esses casos na aplicação, desfazendo as transações pendentes desse tipo.

 

Sobre essa dúvida:

Quote

Componente só dispararia o evento QuandoDetectarTransacaoPendente, na sua inicialização, quando tiver esse estado de pendência em seus arquivos temporários, correto?  Método LimparRespostasTEF() limpa esse estado? Seguindo ACBrTEFAPI_Demo, estamos chamando LimparRespostasTEF() depois do método Inicializar(). Deveríamos fazer isso?

Esse estado de pendência pode ter sido causado por chamarmos LimparRespostasTEF() depois de chamar Inicializar()?

logoDW.png.043cb4b50e3275dc9614c728eb3fa617.png

Guilherme Costa

 

Link to comment
Share on other sites

  • Fundadores
15 horas atrás, DatawebDev disse:

Pelo que parece, o componente não conseguiu manter seu estado de "transação pendente" sincronizado com o Pay&Go, ou o ambiente de teste do Pay&Go está com algum problema, reportando pendência inexistente. Componente só dispararia o evento QuandoDetectarTransacaoPendente, na sua inicialização, quando tiver esse estado de pendência em seus arquivos temporários, correto? Método LimparRespostasTEF() limpa esse estado? Seguindo ACBrTEFAPI_Demo, estamos chamando LimparRespostasTEF() depois do método Inicializar(). Deveríamos fazer isso?

Sim, o LimparRespostasTEF, apagaria os Backups do ACBr, e com isso ele não conseguiria detectar se há resposta pendente de forma local... mas se ocorrer erro no retorno da PayGo, o evento continua sendo disparado...

Para investigar o problema, eu preciso reproduzir o mesmo, no Demo do ACBrTEFAPI

Por favor informe como Demo do ACBr deve ser configurado e qual o passo a passo ( venda, pagamento, fechamento, etc) que devo realizar, até chegar ao problema

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.

Link to comment
Share on other sites

  • Membros Pro

Tentei reproduzir o problema no TEFAPIDemo, mas precisei alterar ele demais para que chegasse no estado de pendência do meu problema.

Consegui reproduzir na minha aplicação, de forma consistente. O problema ocorre quando a pendência não é resolvida no evento QuandoDetectarTransacaoPendente, disparado no método Inicializar, e em seguida se chama o método LimparRespostasTEF.

Mas o meu estado de erro original, que motivou a abertura esse tópico, não parece ter sido causado pela minha aplicação, e sim por algum estado de pendência errado no ambiente de testes do Pay&Go. Um detalhe que indica estado diferente no backend do Pay&Go é que, enquanto estava no estado de pendência, e tentávamos realizar um pagamento, o Pay&Go não retornava a rede autorizadora DEMO, que sempre usamos. Retornava somente ITI e REDE, como se pode ver nos logs da primeira postagem do tópico. Depois de desfeita a transação pendente, voltou a retornar a autorizadora DEMO, e segue retornando.

Enquanto tentava reproduzir o problema no TEFAPIDemo, vi que o parâmetro MsgErro, do evento QuandoDetectarTransacaoPendente, retorna o NSU da transação pendente no backend do Pay&Go. Com isso, mais o tratamento que fizemos para desfazer esse tipo de pendência, e mais a explicação sobre o método LimparRespostasTEF e o ambiente de homologação, podemos encerrar esse tópico. Muito obrigado pela ajuda.

logoDW.png.043cb4b50e3275dc9614c728eb3fa617.png

Guilherme Costa

 

Link to comment
Share on other sites

  • Fundadores
52 minutos atrás, DatawebDev disse:

Consegui reproduzir na minha aplicação, de forma consistente. O problema ocorre quando a pendência não é resolvida no evento QuandoDetectarTransacaoPendente, disparado no método Inicializar, e em seguida se chama o método LimparRespostasTEF.

Mas em que situação a Pendência não seria resolvida, quando o evento QuandoDetectarTransacaoPendente foi chamado ? Isso não seria um erro ?

Você consegue compartilhar um Mini Projeto, (ou o Demo modificado), onde eu possa reproduzir o problema ?

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.

Link to comment
Share on other sites

  • Membros Pro
6 minutes ago, Daniel Simoes said:

Mas em que situação a Pendência não seria resolvida, quando o evento QuandoDetectarTransacaoPendente foi chamado ? Isso não seria um erro ?

Em nenhuma situação, nem na minha aplicação, e nem no TEFAPIDemo. Isso definitivamente seria um erro. Mais uma evidência de que deve ter sido um bug/estado errado no backend DEMO do Pay&Go, conforme sugerido por ti.

Sair do evento, sem resolver a pendência, foi uma forma que encontrei para reproduzir o estado que eu tinha ao abrir o tópico. Não é a forma como funciona minha aplicação e nem o TEFAPIDemo.

Outra forma de reproduzir seria: efetuar um pagamento; deixar ele pendente; fechar a aplicação; apagar o diretório de trabalho do componente; iniciar a aplicação; componente não terá mais seus backups, para detectar a pendência, e não chamará QuandoDetectarTransacaoPendente durante a inicialização. Não quis testar assim para não perder o diretório de trabalho.

12 minutes ago, Daniel Simoes said:

Você consegue compartilhar um Mini Projeto, (ou o Demo modificado), onde eu possa reproduzir o problema ?

Posso sim, só vou demorar a ter tempo pra fazer isso.

logoDW.png.043cb4b50e3275dc9614c728eb3fa617.png

Guilherme Costa

 

Link to comment
Share on other sites

  • Fundadores
30 minutos atrás, DatawebDev disse:

Posso sim, só vou demorar a ter tempo pra fazer isso.

Claro, sem problemas... Eu acho legal investigar isso.. pode ter ficado algum "ponto cego" nos fontes...

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.

Link to comment
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.