Ir para conteúdo
  • Cadastre-se

dev botao

Parâmetros TEFD (VeSPague)


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

Recommended Posts

Boa tarde colegas!

Estou tentando passar alguns parâmetros para o tef, para que os mesmos não tenham sua coleta solicitada ao usuário.

Estou utilizando o VeSPague e passando os parâmetros das seguinte maneira:

    tefd.TEFVeSPague.ReqVS.AddParamString('transacao_valor_taxa_embarque','0');

    tefd.TEFVeSPague.ReqVS.AddParamString('transacao_valor_taxa_servico','0');

    tefd.TEFVeSPague.ReqVS.AddParamString('transacao_valor_saque','0');


    if tefd.TEFVeSPague.CRT(valorJvValidateEdit.AsCurrency,'4') then

Depurando o processo, eu notei que os parâmetros de fato são adicionados, mas ao chamar método CRT, eles são "zerados" antes do envio do comando.

Minha dúvida é se estou incluindo os parâmetros de forma errada, no momento errado ou se realmente tem algum bug na sequência do processo.

Alguém já fez esse tipo de processo?

Agradeço desde já qualquer ajuda ou dica.

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

Tentou usar o envento "OnObtemCampo" especifico do VeSPague?

Tentei Regys.

Tanto o OnObtemCampo quanto o OnExibeMenu.

Não funcionou :(

Pelo que eu vi aqui a primeira linha do método CRT do VeSPague chama a sequência de métodos VerificarTransacaoPagamento( Valor ) -> VerificaAtivo -> ATV -> IniciarRequisicao que dá um Req.Clear;

Acredito que seja ai que os parâmetros sejam "zerados".

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Tente no "OnAntesFinalizarRequisicao", você pode fazer algo como:



if Req.Header = 'CRT' then
begin
tefd.TEFVeSPague.ReqVS.AddParamString('transacao_valor_taxa_embarque','0');
tefd.TEFVeSPague.ReqVS.AddParamString('transacao_valor_taxa_servico','0');
tefd.TEFVeSPague.ReqVS.AddParamString('transacao_valor_saque','0');
end;

[/code]

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

Tente no "OnAntesFinalizarRequisicao", você pode fazer algo como:



  if Req.Header = 'CRT' then

  begin

    tefd.TEFVeSPague.ReqVS.AddParamString('transacao_valor_taxa_embarque','0');

    tefd.TEFVeSPague.ReqVS.AddParamString('transacao_valor_taxa_servico','0');

    tefd.TEFVeSPague.ReqVS.AddParamString('transacao_valor_saque','0');

  end;


Também não funcionou Regys.

O problema é que o CRT manda um comando pra ativar (ATV) o serviço do vespague antes, e nesse momento o ReqVS que já tinha sido "setado" é "zerado" e preenchido com os parâmetros para esse comando.

Esses parâmetros teriam que ser passados exatamente no envio do CRT, ou preservados para serem novamente informados no comando CRT propriamente dito.

Os eventos pelo que eu pude perceber são disparados depois do comando CRT.

Fiz um teste alterando o fonte e enviando os parâmetros exatamente no CRT e funcionou certinho.

:?

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

Talvez seja o caso de alterar os fontes e acrescentar um evento onde possasse passar os parâmetros, poste aqui sua alteração que vou dar uma olhada.

Então Regys, o métdo que "zera" os parâmetros é o VerificarTransacaoPagamento

Function TACBrTEFDVeSPague.CRT( Valor : Double; IndiceFPG_ECF : String;

   DocumentoVinculado : String = ''; Moeda : Integer = 0 ) : Boolean;

var

  Retorno : Integer ;

begin

  VerificarTransacaoPagamento( Valor ); //////////////////////////// Depois desse métodos os parâmetros ReqVS são zerados


  Retorno := FazerRequisicao( fTransacaoCRT, 'CRT', Valor, DocumentoVinculado) ; //////////// Método FazerRequisicao foi o que eu alterei


  if Retorno = 0 then

     Retorno := ContinuarRequisicao( False ) ;  { False = NAO Imprimir Comprovantes agora }


  Result := ( Retorno in [0,1] ) ;


  if Result then

     ProcessarRespostaPagamento( IndiceFPG_ECF, Valor )

  else

     FinalizarRequisicao;

end;
O método FazerRequisicao que eu alterei na classe ACBrTEFDVeSPague Detalhe é que esse método tem um parâmetro ListaParams que não é utilizado na chamada do mesmo pelo CRT.
Function TACBrTEFDVeSPague.FazerRequisicao( Transacao : String;

   AHeader : AnsiString = ''; Valor : Double = 0; Documento : AnsiString = '';

   ListaParams : AnsiString = '') : Integer ;

begin

   if fpAguardandoResposta then

      raise Exception.Create( ACBrStr( 'Requisição anterior não concluida' ) ) ;


   fCancelandoTransacao := (AnsiUpperCase(Transacao) = 'ADMINISTRACAO CANCELAR');


   ServicoIniciar ;


   ReqVS.Servico := 'executar' ;

   ReqVS.AddParamString( 'transacao', Transacao ) ;


   ///////////////////////////////////////////////////////////////////////////////// Esses foram os que eu inclui para testar

   ReqVS.AddParamString('transacao_valor_taxa_embarque','0');

   ReqVS.AddParamString('transacao_valor_taxa_servico','0');

   ReqVS.AddParamString('transacao_valor_saque','0');

  /////////////////////////////////////////////////////////////////////////////////



   if Valor > 0 then

      ReqVS.AddParamDouble('transacao_valor', Valor);


   // V&SPague não coleta o Documento


   if TransacaoOpcao <> '' then

      ReqVS.AddParamString( 'transacao_opcao', TransacaoOpcao ) ;


   if ListaParams <> '' then

      ReqVS.Params.Add(ListaParams);


   TransmiteCmd ;


   Result := RespVS.Retorno;


   Resp.Clear;


   if not (Result in [0,1]) then

      exit ;


   with TACBrTEFDRespVeSPague( Resp ) do

   begin

     if Documento = '' then

        Documento := IntToStr(fpIDSeq) ;


     { Adiciona Campos já conhecidos em Resp, para processa-los em

       métodos que manipulam "RespostasPendentes" (usa códigos do G.P.)  }

     Conteudo.GravaInformacao(899,100, AHeader ) ;

     Conteudo.GravaInformacao(899,101, IntToStr(ReqVS.Sequencial) ) ;

     Conteudo.GravaInformacao(899,102, Documento ) ;

     Conteudo.GravaInformacao(899,103, IntToStr(Trunc(SimpleRoundTo( Valor * 100 ,0))) );


     // Grava valor de "Transacao|Sequencia" em 27(Finalizacao) para usar no CNF, NCN

     Conteudo.GravaInformacao(27,0, Transacao+'|'+IntToStr(ReqVS.Sequencial) );

     Resp.TipoGP := fpTipo;

   end;


   Req.Clear;

   Req.Header := AHeader;

   Req.ID     := ReqVS.Sequencial;

   Req.DocumentoVinculado := Documento;

   Req.ValorTotal := Valor;

end;

Bom, fico aguardando você analisar a possível alteração Regys.

Mas desde já obrigado!!

Abraço!

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

Pelo que olhei nos fontes o ATV não está limpando a lista de parâmetros, tem certeza que o seu arquivo está atualizado?

Bom dia Regys!

Sim está tudo atualizado. Estou com a última versão do ACBr.

Só pra ter certeza de que eu não tinha programado nenhum evento incorretamente, fiz os mesmos testes no TEFDemo, incluindo os parâmetros tanto antes do CRT, quanto nos eventos que você sugeriu, mas infelizmente não funcionou.

Em algum momento desse método VerificarTransacaoPagamento( Valor ); os parâmetros são "zerados".

Achei que fosse no ATV, mas se você disse que não, vou tentar descobrir exatamente onde é ai posto aqui.

Obrigado!

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

Pelo que olhei nos fontes o ATV não está limpando a lista de parâmetros, tem certeza que o seu arquivo está atualizado?

Boa tarde Regys!

Descobri exatamente onde os parâmetros são "limpos".

Quando é chamado o ATV, o mesmo chama o método ServicoIniciar da classe ACBrTEFDVeSPague.

procedure TACBrTEFDVeSPague.ServicoIniciar ;

begin

  repeat

     ReqVS.Servico := 'iniciar' ; /////////////////////////////////////////////// Chama o SetServico

     ReqVS.AddParamString('aplicacao',fAplicacao);

     ReqVS.AddParamString('versao',fAplicacaoVersao);


     TransmiteCmd;


     if RespVS.Sequencial < ReqVS.Sequencial then

        ReqVS.Sequencial := RespVS.Sequencial;


  until (RespVS.Retorno = 1) and (RespVS.Servico = ReqVS.Servico) ;

end ;
procedure TACBrTEFDVeSPagueCmd.SetServico(const AValue : AnsiString) ;

begin

  fsParams.Clear; ///////////////////////////////////////////////////// Exatamente aqui que os parâmetros são zerados

  fsIsColeta := False ;

  Sequencial := fsSequencial + 1;

  Retorno    := 1 ;


  AddParamString('servico',AValue);

end;

Acho que o jeito é criar um evento como você sugeriu.

O que você acha?

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

Uma pergunta em qual modelo do VSPague está homologando?

Boa tarde Juliomar!

Na verdade já sou homologado. Uso o modelo background.

Só estou trocando o processo de transação, coleta, etc, que eu fiz na mão, pelo componente ACBrTEFD que facilita muito as coisas e permite que integração com outros Softwares de TEF seja mais fácil.

Os "probleminhas" que por enquanto me impedem de concluir a migração são esses:

1 - Permitir que eu possa passar parâmetros para que certas informações não sejam coletadas junto ao usuário. Discutido nesse tópico.

2 - No cancelamento também encontrei um probleminha, quando o campo é alfanumérico, mas esse já corrigi e postei aqui

3 - E por último um que eu encontrei agora, que na verdade é apenas um campo que uso para conciliação de dados, mas que não está sendo guardado nas propriedades do ACBrTEFD. O campo é o nsu da rede que vem na tag do vespague TRANSACAO_NSU_REDE.

Resolvendo o 1 e o 3 a integração está completa :)

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Guiuliano,

A unica correção sugerida é a que está no post acima ?

Em relação aos pontos levantados no inicio desse post, há mais alguma correção pendente nos fontes do SVN ?

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 para o comentário
Compartilhar em outros sites

Guiuliano,

A unica correção sugerida é a que está no post acima ?

Em relação aos pontos levantados no inicio desse post, há mais alguma correção pendente nos fontes do SVN ?

Não Daniel. Só essas mesmo.

O evento para passar os parâmetros antes do CRT e a coleta da tag transacao_nsu_rede mapeando a mesma para uma propriedade como as demais.

No mais tudo testado e Ok.

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

Você poderia anexar no tópico todas as Units alteradas para eu comparar com os meus fontes ?

Eu não alterei Daniel.

Estava esperando uma posição do Regys pra ver se essa seria a solução mesmo.

Mas se quiser eu faço a alteração sem problemas.

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Acho que compreendi o que vc deseja... No SiTef também tem algumas perguntas indesejadas como Taxa de Serviço e de Embarque (nem sei para que servem)

Na homologação é importante exibi-las... mas vc pode "responder" algo para elas sem abrir a janela de perguntas... No meu caso (SiTEF) faço algo como:


procedure TFrVenda.CliSiTefObtemCampo(Titulo: String; TamanhoMinimo,
TamanhoMaximo: Integer; TipoCampo: Integer;
Operacao: TACBrTEFDCliSiTefOperacaoCampo; var Resposta: AnsiString;
var Digitado: Boolean; var VoltarMenu: Boolean);
begin

......
if TipoCampo 504 then // Taxas de Servico e Taxa de Embarque
begin
Digitado := True;
VoltarMenu := False;
Resposta := '0,00' ;
end ;
....
end ;
[/code]

Acho que para o VSPague você poderia usar dentro do evento OnObtemCampo o Titulo ou Tipo para automatizar a resposta...

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 para o comentário
Compartilhar em outros sites

Mas isso não foi necessário para sua homologação ?

Não foi não Daniel.

Na verdade eu já sou homologado.

Sou estou fazendo a troca das rotinas que eu fiz não "mão," pelo componente ACBrTEFD, e essas foram as diferenças que eu encontrei.

Tirando o cancelamento que tinha o problema, essas outras duas são meramente funcionais.

A questão de passar os parâmetros do que tu não quero que seja coletado junto ao usuário, vai economizar tempo e evitar que o mesmo acabe informando algo que não deveria.

E a questão da coleta da tag transacao_nsu_rede, é para a conciliação dos dados que vem das redes com as informações que coletamos em cada transação de cartão.

Quem for fazer essa conciliação e utilizar o VeSPague vai precisar com certeza dessa informação.

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Em relação ao NSU, vc não consegue obtê-lo em: OnDepoisConfirmarTransacoes ?

Veja o exemplo do Demo do ACBrTEFD

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 para o comentário
Compartilhar em outros sites

Em relação ao NSU, vc não consegue obtê-lo em: OnDepoisConfirmarTransacoes ?

Veja o exemplo do Demo do ACBrTEFD

É consegui obter sim Daniel.

for i := 0 to ACBrTEFD1.Resp.Conteudo.Count - 1 do

  begin

     Linha := ACBrTEFD1.Resp.Conteudo.Linha[I];


     Chave := LowerCase( Linha.Chave );

     Valor := StringToBinaryString( Linha.Informacao.AsString );


     if Chave = 'transacao_nsu_rede' then

        showmessage(valor);

  end;

Na verdade nesse evento consigo obter qualquer informação.

Mais uma vez obrigado Daniel!

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

Acho que compreendi o que vc deseja... No SiTef também tem algumas perguntas indesejadas como Taxa de Serviço e de Embarque (nem sei para que servem)

Na homologação é importante exibi-las... mas vc pode "responder" algo para elas sem abrir a janela de perguntas... No meu caso (SiTEF) faço algo como:


procedure TFrVenda.CliSiTefObtemCampo(Titulo: String; TamanhoMinimo,

   TamanhoMaximo: Integer; TipoCampo: Integer;

   Operacao: TACBrTEFDCliSiTefOperacaoCampo; var Resposta: AnsiString;

   var Digitado: Boolean; var VoltarMenu: Boolean);

begin


......

        if TipoCampo 504 then    // Taxas de Servico e Taxa de Embarque

        begin

            Digitado   := True;

            VoltarMenu := False;

            Resposta   := '0,00' ;

        end ;

....

end ;

Acho que para o VSPague você poderia usar dentro do evento OnObtemCampo o Titulo ou Tipo para automatizar a resposta...

Funcinou legal também.

Só rezo pra eles não trocarem essas strings do título, hehehehehe.

Obrigado!

Att.

Giuliano Naspolini Ribeiro

Automalog Consultoria e Sistemas Ltda

Link para o comentário
Compartilhar em outros sites

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