Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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>Carregando comentários...