Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Michael Granados

[Resolvido] Retorno automático do PagSeguro + implementação em PH

Recommended Posts

Vamos falar sobre o retorno automático do PagSeguro. Funciona mais ou menos assim:

 

Quando o usuário efetua uma ação que valha a pena você saber (como por exemplo "O pagamento será feito via boleto, então, estamos

aguardando o pagamento") o PagSeguro manda uma mensagem para você para que você possa ficar sabendo o que aconteceu e possa atualizar

seu banco de dados.

 

Legal, como ele faz isso? Via carta?

 

Não, ele não faz isso via carta porque demoraria muito tempo. A intenção é que seu sistema atualize os dados de compra dos seus usuários

de maneira que você tenha mais tempo para tomar aquela limonada em frente ao mar.

 

Então o PagSeguro tentará conversar de igual para igual: robô para robô. Para isso ele envia essa mensagem via POST. Algo como escrever

o seguinte código html e apertar o botão submit.

 

<form action="robo_da_loja_virtual" method="post">
  <input type="hidden" name="TransacaoID" value="CTH-341-HTPS-1245V-GDCN" />
  <input type="hidden" name="Referencia" value="ID234" />
  <input type="hidden" name="DataTransacao" value="25/05/2009 11:41:35" />
  ...
  <input type="submit" value="Enviar" />
</form>

Junto com essas informações você receberá o "StatusTransacao" (que pode ser "Completo", "Aguardando Pagto", "Aprovado", "Em Análise" ou

"Cancelado") e "TipoPagamento" (que pode ser "Pagamento", "Cartão de Crédito", "Boleto" ou "Pagamento online").

 

Com isso você consegue atualizar seu banco de forma simples e fácil.

 

Hmmmm... isso vai deixar minha loja automática, vou começar agora!

 

Calma, pequeno gafanhoto... Você já pensou naquelas pessoas que devemos ter medo: os Hackers?! Sim, eu poderia criar um formulário html no meu

computador e enviar a mensagem para seu site, dizendo que minha conta está aprovada, e "automágicamente" você atualizará minha compra.

 

Para prevenir-se dessas pessoas indesejáveis, o PagSeguro trabalha com a "verificação automática". Que funciona mais ou menos assim. O seu robô

deverá enviar um POST (formulário html e clicar em submit) para o PagSeguro (endereço: https://pagseguro.uol.com.br/Security/NPI/Default.aspx) com

todos os dados recebidos mais o valor de "Comando" como "validar" e o valor de "Token" contendo o numéro do seu Token secreto que você gera no

seu painel de controle do PagSeguro em "Ferramentas" > "7. Retorno automático" > "2) Token para Conferência de Segurança".

 

Quando você submete um formulário em html você tem como resposta uma página html normal. A página de "verificação automática" é na verdade a resposta

do comando "validar" que você enviou. Se o PagSeguro realmente enviou esses dados para você, a página deverá ter escrito "VERIFICADO" caso contrário

você verá uma tela contendo o erro de "inválido".

 

O PagSeguro então me previne de Hackers, me convenceu. Vou começar agora!

 

Para começar, a primeira coisa que você deve fazer é definir para qual URL o pagseguro deve enviar seu POST informando o status do pagamnto do

seu cliente. Para facilitar sua vida, é a mesma URL de retorno de seu usuário. Você define ela no seu painel de controle do PagSeguro em

"Ferramentas" > "7. Retorno automático" > "1) Ative a URL de retorno". Você deve ativá-la e indicar qual é a url de retorno do seu cliente.

 

Eita! Mas, se a mesma URL, não vai dar conflito?!

 

Não! Quando o usuário retorna para sua página, depois de efetuar a transação ele vai via GET, ou seja, ele simplesmente é mandado para a página

sem nenhuma informação extra. Você pode recuperar o seu usuário usando a sessão (mas isso é outro assunto). Já o robô do PagSeguro conversa

com o seu robô através (e unicamente) de POSTs.

 

POST, GET, URL, Retorno, Validação, isso já está me deixando com a cuca doendo

 

Calma, para facilitar sua vida, o PagSeguro disponibilizou uma

biblioteca muito boa em PHP que deixa seu trabalho ridicularmente simples. Vou explicar

como funciona.

 

Depois de definir sua URL de retorno e gerar seu Token você deve começar a escrever seu robô.

 

Você deve indicar o seu token através de um "define" em php.

 

define ('TOKEN', 'numero_do_seu_token');

Defina também a função de retorno, ela só será executada depois que o pagseguro enviou o post, você enviou o post de verificação e o

PagSeguro disse que é valido. Essa função recebe os seguintes parâmetros:

 

retorno_automatico (
  $VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
  $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
  $StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
  $CliNumero, $CliComplemento, $CliBairro, $CliCidade,
  $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
);

Então nossa função poderia ser escrita assim:

 

function retorno_automatico (
  $VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
  $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
  $StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
  $CliNumero, $CliComplemento, $CliBairro, $CliCidade,
  $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
  if ($StatusTransacao == 'Completo' OR $StatusTransacao == 'Aprovado') {
	$banco = new BancoDeDados();
	$banco->update('TabelaDeCompras', $Referencia, 'Liberado');
	manda_email($CliEmail, "Seu pagamento foi efetuado! Você receberá seu produto em no máximo 7 dias úteis.");
  }
}

Esta função está usando um objeto genérico que chamei de "BancoDeDados" e esse objeto tem (em tese) um método "update" que atualiza

meu banco de dados para o Status de minha linha do banco de dados para 'Liberado' caso o Status que recebi do PagSeguro for 'Completo' ou

'Aprovado' (a diferença entre os dois não sei ao certo até agora, mas os dois indicam que o pagamento foi efetuado). Você pode usar o ADODB

ou PDO ou mysql na unha mesmo para atualizar seu banco de dados, fique à vontade para programar seu robô para fazer o que você quiser.

 

Também usei uma função chamada "manda_email" que, supostamente, manda um e-mail para o e-mail passado como primeiro parâmetro com a mensagem

especificada. Você pode usar sua própria biblioteca ou mesmo a função "mail" do próprio PHP.

 

Inclua o arquivo "retorno.php" que vem junto com a biblioteca. Use include/include_once/require/require_once para inserir esse arquivo ao seu

código. Particularmente, eu prefiro o require_once porque se o arquivo tiver alguma falha (conflitar com alguma função pré-definida por exemplo)

ele para o script, evitando erros futuros e o "once" faz ele não inluir novamente caso ele já tenha sido incluído.

 

require_once("retorno.php");

Lembre-se, a url de retorno é a mesma de retorno para o robô do PagSeguro, então, após esta linha escreva um html normal (ou tratamento usando

sessions) dizendo ao seu usuário: "Olha, o pagamento será feito pelo pagseguro e assim que recebermos a confirmação de pagamento, você receberá

um e-mail".

 

Em suma, seu script ficará assim:

 

<?php
require_once ('banco_de_dados.php'); # Biblioteca de banco de dados (fictícia)
require_once ('email.php'); # Funções de e-mail (fictício)
define ('TOKEN', 'numero_do_seu_token');
function retorno_automatico (
  $VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
  $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
  $StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
  $CliNumero, $CliComplemento, $CliBairro, $CliCidade,
  $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
  if ($StatusTransacao == 'Completo' OR $StatusTransacao == 'Aprovado') {
	$banco = new BancoDeDados();
	$banco->update('TabelaDeCompras', $Referencia, 'Liberado');
	manda_email($CliEmail, "Seu pagamento foi efetuado! Você receberá seu produto em no máximo 7 dias úteis.");
  }
}
require_once("retorno.php");
?><html>
  <head>
	<title>Obrigado!</title>
  </head>
  <body>
	<h1>Obrigado, falta muito pouco para liberar seu produto...</h1>
	<p>O pagamento será feito pelo pagseguro e assim que recebermos a confirmação de pagamento, você receberá um e-mail.</p>
  </body>
</html>

Simples e suncito! Quem quiser pode escrever suas dúvidas aqui que estarei pronto para responder. Abraços a todos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Todos os dados, que você diz é exatamente o que? Após a verificação ou todos os dados, independente de verificação?

 

Para o primeiro caso, você pode usar o tratamento através da superglobal $_POST. Fica mais ou menos assim:

 

<?php
if (isset($_POST)) {
  // Gravar estes dados no post
}
define ('Token', 'seu_token');
function ...

Já para o segundo caso, defina sua função "retorno_automatico" para tratar os dados como desejar. Inserindo ou não no banco de dados.

 

Exemplo:

 

function retorno_automatico (
  $VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
  $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
  $StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
  $CliNumero, $CliComplemento, $CliBairro, $CliCidade,
  $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
  if ($StatusTransacao == 'Completo' OR $StatusTransacao == 'Aprovado') {
	$banco = new BancoDeDados();
	$banco->query ("
	   INSERT INTO `tabela` (TransacaoID, Referencia, CliNome, CliEmail) VALUES
	  ($TransacaoID, $Referencia, $CliNome, $CliEmail)
	");
	manda_email($CliEmail, "Seu pagamento foi efetuado! Você receberá seu produto em no máximo 7 dias úteis.");
  }
}

Lembrando que se para cada compra podemos ter varios produtos, a variável $produtos é um array de produtos, onde cada item do array contem a seguinte estrutura:

 

array (
		  'ProdID'		  => '',
		  'ProdDescricao'   => '',
		  'ProdValor'	   => '',
		  'ProdQuantidade'  => '',
		  'ProdFrete'	   => '',
		  'ProdExtras'	  => '',
);

Logo, ele é o único que recebe um tratamento específico. Você também pode usar o "$NumItens" para saber quantos produtos o seu carrinho tem.

 

Bem, nao sei se ajudou o suficiente, mas acho que é isso... A lista de dados que vêm (e descrições de cada um) está na documentação oficial do PagSeguro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui não deu certo, fiz uma transferencia mas o banco de dados não atualizo, segue o script:

 

<?php

define ('TOKEN', 'meutoken');

function retorno_automatico (

$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,

$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,

$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,

$CliNumero, $CliComplemento, $CliBairro, $CliCidade,

$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens

) {

if ($StatusTransacao == 'Completo' OR $StatusTransacao == 'Aprovado') {

mysql_connect("localhost","userdobanco","senha");

mysql_select_db("netosjb_news2");

$consulta = mysql_query("INSERT INTO `PagSeguroTransacoes` (TransacaoID, Referencia, CliNome, CliEmail, ProdQuantidade) VALUES ($TransacaoID, $Referencia, $CliNome, $CliEmail, $produtos[ProdQuantidade])");

}

}

require_once("retorno.php");

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pergunta, você está testando isso onde? Online ou no seu localhost? Se for localhos o PagSeguro não tem como te enviar o POST.

 

Lembre que o status de "Aprovado" e "Completo" é quando o pagamento foi efetuado (cartão, boleto, transferencia online ou tranf. de pagseguro para pagseguro). O seu if pode estar barrando nesse sentido.

 

Lembre, também que não há essa variável $produtos[ProdQuantidade] e sim $produtos[0]['ProdQuantidade'] já que ele é um array de arrays.

 

O que eu posso te aconselhar é o seguinte: faça um log das informações. Mais ou menos assim:

 

<?php
if (isset($_POST)) {
  log('Recebeu o post, verificando junto ao PagSeguro', $_POST);
}
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
  log('Dados Verificados! Agora minha função funciona normalmente.', array ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
	$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
	$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
	$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
	$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
  ));
}

 

E a função log faz o seguinte:

 

function log($mensagem, $data) {
  $f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
  fwrite($f, "$mensagem\n"); # escrevendo a mensagem, mais uma quebra de linha
  fwrite($f, var_export($data, true)); # imprime os dados no arquivo de log
  fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
  fclose($f);
}

Vale a pena lembrar que o arquivo tem que ter permissão de escrita (se você estiver trabalhando em sistema UNIX isso pode não vir como padrão).

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, vou testar aqui estou testando online

 

Edit:

ae funcinou, recebi o post no pagseguro.log, só não conseguir fazer a função log funcionar ai eu fiz assim:

 

<?php
define ('TOKEN', 'xxxxxxxx');
if (isset($_POST)) {
  $f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
  fwrite($f, "'Recebeu o post, verificando junto ao PagSeguro'\n"); # escrevendo a mensagem, mais uma quebra de linha
  fwrite($f, var_export( $_POST, true)); # imprime os dados no arquivo de log
  fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
  fclose($f);  
}
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
  $f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
  fwrite($f, "'Dados Verificados! Agora minha função funciona normalmente.'\n"); # escrevendo a mensagem, mais uma quebra de linha
  fwrite($f, var_export(array ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
	$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
	$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
	$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
	$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
  ), true)); # imprime os dados no arquivo de log
  fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
  fclose($f);  
}
require_once("retorno.php");

Agora só presiso adapta pra gravar os dados no meu banco de dados

 

você sabe como posso fazer pra guarda os seguintes dados no banco de dados?

 

'TransacaoID'

'Referencia'

'DataTransacao'

'StatusTransacao'

'CliNome'

'CliEmail'

'ProdDescricao_1' (apenas do produto numero 1)

'ProdValor_1' (apenas do produto numero 1)

 

Eu fiz assim só que não deu certo:

 

mysql_connect("localhost","xxxx","xxxx"); // supondo que seja mysql
mysql_select_db("netosjb_news2");
mysql_query("INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ($TransacaoID, $Referencia, $CliNome, $CliEmail, $DataTransacao, $StatusTransacao, $produtos[0]['$ProdDescricao'], $produtos[0]['$ProdValor'])");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

sua query

 

mysql_query("INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ($TransacaoID, $Referencia, $CliNome, $CliEmail, $DataTransacao, $StatusTransacao, $produtos[0]['$ProdDescricao'], $produtos[0]['$ProdValor'])");

Está com a(s) seguinte(s) falha(s):

 

O $produtos é um array contendo arrays. Até aí tudo bem o seu "$produtos[0]" está realmente pegando o primeiro item do array (primeiro produto), mas dentro dele temos arrays associativos, então a chamada é para a palavra "ProdDescricao" e não "$ProdDescricao", que no caso, o PHP interpreta como uma variável, que provavelmente é vazia. Ficando assim sua expressão: "$produtos[0][]". Na verdade você deve fazer o seguinte:

 

mysql_query("INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ($TransacaoID, $Referencia, $CliNome, $CliEmail, $DataTransacao, $StatusTransacao, $produtos[0]['ProdDescricao'], $produtos[0]['ProdValor'])");

Experimentaê e me manda resposta :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não funcionou http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif , recebi os dados apenas no pagseguro.log

 

<?php
define ('TOKEN', 'xxxxxx');
if (isset($_POST)) {
  $f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
  fwrite($f, "'Recebeu o post, verificando junto ao PagSeguro'\n"); # escrevendo a mensagem, mais uma quebra de linha
  fwrite($f, var_export( $_POST, true)); # imprime os dados no arquivo de log
  fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
  fclose($f);  
}
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
mysql_connect("localhost","xxxx","xxxx"); 
mysql_select_db("netosjb_news2");
mysql_query("INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ($TransacaoID, $Referencia, $CliNome, $CliEmail, $DataTransacao, $StatusTransacao, $produtos[0]['ProdDescricao'], $produtos[0]['ProdValor'])");
  $f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
  fwrite($f, "'Dados Verificados! Agora minha função funciona normalmente.'\n"); # escrevendo a mensagem, mais uma quebra de linha
  fwrite($f, var_export(array ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
	$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
	$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
	$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
	$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
  ), true)); # imprime os dados no arquivo de log
  fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
  fclose($f);  
}
require_once("retorno.php");


?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

com a grande ajuda do michael consegui terminar o meu retorno automatico, agora ao receber um post da pagseguro eles são salvos no banco de dados.

 

<?php
define ('TOKEN', 'numero_do_token');
if (isset($_POST)) {
  $f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
  fwrite($f, "'Recebeu o post, verificando junto ao PagSeguro'\n"); # escrevendo a mensagem, mais uma quebra de linha
  fwrite($f, var_export( $_POST, true)); # imprime os dados no arquivo de log
  fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
  fclose($f);  
}
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
mysql_connect("localhost","user_db","senha_db"); 
mysql_select_db("nome_db");
mysql_query("INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ('$TransacaoID','$Referencia','$CliNome', '$CliEmail','$DataTransacao','$StatusTransacao','{$produtos[0]['ProdDescricao']}','{$produtos[0]['ProdValor']}')");
  $f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
  fwrite($f, "'Dados Verificados! Agora minha função funciona normalmente.'\n"); # escrevendo a mensagem, mais uma quebra de linha
  fwrite($f, var_export(array ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
	$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
	$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
	$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
	$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
  ), true)); # imprime os dados no arquivo de log
  fwrite($f, "\nSQL: INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ('$TransacaoID','$Referencia', '$CliNome','$CliEmail','$DataTransacao','$StatusTransacao','{$produtos[0]['ProdDescricao']}','{$produtos[0]['ProdValor']}')\n");
  fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
  fclose($f);  
}
require_once("retorno.php");


?>

Obrigado michal granados pela grande ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a diferença entre os dois não sei ao certo até agora, mas os dois indicam que o pagamento foi efetuado)

Li melhor hoje e fui atraz das diferenças:

Completo: Pagamento completo
Aguardando Pagto: Aguardando pagamento do cliente
Aprovado: Pagamento aprovado, aguardando compensação
Em Análise: Pagamento aprovado, em análise pelo PagSeguro
Cancelado: Pagamento cancelado pelo PagSeguro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então @silverfox,

 

o que a documentação diz eu sei, mas não sei exatamente a diferença. Acontece que meus posts vem sempre um OU outro, mas tanto para um quanto para outro a transação está aprovada, mas a diferença ainda não sei se é pelo tipo de pagamento ou se realmente tem uma diferença prática.

 

Bom, se alguém souber informe. Vou ler alguns logs de minhas contas para ver se consigo achar um padrão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A variável "StatusTransacao" pode receber as seguintes variáveis:

 

Completo: Pagamento completo

Aguardando Pagto: Aguardando pagamento do cliente

Aprovado: Pagamento aprovado, aguardando compensação

Em Análise: Pagamento aprovado, em análise pelo PagSeguro

Cancelado: Pagamento cancelado pelo PagSeguro

 

Ai pergunto:

 

Se o cliente escolheu por exemplo realizar o pagamento via boleto bancário o "StatusTransacao" inicial será "Aguardando Pagto", correto?

Quando o cliente realizar o pagamento e o status mudar para "Completo" o PagSeguro enviará para minha URL de retorno outro POST com esta informação? Se sim terei que retornar novamente uma verificação com o TOKEN ? Como funciona essa "atualização" do status da transação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Além da pergunta acima, tenho outra dúvida: para cada item do pedido é enviado uma variável deste tipo abaixo no POST de verificação?

 

ProdID_x: ID do produto

ProdDescricao_x: Descrição do produto

ProdValor_x: Valor unitário do produto

ProdQuantidade_x: Quantidade comprada do produto

ProdFrete_x: Valor do frete deste produto Formato: 0,00

ProdExtras_x Valor de taxas estras deste produto Formato: 0,00

Exemplo:

 

ProdID_1, ProdDescricao_1, ProdValor_1, ProdQuantidade_1, ProdFrete_1, ProdExtras_1, ProdID_2, ProdDescricao_2, ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

A variável "StatusTransacao" pode receber as seguintes variáveis:

 

Completo: Pagamento completo

Aguardando Pagto: Aguardando pagamento do cliente

Aprovado: Pagamento aprovado, aguardando compensação

Em Análise: Pagamento aprovado, em análise pelo PagSeguro

Cancelado: Pagamento cancelado pelo PagSeguro

 

Ai pergunto:

 

Se o cliente escolheu por exemplo realizar o pagamento via boleto bancário o "StatusTransacao" inicial será "Aguardando Pagto", correto?

Quando o cliente realizar o pagamento e o status mudar para "Completo" o PagSeguro enviará para minha URL de retorno outro POST com esta informação? Se sim terei que retornar novamente uma verificação com o TOKEN ? Como funciona essa "atualização" do status da transação?

Sim, o PagSeguro enviará outro POST informando que a transação agora é "Completo", um POST igual ao anterior, só que com o "StatusTransacao" como "Completo".

 

Particularmente eu uso apenas os StatusTransacao do tipo Completo e Aprovado, que são os únicos que me interessam. Daí vale a regra de negócio de cada um.

 

Em PHP ficaria assim...

 

if (in_array($StatusTranacao, array('Completo', 'Aprovado'))) {
  $db->update(...)
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Além da pergunta acima, tenho outra dúvida: para cada item do pedido é enviado uma variável deste tipo abaixo no POST de verificação?

 

ProdID_x: ID do produto

ProdDescricao_x: Descrição do produto

ProdValor_x: Valor unitário do produto

ProdQuantidade_x: Quantidade comprada do produto

ProdFrete_x: Valor do frete deste produto Formato: 0,00

ProdExtras_x Valor de taxas estras deste produto Formato: 0,00

 

Exemplo:

 

ProdID_1, ProdDescricao_1, ProdValor_1, ProdQuantidade_1, ProdFrete_1, ProdExtras_1, ProdID_2, ProdDescricao_2, ...

Exatamente! O PagSeguro enviará os valores de ProdExtras_X e ProdFrete_X também, mesmo que você não tenha passado. Ele enviará (provavelmente) tais valores como 0,00.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia a todos,

o retorno automático é realmente bem simples de se implantar, mas estou com uma dúvida e acredito que seja o local para discutirmos.

Tenho funcionando o pague uol e tudo tranquilo, mas fiz apenas teste, ainda não entreguei o sistema ao meu cliente, mas me surgiu uma dúvida.

Imagine que no momento que o cliente faz o pagamento, o site por acaso está fora o ar temporariamente.

O post não vai chegar, o pedido não vai ser atualizado. Apenas chegara o e-mail do pague uol confirmando e tal.

Minha dúvida é se tem como verificar uma transição especifica futuramente.

Se tiver, fica bem interessante, na lista de pedidos posso por um botão para fazer REFRESH no status, no qual vai solicitar o stats no pague uol e receber o retorno.

 

Alguém tem ideia se é possível?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia a todos,

o retorno automático é realmente bem simples de se implantar, mas estou com uma dúvida e acredito que seja o local para discutirmos.

Tenho funcionando o pague uol e tudo tranquilo, mas fiz apenas teste, ainda não entreguei o sistema ao meu cliente, mas me surgiu uma dúvida.

Imagine que no momento que o cliente faz o pagamento, o site por acaso está fora o ar temporariamente.

O post não vai chegar, o pedido não vai ser atualizado. Apenas chegara o e-mail do pague uol confirmando e tal.

Minha dúvida é se tem como verificar uma transição especifica futuramente.

Se tiver, fica bem interessante, na lista de pedidos posso por um botão para fazer REFRESH no status, no qual vai solicitar o stats no pague uol e receber o retorno.

 

Alguém tem ideia se é possível?

Acho que não tem como, estava até fazendo uns testes com navegadores como o lynx mas parece que sem javascript, o site deles é inacessível. Sim serugança nota dez. Mas sinto falta do uso de uma API para o PagSeguro. Sei lá, algo como:

 

PagSegutro->contratos(usuario='xxx', senha='xxx', token='xxx')

que retornaria uma lista de todas as TrasacoesID de sei lá, cinco últimos dias.

 

E depois um:

 

PagSeguro->Status(usuario='xxx', senha='xxx', token='xxx', trasacaoID='xxx')

e ele te retorna o status, ou ainda um

 

PagSeguro->Dados(usuario='xxx', senha='xxx', token='xxx', trasacaoID='xxx')

que retorna não só o status mas todos os dados.

 

Algumas ações também poriam ser muito úteis como.

 

PagSeguro->emitirCobranca(usuario='xxx', senha='xxx', token='xxx', para='email@xxx.com', [dados de cobrança como um formulário de POST do PagSeguro, ou seja, produto_1, preco_1, etc, etc')

E ele se encarregava de enviar e-mail para o carinha normalmente. :D

 

Não sei se eles estão pensando em fazer algo parecido e tal :D , mas que ia ajudar a comunidade e muito, ah isso ia.

 

Estou pensando em fazer uns testes com o SELENIUM (plugin para Firefox) ou algo com javascript. Mas vamos que vamos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Pessoal!

 

Primeiramente Michel, parabéns pelo excelente "tutorial", ele foi bastante util.

Referente ao status do pagamento informado pelo PagSeguro (Completo e Aprovado), eles querem dizer o seguinte:

 

Aprovado -> O Pagamento foi efetuado com sucesso pelo cliente e

Completo -> O Pagamento foi efetuado com sucesso pelo cliente e além disso o PagSeguro já liberou este valor na sua conta (isso vale também para devoluções e estornos).

 

Entendido?

 

Rodrigo Bilheiro

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.