Retorno Automático de Dados do PagSeguro em PHP/MySQL (com produtos) – Versão 2.0

Enfim, como prometido a nova versão do Retorno de dados do Pagseguro. As maiores novidades ficaram por conta da utilização a nova URL do PagSeguro para validação e a captura completa dos produtos.

Agora ficou mais fácil a instalação do mesmo, basta baixar o script abaixo, descompactar e editar  o PagSeguroRetornoConfig.php inserindo os dados solicitados. Depois basta configurar o banco de dados Mysql e utilizar o arquivo SQL disponível para criar as tabelas.

Download do script de Retorno de Dados Automatico do Pagseguro 2.0

 

Você deve configurar a sua conta no PagSeguro para ativar o Retorno Automático de dados, para isso, entre no seu PagSeguro, nas opcao Preferencias > Retorno Automatico de Dados. Basta ativar a URL de retorno e colocar o endereço completo da URL do arquivo. Neste mesmo local é onde você vai gerar o seu Token, solicitada no arquivo de configurações.

Feito isso, o seu Retorno já esta funcional.

Para testar seu script não é preciso fazer um pagamento, basta abrir o arquivo TestarCompra.php colocar o seu e-mail e enviar para o seu FTP. Feito isso, é so acessar o arquivo, gerar uma compra aleatoria e escolher BOLETO BANCARIO para pagamento. Depois de confirmar a compra por boleto e aguardar o tempo solicitado, as suas tabelas já terão os dados da compra, bem como os produtos gerados.

Ps: Se você não é programador, não faça perguntas, peça um orçamento atraves do contato.

É isso ae! La pergunta?

224 comments

  1. GHabriel, Isso, quando o pagamento for pago, seja ele por boleto, cartao, etc. O Pagseguro ira informar vc via retorno automaticamente.

    Sim, o campo referencia funciona.

  2. Amigo.
    Estou começando a pirar com esse negócio de pagseguro, rsrsrs.
    Seu código etá muito bem feito.
    Mas não consigo de jeito nenhum enviar as informações para o banco. Como solução para ver o que estava acontecendo, criei uma função que gera um arquivo de LOG. vou deixál-a aqui caso alguem tenha interesse em utilizar.

    function logpag($mensagem, $data, $arq) {
    $f=fopen (“pagseguro_$arq.log”, ‘a’); # o “a” eh para ele “appendar” o conteudo, ou seja, colocar ao final
    fwrite($f, “$mensagem\n\r\n\r”); # escrevendo a mensagem, mais uma quebra de linha
    fwrite($f, var_export($data, true)); # imprime os dados no arquivo de log
    fwrite($f, “\n\r\n\r\n\r———\n\r\n\r”); # um espaco para separar as ocorrencias
    fclose($f);
    }

    para utilizar do log, basta chamar a função nessa parte do script:

    } else if ($result == “FALSO”) {
    logpag(‘O post não foi validado pelo PagSeguro.’, $_POST, $result);
    } else {
    logpag(‘Erro na integração com o PagSeguro. ‘.$result, $_POST, ‘ERRO’);
    }

    ele vai gerar um arquivo chamado pagsegur_ERRO OU FALSO.log

    bom, nas pimeiras vezes, ele apenas retornava: o post não foi validado pelo pagseguro e abaixo uma array com todos os dados da compra.

    To pirando ja, rsrsrs;
    Se puder dar uma força eu ficarei muito grato. Abs

  3. Diogo.

    Entrei no Painel do PagSeguro
    E configurei a url de redirecionamento e url de retorno de dados( para o mesmo arquivo ), e mesmo assim está me retorno um POST vazio.

    Estou testando em Ambiente de Produção.

  4. O script funciona perfeitamente….só gostaria de saber si é possivel visualizar todas transações dos meus clientes na area administrativa da loja virtual???

  5. Excelente script!!! Apenas gostaria de saber como adicionar na tabela de transações id do cliente que está logado no meu site. Como isso seria possível?

  6. Olá,
    Eu queria saber se há uma possibilidade de relacionar a tabela pagsegurotransacoes com a minha tabela de usuarios, pra poder saber oque e qual usuario do meu site comprou.
    Valeu.

  7. AMigão nao consigo fazer pagamentos no meu siote fica dando esse erro

    Fatal error: Call to undefined method Tax::getRate() in /home/adml04/public_html/catalog/model/payment/pagseguro.php on line 64

  8. Gabriel, existe o campo referencia que é exatamente o que você quer. Nela você coloca o ID da compra do seu sistema ou um dado qualquer para utilizar depois do retorno, ok? :)

  9. Guilherme, não é possivel colocar o id de quem ta logado, porque a resposta vem do PagSeguro e não do seu cliente, ok? Depois do retorno que você faz a verificação por sessão, conferindo os dados inseridos no BD.

  10. Olá Diogo Dourado, boa noite. Muito bom seu script, já tava desistindo quando encontrei o seu. esse sim funciona. Mas fiquei me perguntando, é possível pegar também o valor total da compra somado com o frete?

    Desde já agradeço a atenção.

  11. Diogo, parabéns pelo código, mas eu fiquei realmente preso aqui na parte de validação. Fiz o teste de compra por boleto, tudo ok. Só que nada estava sendo gravado no banco de dados. Utilizei o script do Carlos Carvalho lá em cima e deu o mesmo resultado dele no log:

    O post não foi validado pelo PagSeguro.

    array (
    ‘notificationCode’ => ‘3EE355-42A57CA57C26-8444A4BFB8EC-40EC1B’,
    ‘notificationType’ => ‘transaction’,
    )

    E fica nisso. Vi que você escreveu algo sobre “Remover Validação”. Seria tirar o “if ($result == “VERIFICADO”) {” ???

    Fiz isso, e aí um novo registro no banco de dados é criado quando eu testo, mas vazio, sem nenhum dado, a não ser a data.

    Se puder explicar melhor o que fazer pra resolver esse problema eu agradeço imensamente.

  12. Consegui resolver. É pq no pagseguro além de ter que ativar a Notificação de Transações, tem que ativar o Retorno Automático de Dados.

    Fica a dica pra quem mais tiver problemas. Campeão, parabéns mais uma vez. Isso salvou meu dia. Vou ganhar umas horas de descanso.

  13. SOLUÇÃO DEFINITIVA PARA QUEM NÃO ESTÁ RECEBENDO RETORNO POST DO PAGSEGURO:

    1 – Certifique-se de ter ativado e configurado corretamente a URL de Retorno Automático do PagSeguro (Lembrando que o arquivo que deve ser utilizado nessa configuração deve ser o pagseguroretorno.php);

    2 – RETIRE TODAS AS LETRAS MAIÚSCULAS DOS ARQUIVOS, inclusive nos includes dentro dos mesmos.

    Pronto, feito isso seu problema será solucionado !

  14. Boa tarde

    Primeiramente gostaria de agradecer a esse grande script, muito obrigado Diogo.

    Eu configurei corretamente a url de retorno e o token e mesmo assim não grava os dados no meu banco de dados da transação, já li os comentários anteriores e não identifiquei uma possível falha já que parece estar tudo certo.

    poderia me ajudar ?

  15. Oi Diogo! Muito bom seu código. Encontrei procurando pelo google por exemplos de integração do pagseguro. Acho incrivel como eles ainda não possuem um sandbox ou ambiente de testes. Eu gostaria de saber se é preciso fazer o pagamento do boleto para que o status mude e eu receba o post do pagseguro. Tentei cancelar a transação (mas eles também não possuem essa funcionalidade) para ver se o post era enviado.

  16. Oi Diogo:
    Alguém por aí falou que você deveria ser refenciado no PagSeguro. Discordo totalmente! Você deveria ser REVERENCIADO por eles, ok?
    Além de explicar em poucos passos o que os n+1 tutoriais do PagSeguro não conseguem, você ainda abriu pra galera. Valeeeeeu!!!
    Um grande abraço e very, very, very thanks.

    Se quiser olhar onde vou aplicar a interação: http://www.seminarioredes.com.br

    Em tempo: só estou quebrando um pouco a cabeça com o head do redirect… não coloquei (ainda) nada diferente no teu script (além dos meus dados, of course), mas o erro “Cannot modify header information – headers already sent by…” persiste. Só não tentei ainda limpar todas as linhas em branco… ouvi dizer que às vezes pode ser…

  17. Carlos, valeu pelos comentários,!!! O lance do header é fácil, basta mudar a codificação dos arquivos

  18. Valeu Emanuel. Nao precisa pagar o boleto. Só de gerar ele já envia o retorno para teste.

  19. Paulo, gera log txt para saber até onde ta entrando no arquivo

  20. Mário, o número 2 nao precisa. Basta informar a Url corretamente

  21. Ualace, estes dados já sao gravados. Você tem que somar os valores dos produtos da transação com o valor do frete. Pimba!

  22. Oi, Diogo:

    Primeiro, não precisa agradecer nada não… nóis é qui agradece!:o)

    Infelizmente, só li sua resposta depois de publicar o sistema… mas sendo sincero, ainda não sei como interferir na codificação do arquivo e não posso, agora, melar o retorno (depois de anos em asp, estou iniciando, ainda meio inseguro ainda, no php). Um dia descubro…

    No mais, apenas tentando colaborar um pouco com a galera, usei uma solução “sem header”: sem content-type e sem location. Não deu xabu algum no meu bd (tenho várias intervenções nele além de insert) nem no retorno de dados ao PagSeguro.

    Já para redirecionar o usuário a outra página, como meu caso é meio específico (o usuário tem que estar logado para chegar ao PagSeguro) usei o javascript window.open, para uma página de redirecionamento “geral”, a mesma utilizada no login inicial e onde, através de uma simples request, resgato uma session previamente definida no login -> com esta session mando o usuário de volta à página dele sem problemas. Só não consegui fechar a janela do retorno (fica uma aba em branco) – ou melhor, até consegui, não fosse o IEca…

    Ficou assim o final da página de retorno:

    else{
    echo “javascript:window.open(‘../direciona.php?pag=s’)”;
    }

    No fosse o IEca, poderia ter ficado assim (funcionou no Safari, mas não testei em outros navegadores após a falha no IE):

    else{
    echo “javascript:window.open(‘../direciona.php?pag=s’); self.close()”;
    }

    Abs.

  23. Olá Diogo bom dia.Bom pela segunda vez estou utilizando seu script mas desta vez sem sucesso. Estou criando um site onde pretendo vender espaço publicitário dai o usuário se cadastra cria o anuncio em fim até ai tudo bem faz a compra e gera o boleto numa boa. mas o pagseguro não esta retornando os dados para serem gravados no banco.

    Daí fiquei pensado no seguinte, para fazer a compra não estou utilizando o formulário como da 1ª vez, pois com o formulário só poderia comprar depois que o usuário se cadastrasse então pesquisando encontrei com efetuar a compra sem cadastro. O código é esse

    error) > 0){
    //Insira seu código de tratamento de erro, talvez seja útil enviar os códigos de erros.

    header(‘Location: erro.php?tipo=dadosInvalidos’);
    exit;
    }
    header(‘Location: https://pagseguro.uol.com.br/v2/checkout/payment.html?code=‘ . $xml -> code);
    ?>

    Será que tem algo a ver com esse código que estou utilizando? Pois ele funciona bem, então acho que deveria retornar os dados e gravar no banco.

    Muito abrigado por ter respondido a pergunta anterior, desde já agradeço toda atenção

  24. Boa tarde, fiz o que esta ai em cima, mas da como se nao tivesse recebido nada! nenhum POST foi recebido pela sua pagina de retorno.

  25. Muito bom Diogo!!
    Ta de parabéns! Me ajudou muito.
    Grande abraço.

  26. Vinicius, para voce verificar se ta recebendo POST ou não, basta gravar um LOG, usa o fopen e seja feliz! :)

  27. oi Diogo,
    Parabéns pelo código.

    Tenho uma dúvida. caso aconteça alguma instabilidade no PS ou no meu Serv.
    Tem como gerar um retorno manual (ex: um formulário que preencho e e envio pra URL do retorno ).

    E assim finalizar minha venda?

    Abraço.

  28. Fabiano, otima pergunta. Mas aqui, no caso, o que vai falhar sera o seu servidor. Pois se o PagSeguro falhar, nao a pagamento, concorda? Mas enfim, o PagSeguro so envia o retorno automatico uma vez, se nao conseguir comunicar, f*deu! Mas isso ja foi resolvido, o PagSeguro lancou uma API mais completa pelo metodo de requisicao, ou seja, voce requisita o status de um pagamento e ele te retorna os dados. Essa requisicao pode ser feita a qualquer momento.

  29. Diogo, tentei de tudo cara e não funcionou !Criei as tabela no banco, fiz a configuração..mas num grava no banco ! Nçao sei mais o que pode ser..ja tentei de tudo meu caro !

  30. Cara que massa.

    Tudo simples e ao pé da letra sem rodeios.

    Muito fácil de implementar o código ao nosso sistema.

    Parabéns Diogo Dourado pela iniciativa.

    Não há outro tópico na internet que seja tão fácil de ser compreendido igual ao seu.

    Valeuuus.

  31. Olá Diogo muito 10 este script estou a usa-lo no meu projeto site de compra coletiva e está funcionando perfeitamente perfeito, só estou com um probleminha gostaria de passar uma outra informação para ser salva em meu banco de dados por exemplo, após o usuário escolher a oferta ele indicará se a mesma é para algum amigo, logo digitará este amigo em um campo (input) e justamente este bendito não estou conseguindo envia-lo. E olha que já tentei de tudo inclusive até fiz outra tabela para poder cadastrar a TransacaID e o Nome do amigo porém só cadastra a TransacaoID, tem alguma dica para mim ajudar.

  32. Helton, o pagseguro so vai te enviar os campos que existem na documentacao.

  33. ????
    seria no form que envio para eles com as informações????

    <input type="hidden" name="email_cobranca" value="”>

    <input type="hidden" name="ref_transacao" value="” />

    <input type="hidden" name="item_id_1" value="” />
    <input type="hidden" name="item_descr_1" value="” />
    <input type="hidden" name="item_quant_1" value="”/>
    <input type="hidden" name="item_valor_1" value="” />

  34. Ai amigo, parabéns, funcionou perfeitamente, fiz algumas alterações para inserir/alterar os dados diretamente nas minhas tabelas.

  35. Olá Diogo, parabéns pelo post, muito bom mesmo, resolveu o meu problema. Obrigado!

  36. Diogo,

    Gostei muito da sua biblioteca, mas meu post vem vazio e não registra no banco. O que fazer?

    0) {
    echo “entrou”;
    $npi = new PagSeguroNpi();
    $result = $npi->notificationPost();
    $transacaoID = isset($_POST[‘TransacaoID’]) ? $_POST[‘TransacaoID’] : ”;
    if ($result == “VERIFICADO”) {
    // recebendo Dados
    $VendedorEmail = $_POST[‘VendedorEmail’];
    $TransacaoID = $_POST[‘TransacaoID’];
    $Referencia = $_POST[‘Referencia’];
    $Extras = MoedaBR($_POST[‘Extras’]);
    $TipoFrete = $_POST[‘TipoFrete’];
    $ValorFrete = MoedaBR($_POST[‘ValorFrete’]);
    $DataTransacao = ConverterData($_POST[‘DataTransacao’]);
    $Anotacao = $_POST[‘Anotacao’];
    $TipoPagamento = $_POST[‘TipoPagamento’];
    $StatusTransacao = $_POST[‘StatusTransacao’];

    $CliNome = $_POST[‘CliNome’];
    $CliEmail = $_POST[‘CliEmail’];
    $CliEndereco = $_POST[‘CliEndereco’];
    $CliNumero = $_POST[‘CliNumero’];
    $CliComplemento = $_POST[‘CliComplemento’];
    $CliBairro = $_POST[‘CliBairro’];
    $CliCidade = $_POST[‘CliCidade’];
    $CliEstado = $_POST[‘CliEstado’];
    $CliCEP = $_POST[‘CliCEP’];
    $CliTelefone = $_POST[‘CliTelefone’];
    $NumItens = $_POST[‘NumItens’];

    // Gravando Dados
    mysql_query(“INSERT into PagSeguroTransacoes SET
    VendedorEmail=’$VendedorEmail’,
    TransacaoID=’$TransacaoID’,
    Referencia=’$Referencia’,
    Extras=’$Extras’,
    TipoFrete=’$TipoFrete’,
    ValorFrete=’$ValorFrete’,
    DataTransacao=’$DataTransacao’,
    Anotacao=’$Anotacao’,
    TipoPagamento=’$TipoPagamento’,
    StatusTransacao=’$StatusTransacao’,

    CliNome=’$CliNome’,
    CliEmail=’$CliEmail’,
    CliEndereco=’$CliEndereco’,
    CliNumero=’$CliNumero’,
    CliComplemento=’$CliComplemento’,
    CliBairro=’$CliBairro’,
    CliCidade=’$CliCidade’,
    CliEstado=’$CliEstado’,
    CliCEP=’$CliCEP’,
    CliTelefone=’$CliTelefone’,
    NumItens=’$NumItens’,
    Data=now();”);

    // Recebendo e gravando produtos
    $Processo = mysql_query(“SELECT VendedorEmail FROM PagSeguroProdutos WHERE VendedorEmail=’$VendedorEmail’ AND TransacaoID=’$TransacaoID'”);
    if (mysql_num_rows($Processo)==0) {
    for($i=1;$i

  37. Leonardo, isso ta acontecendo porque o PagSeguro nao valida a URL. Grava um LOG de tudo que vier com POST que você ira solucionar rapidamente.

  38. Cara!!! Antes de tudo, muito bom este teu script e funciona redondinho… Parabéns Diogo!
    Até agora teste somente com um produto, beleza!
    O lance eh qdo utilizo o array, não estou conseguindo passar o “Número de itens” corretamente, e qdo o PS gera o valor total, ele pega somente o último item do array e o seu valor. TU sabe me dizer onde passo o tamanho do array? A variável é a $NumItens

    Grande abraço!

Deixe um comentário

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

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.