Trabalhando com Retorno automático do PagSeguro

Update: no tutorial foi utilizado a versão 2.0 da biblioteca, sendo que atualmente está na versão 2.1.0 . Fiz as modificações que sejam compatível para essa nova versão.

Nesse tutorial vamos falar sobre retorno automático do pagseguro, e como utiliza a nova biblioteca para trabalhar com ele. A idéia do retorno automática é notificar o vendedor de cada mudança de status da transação da compra, como se foi pago pelo cliente, se o dinheiro pode ser transferido para sua conta, etc.

Essa notificação é feita através de um POST, onde você precisa validar consultando o pagseguro com seu token gerado no painel do pagseguro, e assim você consegue ter acesso ao status dessa transação.

O que posso fazer com esse status da transação?

Você pode realizar alteração no status do pedido, informando que foi realizado o pagamento, tanto para você, vendedor, quanto para o cliente, e assim você começa o processo de envio do produto.

Para ficar mais fácil, vou simular uma modelagem simples, onde terá uma tabela de clientes, produtos, pedidos, pedidos produtos.

Veja que na tabela pedidos temos dois campos importantes para nosso exemplo: clientes_id, que vai informar de quem pertence aquele pedido;  o campo status, como tipo inteiro, onde vamos informar o status do pedido, podemos dizer que 1 será aguardando pagamento, 2 liberado pra envio .

Não vou entrar na questão de explicar a modelagem em si, porque no nosso exemplo iremos só modificar a tabela pedidos, já que nosso foco é o retorno automático do pagseguro

Antes, você precisa configurar no pagseguro a URL de Retorno:

https://pagseguro.uol.com.br/preferences/automaticReturn.jhtml

E depois necessário gerar um Token, para realizar a verificação do retorno automático.

https://pagseguro.uol.com.br/preferences/automaticReturn.jhtml

Agora vamos ao código comentado:

<?php

//Verifica se foi enviado um método post
if($_SERVER['REQUEST_METHOD'] == 'POST'){

	//Recebe o post como o Tipo de Notificação
	$tipoNotificacao   = $_POST['notificationType'];

	//Recebe o código da Notificação
	$codigoNotificacao = $_POST['notificationCode'];

	//Verificamos se tipo da notificação é transaction
	if($tipoNotificacao == 'transaction'){

		//Chama a classe para utilizar a biblioteca do pagseguro
		require_once "PagSeguroLibrary/PagSeguroLibrary.php";

		//Informa as credenciais : Email, e TOKEN
		$credencial = new PagSeguroAccountCredentials('seuemail', 'CÓDIGO DO TOKEN');

		//Verifica as informações da transação, e retorna 
                //o objeto Transaction com todas as informações
		$transacao = PagSeguroNotificationService::checkTransaction($credencial, $codigoNotificacao);

		//Retorna o objeto TransactionStatus, que vamos resgatar o valor do status
		$status    = $transacao->getStatus();

		/**
		 * Verificamos se realizado o pagamento para mudar no banco de dados
		 * O valor 3 se referente o tipo de status, no caso informando
		 * que cliente realizou o pagamento.
		 * https://pagseguro.uol.com.br/v2/guia-de-integracao/documentacao-da-biblioteca-pagseguro-em-php.html#TransactionStatus
		 */
		if($status->getValue() == 3){
			/**
			 * Pegamos o código que passamos por referência para o pagseguro
			 * Que no nosso exemplo é id da tabela pedido
			 */
			$idPedido = $transacao->getReference();

			//Inclue o arquivo da conexão do banco
			require_once "config/conexao.php";
			/**
			 * Irei colocar o SQL diretamente apenas para fins didático
			 * Esse SQL será para mudança de status do pedido ( 2 => liberado pra envio ), e informar a hora
			 * da última modificação do pedido
			 */
			$sql = "UPDATE pedidos SET status = '2', modificado = NOW() WHERE id = '$idPedido'";
			//Executa o SQL
			mysql_query($sql);
				
			/**
			 * você pode depois realizar a mudança de status disparar um e-mail
			 * tanto para o cliente, quanto para você informando que
			 * já pode enviar o produto
			 *
			 */
		
		}
	}

}

Claro, existem outras maneiras de trabalhar como retorno automático, você pode consultar a documentação das classes do pagseguro, ver outras formas de realizar esse procedimento. Espero ter ajudado, e até a próxima.

49 thoughts on “Trabalhando com Retorno automático do PagSeguro

  1. David realmente e muito facíl , a principio e como cadastro de novos usuarios com o envio de e-mail para confirmação!

    O importante a se notar ai e o status da tabela pedidos , obnrigado por mais essa incrével contribuição !

    1. Com essa nova API do pagseguro realmente facilitou muito. Só falta o pagseguro desenvolver um sandbox para realizar testes, ai sim ficaria muito bom.

  2. Olá David , gostária de tirar uma dúvida já monetei o script de retorno automatico graças a esse tutorial que ajudou bastante, mais minha dúvida é a seguinte, posso colocar o arquivo de conexão logo no inicio, pois trabalho com um fuction pra conexã com o banco e também devo ativar o metodo de pagamento via API lá no pagseguro ?

    1. Rafael, pode sim sem problema. No caso coloquei perto do final, pq só precisaria dela naquele momento. Não entendi do ativar metodo de pagamento, isso é quando a pessoa realizar a compra, vc consegue com a API saber q tipo pagamento, taxas, etc

      1. Obrigado por responder, o motivo da pergunta via API, pois lá no Pagseguro antes de ativar eu estava com o script já totalmente feito e com o link já colocado do retorno assim como no seu tutorial, mais só funcionou depois que ativei APi de notificações do pagseguro, bom resumindo esta tudo certo, muito obrigado por esse tutorial maravilhoso espero mais tutoriais como esse !

  3. Boa noite!

    O $_POST[‘notificationCode’] está retornando um código diferente do código gerado lá na conta do PagSeguro!

    Como faço para resolver isso? É possível?

    Obrigado.

    1. Maicon , nunca aconteceu isso comigo, no caso se as informações estão vindo diferente, creio que seja mais indicado ver o suporte do pagseguro.

  4. Olá David, queria saber uma coisa… se eu fizer uma função pra já calcular o valor do frete pelo cep da pessoa no site, como eu faço pra já passar o valor do frete também pro pagseguro? direto pela classe? aguardo…

  5. Mals ai David, encontrei na documentação deles é o $variavel->setShippingCost(); 🙂 msm assim se tiver algo a acrescentar que eu deva saber, é só me responder ae vlw

    1. O ideal é sempre consultar a documentação, se possível ter a documentação já aberta numa página para consulta.

  6. Olá David, tudo bem?

    Estou tentando fazer a integração com o recebimento de notificações via API de notificações, mas não estou obtendo êxito.
    Esse script é para o retorno automático ou para a API de notificações?

    Agradeço

    1. Olá Andreia.

      Esse script é para o retorno automático, usando API do Pagseguro. Como informado no tutorial, o arquivo que recebe o retorno automático, receberá um POST a cada muda status relacionado a compra.

  7. Parabens excelente tutorial!!! Gostaria de saber como eu poderia integrar a compra feita com o usuario do pagseguro com o usuario que está cadastrado no proprio site. Poderia me dar uma ajuda?

    1. Guilherme , dá uma olhada nesse tutorial. Nesse caso utilizo um formulário para resgatar os dados, e não guardo o valor no banco. A diferença, é que você vai resgatar esses valores do banco de dados, da tabela do cliente, e guardar a informação do carrinho em uma tabela de pedido, com as informações gerais do pedidos, e uma tabela pedido_produto que vai guarda os produtos do pedido

      http://www.davidchc.com.br/tutoriais/php-tutoriais/integracao-com-pagseguro/

  8. Poxa vida, estou a algumas horas tentando fazer este código funcionar e sempre que faço uma transação não registra o retorno, até testei com um arquivo de log e nada!

    A página está correta, o token está correto, o que pode estar acontecendo? Será que teve alguma modificação recente?

    Quando simplesmente peço para ele gravar tudo que há dentro de um POST ele retorna o seguinte:

    Key: ProdExtras_1
    Entry: 0,00
    Key: notificationType
    Entry: transaction
    Key: ProdExtras_1
    Entry: 0,00
    Key: notificationType
    Entry: transaction

    Onde key é o nome do $_POST e Entry é o valor dele.

    1. Olá Vitor, se não me engano, acho precisa habilitar a opção de trabalhar com API do pagseguro, lá no painel eles, talvez seja por isso o problema

  9. Olá,

    Primeiro parabéns pelos tutoriais, usei o tutorial para carrinho e funcionou perfeitamente.

    Para o retorno estou com dúvidas…

    Em que ponto eu chamo o arquivo de retorno com o código descrito por você?

    Como eu tenho que fazer para gravar no banco e em qual momento tenho que fazer para ter o código do pedido? a intenção é poder informar o cliente da alteração do status.

    1. Olá Ronaldo. Essa pagina será indicada lá no pagseguro, então a cada modificação do pagseguro será envia um POST, como fosse um formulário de contato, dentro dessa POST será as informações da transação, e ai vc faz a verificação com a biblioteca como no tutorial. Na maioria dos casos vc enviar um código de referencia, que seria o código do Pedido, e tendo o código pedido vc consegue recuperar o nome e email do cliente.

  10. David, não sei o que esta acontecendo no meu mas o o script não esta encontrando nenhum post enviado pelo pagseguro. não sei mais o que fazer!

    Agradeceria uma atenção!

    Valeu!

  11. Olá, gostei muito do seus tutoriais de carrinho de compras, integração com o Pagseguro e esse de retorno! Parabéns! Mas tenho uma dúvida, na hora da integração, na finalização da compra, como faço para enviar o código do pedido para o pagseguro ou o id do cliente, para eu poder salvar depois no retorno e atualizar o banco?

    Obrigado!

    1. Vc precisa enviar o código pedido. Como vc disse viu já meu tutorial, vc vai adicionar no metodo setReference:

      $pagseguro->setReference($id_do_pedido);
      
  12. Olá David, primeiro gostaria de agradecer pelo seu excelente trabalho, passarei a acompanha-lo de perto.
    Tenho a seguinte dúvida, configurado o retorno, a partir do momento que muda a o status da compra, eu preciso gerar um novo retorno com esse arquivo, preciso executar o mesmo, ou é desnecessário?

    1. Tiago, toda vez que mudar a situação do status no pagseguro, ele vai enviar um POST pra o arquivo que você indicou lá pra o retorno automático, nesse POST irá vir as informações, como codigo do pedido, e com isso vc pode fazer alterações no seu pedido de mudança de status no seu pedido automaticamente.

  13. Só um detalhe, cuidado com o SQL injection na linha:

    $sql = “UPDATE pedidos SET status = ‘2’, modificado = NOW() WHERE id = ‘$idPedido'”;

    Ideal utilizar a função php mysql_real_escape_string

    1. isso é @Vitor vdd, numa situação real, não usaria o mysql_, e sim PDO, com prepare statement. Mas é tomar cuidado mesmo.

  14. Opa eae Davic CHC cara teu código é perfeito só me resta uma dúvida… como fica a configuração no painel do pag seguro… qual as opções que devem ser ativada e qual daquelas que tem que ser especificada a URL?

  15. Já tentei de tudo, mas até algora não consegui fazer funcionar. Usei o script que achei super bem explicado, mas nao funcionou!! O problema é o retorno automático não esta enviando post nenhum, entao nada acontece.
    O que fiz:
    -Gerei o token
    -Configurei o retorno automatico para um arquivo de nome PagSeguroRetorno.php
    – criei o fornulario de compra o que funciona perfeito.
    -Criei o arquivo PagSeguroRetorno.php com o script exatamente igual ao postado aqui mas não grava no banco.
    Vocë pode me ajudar? Obrigada

    1. Regina, vc habilitou no PagSeguro a Notificações de Transações, e informou a URl para onde deveria retornar os dados?

  16. David, obrigado pelo artigo, mais eu estou com uma dúvida no site do pagseguro existem 2 opções para retorno:

    – Notificação de transações
    – Retorno automático de dados

    as duas pedem uma url.

    qual deve ativar?

    Abraços

    1. Se vc for usar API, vc vai habilitar notificação de transação. Se Vc for usar a integração antiga, usaria Retorno Automático de dados.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *