Jump to content

marcelosantos

Membros Pro
  • Posts

    67
  • Joined

  • Last visited

Posts posted by marcelosantos

  1. Olá a todos

    Realizei testes com o PaygoWEB e 2 tipos de PinPAD

    Com os PinPADs mais antigos que possuem a versão 1.08a a função de obter dados não funciona

    Com PinPADs mais novos (usei o PPC 930 da Gertec versão 2.03) a função funciona perfeitamente 

    Será que conseguimos mudar/alterar a função para funcionar também com os mais antigos (lembrando que com o TEF por troca de arquivos - Paygo)  a função de obter dados funciona com os 2 tipos de pinpad

  2. 27 minutos atrás, Daniel Simoes disse:

    ok... TEF IP, PayGo...

    Fiz um novo teste com meu PinPad.. veja:

    IMG_20200918_122110.063.jpg

     

    no Boot do PinPad, podemos ver que ele é ABECS 2.03

    image.png

    Você está fechando o Gerenciador do TEF IP, quando faz testes com o TEF PayGo Web ?

    (o Gerenciador TEF DIAL da PayGo, pode estar prendendo a porta do PinPad)

     

    Sim estou fechando o gerenciador,

    se estes numero ai representam a versão do ABECS então o meu aqui de testes é 1.08a, então é este o problema, agradeço por toda a atenção, e vou testar nos clientes que tem PinPad mais novos (e atualizados)

    Captura de tela 2020-09-18 125522.png

    • Like 1
  3. 14 minutos atrás, Daniel Simoes disse:

    @marcelosantos,

    Em qual Gerenciador TEF equivalente ao TEF_DIAL, você conseguiu a captura ? TEF IP da PayGo ?

    O equipamento pinpad, deve ter a chave Abecs 2.0 ou superior, para que esse recurso funcione...

    Verifique se na carga do PinPad, aparece a versão dessa Chave

    Daniel se uso gpPaygo ou gpTefDial o recurso funciona (tanto no DEMO, quanto na minha aplicação) 

    inclusive no mesmo computador, com o mesmo pin pad

    se com "carga" você quiser dizer ao ligar o PinPad, não aparece nada com relação a ABECS, se for outra coisa favor dizer que verifico

  4. 1 hora atrás, Daniel Simoes disse:

    Qual o passo a passo para reproduzir o problema? Voce clicou no botao do Demo de Leitura do CPF ?

    Qual o seu PinPad ?

    Favor anexar um Zip com a pasta de Logs completa 

    Daniel, copiei o TEFDDEMONF.exe e TEFDDEMONF.INI para dentro da pasta da minha aplicação onde o TEFPAygoWeb esta instalado (C:\manager\)

    Inicio o TefDDemonf.exe e clico em operações e solicitar CPF (Aqui já recebo o erro)

    O PinPad é um ingenico ipp320

    Obs.: Apagei todos os logs e fiz apenas 3 operações

    Solicitar CPF
    Venda Credito a vista de R$ 10,00
    Solicitar CPF


     

    PGWeb.rar

  5. Olá

    O componente ACBrTEFD está devolvendo o erro Chamada invalida ao solicitar o CPF 

    Teste foi feito no Demo Não Fiscal configurado como PaygoTEFWeb


    Chamada:  ACBrTEFD1.CDP('F', Saida);  // F=CPF

    LOG

    ***************EACBrTEFPayGoWeb***************
      CHAMADA INVALIDA

    PW_iPPGetUserData( PWDPIN_DIGITE_O_CPF, 11, 11, 30 )
      PWRET_31
    PW_iGetResult( PWINFO_RESULTMSG )
      [CR]  CHAMADA INVALIDA
    EACBrTEFPayGoWeb:   CHAMADA INVALIDA

    ***************EACBrTEFPayGoWeb***************
      CHAMADA INVALIDA

     

    Obs.: Configurado como TefDial ou TefPaygo o Recurso funciona normalmente

  6. 8 minutos atrás, Daniel Simoes disse:

    Na verdade esse segundo parâmetro, não é aproveitado no TEF PayGo Web...

    O índice serve mas para agrupar todas os comprovantes, do mesmo tipo, no mesmo CDC (das antigas ECFs)

    Obrigado Daniel, então vou deixar '02' mesmo
     

  7. Posso uma aplicação (Frente de Caixa com emissão de NFCe) homologada na Pay Go usando o GP "gppaygo"

    agora estamos pensando em implementar o GP "gppaygoweb" (via dll)

    e percebi que

    em nossa aplicação toda vez que vamos iniciar uma transação de venda fazemos:

     StatusTransacao := DM.ACBrTEFD.CRT( StrToCurrDef(vValorPago, 0), '02', NumDocVinculado)

    só que no demo de TEF não fiscal é utilizado o comando 

    OK = ACBrTEFD1.CRT(AValor, '01');

    ou seja o IndiceFPG_ECF é '01' e na minha aplicação '02'

    A dúvida é, este valor interfere em algo? ou só era usado para o PAC_ECF (que não utilizamos mais aqui em PE - na nossa software house)

     

  8. Em 12/06/2020 at 12:13, EMBarbosa disse:

    Oi Marcelo,

       Isso não resolveria porque você estaria destruindo o Stream antes mesmo de ser utilizado. Fiz uma possível correção na revisão 20090.

       Por favor, queira atualizar, testar e reportar qualquer problema.

     

    EMBarbosa, problema resolvido

    tudo funcionando perfeitamente

    Componente agora está redondo

  9. Isso exato,

    eu tentei colocar um "Result.free" no final da função mais não deu certo, o retorno da função ficou invalido e o qr-code não foi carregado

  10. Tem sim, só vou precisar que você me diga como é feito esse FullDebug


    mais detalhes do erro

     

    29 - 36 bytes: TStringStream x 3 -> Esse 3 no final indica que foram 3 TStringsStream que estouraram erro, no debug aqui na hora que mandou enviar uma solicitação ele passa no método de gerar o qr-code por 3 vezes, então por isso o 3 
    
    
    fiz um teste de uso normal e solicitei 5 pagamentos, o leak no final era = 15
    

     

  11. Olá a todos os envolvidos

    Refiz todos os testes e tudo esta funcionando perfeitamente

    muito boa a ideia  deste evento "procedure TDM.ACBrPicPay1WaitingTimeout(var Retry: Boolean);" -> Testei retornando true e false para a variável e funcionou como esperado

    neste evento "procedure TDM.ACBrPicPay1WaitingPayment(const Status: string; const TempoRestante: Integer);" o Retorno do TempoRestante esta funcionando perfeitamente, era justamente o que eu queria 


    o único problema agora é um Memory Leak que é estourado ao finalizar a aplicação e ter usado o método Enviar 

    ---------------------------
    Unexpected Memory Leak
    ---------------------------
    An unexpected memory leak has occurred. The unexpected small block leaks are:
    
    29 - 36 bytes: TStringStream x 3
    
    The sizes of unexpected leaked medium and large blocks are: 3116, 3116, 3116
    
    ---------------------------
    OK   
    ---------------------------

     

    eu acredito que seja esta function, (não tenho certeza)

    function TACBrPicPay.GetQRCode: TStringStream;
    
    {$IFDEF FPC}
      procedure DecodeQRCodeLazarusFPC;
      var
        vData: Ansistring;
      begin
        vData := DecodeStringBase64(fQRCode);
        Result := TStringStream.Create(vData);
        Result.Position := 0;
      end;
    {$ELSE}
      procedure DecodeQRCodeDelphi;
      var
        Input: TStringStream;
      begin
        Input := TStringStream.Create(fQRCode);
        try
          Result := TStringStream.Create(fQRCode);
          DecodeStream(Input, Result);
          Result.Position := 0;
        finally
          Input.Free;
        end;
      end;
    {$ENDIF}
    
    begin
      if fQRCode = ''  then
      begin
        Result := nil;
        EACBrPicpayError.Create('QRCode está vazio ou inválido.');
      end;
    
      fQRCode := StringReplace(fQRCode, 'data:image/png;base64,', '', [rfReplaceAll]);
    
      {$IFDEF FPC}
        DecodeQRCodeLazarusFPC;
      {$ELSE}
        DecodeQRCodeDelphi;
      {$ENDIF}
    end;

     

    Ultimo detalhe, fiz os testes também iniciando a aplicação, usando os métodos, consultar e cancelar e não há nenhum memory leak  ao fechar a aplicação 

    • Like 1
  12. 26 minutos atrás, EMBarbosa disse:

    Isso aconteceu porque o tempo de retorno estava passível de race condition. Se depois de enviar um pedido, por algum motivo a aplicação alterasse o TempoRetorno, isso alteraria o comportamento da Thread. O componente não tinha como se proteger e poderia até mesmo travar a aplicação inteira.

    Note que ao usar o seu código, o tempo de retorno vai reduzir até 1 ou zero. Daí ao fazer o próximo envio, o tempo de retorno vai ter alterado. Você teria que ficar regulando o tempo de retorno a cada envio. Além disso, se houver uma alteração nesse tempoRetorno por sua aplicação, a thread vai sobrescrever o valor.

    O melhor seria a thread retornar esse valor em outro lugar. O que eu pensei foi usar o evento WaitingPayment mesmo. Mas pra fazer isso, teria que alterar o evento atual do WaitingPayment.

    Posso fazer isso, o que acham?

    Vou verificar e retorno. Obrigado pelas sugestões...

    Eu pensei em mais uma propriedade

    teríamos tempo de Retorno que seria o tempo total, e teriamos tempoDecorrido (tempo que falta) que seria o valor retornando para a aplicação

  13. Bom dia

    "resolvi" o contador de tempo restante do demo

    adicionando o seguinte na unit ACBRPicPay.pas
     

    procedure TACBrPicPayThread.FazWaitingPayment;
    begin
      if Assigned(fACBrPicpay.fOnWaitingPayment) then
      begin
        fACBrPicpay.fOnWaitingPayment(fACBrPicpay.Status);
        fACBrPicpay.TempoRetorno :=  fACBrPicpay.TempoRetorno - 1; // adicionei esta linha
      end;
    end;


    sei que não estou usando as melhoras praticas, mais resolveu aqui pra mim, tudo funcionando agora.

    Se houver uma melhor forma de fazer, gostaria de "ouvi-los"

    • Like 1
    • Thanks 1
  14. EMBarbosa

    a principio tudo funcionado perfeitamente, ainda vou continuar com os testes aqui

    ainda não consegui pegar o TempoRetorno, entendi que ele mudou para fUltimoTempoAguardo e que preciso usar Thread.synchonize (se você me disse como fazer, posso alterar o exemplo e mandar para vocês)
     

    • Like 1
    • Thanks 1
  15. Olá a todos

    Pessoal, enquanto não sai a atualização do componente, consegui usar o "código fonte" sem erros.

    Como estou fazendo?

    Crio o Componente em tempo de execução
    Configuro todas suas propriedades
    Atribuo procedures previamente criadas a todos aos eventos (onwait, statuspayment, error) 

    Uso o componente (objeto). Aqui tudo funcionando, Enviar, Consultar e Cancelar

    no final destro o objeto com Free

    e se for usar novamente, executo tudo novamente 

     

    • Like 2
  16. 21 minutos atrás, EMBarbosa disse:

    Certo, me parece que o funcionamento por threads vai precisar alguns ajustes mesmo. Deixa eu verificar com a equipe aqui e te dou um retorno.

    Mas eu sinceramente aconselho o não implementar utilizando threads. Seu sistema vai ficar tentando contato a toda hora com o PicPay, congestionando o tráfico e tal...

    O melhor é implementar utilizando um servidor que aguarda a notificação do PicPay.

    Isso EMBarbosa, acredito que se resolver a questão da destruição e criação das threads resolva o problema do componente. 

    Quanto ao não uso de threads por conta do congestionamento vou resolver com esta variável, ACBrPicpay1.CancelarAguardoRetorno := true;, ou seja se for uma transação que não preciso do retorno no exato momento, eu deixo manual para o usuario consultar a transação no momento mais oportuno para ele

    se a negociação/transação for no checkout do PDV, então bloqueio tudo (igual ao TEF discado) e aguardo a resposta pelo tempo configurado (com a opção de cancelar o aguardo, caso o cliente não consiga realizar o pagamento) 

     

  17. EMBarbosa fiz 2 testes, vou descrever abaixo usando o demo disponível no SVN

    Iniciei o programa e solicitei o 1º pagamento, após gerar o qr-code, fiz o pagamento usando o celular, o programa estava contado o tempo e assim que confirmou o pagamento no celular o status mudou para "PAGO" na COR verde. Após isto solicitei um novo pagamento (sem fechar o programa e com um novo id de referencia) o QR-code, foi gerado, recebi no celular a solicitação de pagamento, mais o tempo não estava decrementando (no modo debug ele não passa pelo evento OnWaitPayment).

    No 2º teste, iniciei o programa solicitei um novo pagamento (com um novo id é claro), gerou o qr-code, mais não finalizei este pagamento, cancelei a "espera" setando ACBrPicpay1.CancelarAguardoRetorno := true;. Após isso gerei uma nova solicitação e novamente o demo não passa pelo evento onwaitPayment, e logo o tempo não é decrementado
     

  18. Amigos há um pequeno problema (bug) no componente ACBrPicPay,  acredito que seja a forma que o componente trata uma ação

    Ao inciar a primeira transação (cadastrar um pagamento) com o componente tudo funciona perfeitamente.

    Se tentar realizar a segunda operação (de cadastrar novamente) o componente não entra mais no evento  ACBrPicPay1WaitingPayment, é como se a thread de aguardar o status não existisse mais 

    O componente não tem um metodo "Clean", igual usamos na NFe, para reiniciar o componente, e talvez aqui esteja o problema.

    Ainda não tenho conhecimento suficiente para resolver este, se alguém puder ajudar ficarei agradecido

  19. Emanuel, vou escrever o que eu entendo ...

    O PicPay foi criado para transações e-commerce

    desta forma a integração com sua API, traz estas 2 variaveis que você sitou acima

    porque? e para que elas servem?

    ACBrPicpay1.Lojista.URLCallBack, esta URL é passada para o PicPay pois assim que o mesmo detectar uma mudança de status na transação ele avisa a sua aplicação através desta url (ele faz um post em seu servidor/aplicação) (ele não avisa o status atual avisa apenas que a transação sofreu uma alteração de status) 

     ACBrPicpay1.Lojista.URLReturn, esta segunda é para onde o cliente será redirecionado quando ele realizar o pagamento da transação via web

    todas 2 urls são obrigatórias, mas podem ser urls "invalidas" (no formato correto, mesmo sem existir) caso o seu uso seja apenas desktop

    como assim?

    você pode criar pagamentos, enviar para o PicPay, esquecer estes lá (o picpay comunica ao cliente via push notification, e email) 
    ai depois para você saber se foi pago ou não você consulta o status deste pagamento, e se estiver tudo ok, você libera a transação

    vai ficar de forma manual? vai
    é o melhor uso? não
    o PicPay foi criado para isso? não
    mas podemos usar e integrar nossas aplicações desta forma


    mais eu queria deixar de forma automática, não tem como? tem sim basta você seguir a ideia do Thulio e criar (ter) servidor web para ficar fazendo o meio de campo (escutado as respostas do PicPay, e enviado para sua aplicação desktop as repostas através do Redis) 

    é uma gambiarra? é, mas funciona 


     

    • Like 2
    • Thanks 1
  20. Pessoal atualizei meu repositório e vi as classes (fontes) do ACBr PicPay

    mais não encontrei o pacote para instalar o componente

    o instalador também ainda não foi atualizado

    Alguém pode me ajudar de como instalar este componente?

  21. Juliomar sim vi o vídeo é justamente por conta dele que estou fazendo esta pergunta

    hoje só uso numero de serie + senha 

    mais quero dar mais opções para o cliente, e sei que há uma ordem pois já vi aqui no forum, não lembro se foi um video ou em um post

    quero saber a ordem, para poder saber como o componente vai se comportar se o usuario tiver configurado mais de 1 opção

  22. Hoje podemos configurar o certificado digital nos componentes ACBr de varias formas (Arquivo PFX, Numero de Serie, URL para PFX e Dados PFX)

     

    eu gostaria de saber qual a ordem que os componentes utilizam para utilizar o certificado?

     

    ex.:
    1º  ArquivoPFX
    2º Numero de Serie
    3º URL PFX
    4º Dados PFX

     

    Já vi esta ordem em algum lugar aqui no forum, mais infelizmente não achei novamente e na epoca não havia a opção URL PFX

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