Você já deve ter ouvido falar no Retorno Automático de dados do PagSeguro. Com ele você consegue sincronizar os dados de sua loja com os dados em suas transações no PagSeguro. O que é interessantíssimo pois com ele não precisamos ficar verificando cada e-mail que chega do PagSeguro e atualizando o nosso banco de dados.
** nota: Que fique claro que neste POST falo sobre carrinho próprio
Basicamente, uma aplicação funciona assim: Você monta uma compra e grava-a no seu banco de dados. Tomemos como exemplo duas chupetas doces no valor de R$ 3,40. Isto gerará uma compra no valor de R$ 6,80. Então, com isso montamos um formulário de pagamento que fará um POST para o PagSeguro.
Quando fizer isso, use um código de referencia para essa compra, se você usa auto_increment no seu banco de dados fica a dica para usar esse campo como código único, mas você pode gerar um número único baseado na data/hora atual mais um número aleatório. Em PHP você pode usar o método uniqid para isto.
O seu formulário ficará mais ou menos assim:
1 2 3 4 5 6 | ... <input type="hidden" name="referencia" value="codigo_unico_de_compra" /> ... <input type="hidden" name="valor" value="340" /> <input type="hidden" name="quant" value="2" /> <input type="hidden" name="descr" value="chupeta doce" /> |
O que acontece?
Quando o comprador efetuar uma ação na compra, se você configurar e ativar uma URL de retorno automático no seu painel do PagSeguro, você receberá todos os dados da compra, inclusive o status da compra. A URL que você configurar como retorno automático é a mesma para a qual o usuário será redirecionado após o termino da transação no PagSeguro, seja ela emissão de boleto, pagamento via cartão de crédito ou débito ou mesmo transação entre contar PagSeguro.
Assim, você pode usar o código de referencia para saber a qual compra você vai atualizar. Mas, se é a mesma URL, como eu sei quem é o retorno automático? O retorno automático é um POST, a volta do usuário é GET. Um código bem simples em PHP para atualizar se assemelha bastante a este:
1 2 3 4 5 6 7 | <?php if ($_POST) { $compras = new Compras; $compras->get($_POST['Referencia']); $compras->set('status', $_POST['StatusTransacao']); die('Esta mensagem somente sera vista pelo robo do PagSeguro.'); } |
Simples, né?! Mas o mundo não é perfeito, ainda mais na internet, então devemos nos prevenir de crackers (hackers malvados =P ). Imagine se eu efetuo uma compra e não pago. Então crio um formulário apontando para a URL de retorno à qual fui redirecionado com o StatusTransacao como Aprovado? Sim caro leitor, a pessoa efetua a compra sem pagar.
Pensando nisso, o PagSeguro fez um robôzinho onde você pode verificar se quem mandou o POST realmente foi ele. Funciona assim: Ao receber o POST, envie um POST para o robô e leia a saída. É como se você escrevesse um formulário direcionado para a URL de verificação de POST do PagSeguro e visse a página, ela deve aparecer como um arquivo de texto escrito VERIFICADO ou FALSO, caso os dados não batam com os dados contidos no PagSeguro.
Mas, para que a segurança seja maior, você deve enviar junto com todos os dados do PagSeguro os campos “Comando” com o valor “Verificar” e o campo “Token” com o código gerado no painel de controle do PagSeguro. Se você não enviar esses valores, o PagSeguro retornará FALSO, afinal, ele também verifica se você é você usando esse token que só você e o PagSeguro conhecem.
Em PHP você pode usar cURL para verificar esse POST, o código não é tão complicado de implementar assim. Apenas deve verificar que a URL do robô é https e que você está enviando um POST, então flags especiais devem ser usadas. Se você quiser, também pode usar a biblioteca PHP para PagSeguro desenvolvida pela visie que já faz essa verificação para você, apenas precisando que você faça a sua função como se não precisasse verificar nada.
A grosso modo, podemos alterar o nosso código para o seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | define('TOKEN','código gerado no painel de controle do PagSeguro'); # Aqui vai seu Token include('retorno.php'); # Incluindo o arquivo da biblioteca function retorno_automatico ( $VendedorEmail, $TransacaoID, $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento, $StatusTransacao, $CliNome, $CliEmail, $CliEndereco, $CliNumero, $CliComplemento, $CliBairro, $CliCidade, $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens) { # E aqui, o nosso código $compras = new Compras; $compras->get($_POST['Referencia']); $compras->set('status', $_POST['StatusTransacao']); die('Esta mensagem somente sera vista pelo robo do PagSeguro.'); } |
Ok, nosso mundo mudou bastante, colocamos proteção para o nosso cracker e ele vai ter um pouco mais de trabalho. Mas ainda temos um problema, quer dizer, uma solução… que gerou um problema: firebug.
Como todos nós estamos carecas de saber, o formulário que enviamos ao PagSeguro é um html normal que pode ser alterado de diversas formas, inclusive alterar os valores. Então, imaginemos o seguinte ambiente: você tem uma loja onde o usuário compra uma máquina de lavar por R$ 1.200,00. Para aproveitar mais ainda, ele compra três máquinas. Então ele chega no checkout e altera o formulário final para 5000, ou seja, R$ 50,00. Então ele pagará muito mais barato pela máquina, certo? Certo!
Certo?! Como assim?
Sim, ele vai pagar mais barato, porque burlou o sistema, cabe a você ter tino e devolver o dinheiro do infeliz. Mas calma! Você não precisa verificar todas as contas na mão para saber se a pessoa está burlando o sistema. Basta você conferir o valor do POST de retorno com o valor da compra.
Lembra que gravamos a compra no banco antes de enviar o comprador para o PagSeguro usando um código único? Coloque também o valor total da compra. Quando você receber o POST do retorno automático, verifique o valor da compra pois se a pessoa alterar o valor do input com a firebug (ou similar) o sistema saberá que não é válido. Veja como fica o nosso código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | define('TOKEN','código gerado no painel de controle do PagSeguro'); # Aqui vai seu Token include('retorno.php'); # Incluindo o arquivo da biblioteca function retorno_automatico ( $VendedorEmail, $TransacaoID, $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento, $StatusTransacao, $CliNome, $CliEmail, $CliEndereco, $CliNumero, $CliComplemento, $CliBairro, $CliCidade, $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens) { # E aqui, o nosso código $total = 0; foreach ($produtos as $produto) { $total += ($produto['ProdValor'] * $produto['ProdQuantidade']) + $produto['ProdFrete'] + $produto['ProdExtras']; } if ($total == $compras->total) { $compras = new Compras; $compras->get($Referencia); $compras->set('status', $StatusTransacao); } die('Esta mensagem somente sera vista pelo robo do PagSeguro.'); } |
Simples assim! Apenas pegamos todos os produtos e somamos o produto de seus valores pelas suas respectivas quantidades, aliado aos valores extras e de frete. Quanto mais campos você verificar no retorno automático, melhor. Mas não exagere pois poderá falhar em alguns casos. Por exemplo você pode enviar um e-mail para o PagSeguro e a pessoa decidir pagar com outra conta (da esposa ou da empresa, por exemplo).
Esse retorno automático só funciona se estivermos usando o carrinho próprio? Estou usando o carrinho PagSeguro e nem macumba me faz receber o POST do PagSeguro, criei minha própria classe para receber e não funcionou, peguei a da Visie e também não, entrei em contato com o PagSeguro e nem se quer deram atenção disseram “está funcionando normalmente use este script pronto” apontando para a classe da Visie e ficou por isso mesmo.
Já tentei pra caramba e nada. Precisa ter alguma funcionalidade extra do lado do servidor?
Falopa!
Sim,
Só dunciona se for o carrinho próprio. Você ainda deve configurar
o retorno automático no painel de controle de sua conta no PagSeguro,
informando uma URL de retorno.
@dgmike
Já tentei várias vezes e nada, estava verificando e uso sim o carrinho próprio, usei inclusive aquele código que tu publicou no fórum anos atrás pra receber o retorno automático e não consigo fazer funcionar.
Nem o negócio do log funciona, isto é, não aparece nada nos logs. Muito estranho, tem alguma informação adicional que tu possa me dar?
Falopa!
@dgmike
Cara tentei, novamente e nada, ativei o retorno automático, usei a biblioteca PagSeguro que tu publicou aqui no blog e também não recebi nem os dados que deveriam ser gravados no log.
Criei uma página exemplo http://vibemidia.com/controle2/pedidos/add nela tem o botão para finalizar a compra e é nela também que recebo o retorno automático, mesmo enviando todos os campos preenchido não recebo o retorno (o log continua limpo).
Você poderia verificar se o html do formulário está tudo correto? Ao meu ver está, deve haver algum problema de “configuração” que desconheço.
Falopa!