Retorno Automático PagSeguro em PHP/MySQL funcionando

ATENÇÃO: Já esta disponivel a versão 2.0 deste script, mais segurança e agora coletando informações dos produtos, clique aqui.

Que o PagSeguro é realmente um dos melhores meios de pagamento da web, isso ninguem dúvida. Mas como integra-lo ao seu sistema de e-commerce? O site de ajuda do PagSeguro tenta ser claro e explicativo, mas o fato é, o script disponível no site simplismente não funciona.

ATENÇÃO: Já esta disponivel a versão 2.0 deste script, mais segurança e agora coletando informações dos produtos, clique aqui.

Vamos aos erros…

No script PHP do PagSeguro eles usam uma função que se chama, tep_not_null() que não é uma função nativa do PHP, ou seja, o seu script não irá funcionar. Esta função pode ser encontrada no OsCommerce (que não recomendo) ou em outros scripts pela internet. Bola fora, porque este exemplo dado por eles serve justamente para implantar em outros sistemas, ja que os modulos para esses scripts prontos estão disponíveis no proprio site.

Erro apresentado: Fatal error: Call to undefined function tep_not_null() in /teste/pagseguro.php on line 53

… existem outras melhorias que podem ser feitas no script PHP oferecido pelo PagSeguro, não irei comentar, irei implementar mais abaixo, ok?

No script de criação de tabelas MySQL do PagSeguro existe alguns erros básicos e curiosidades tambem. O primeiro é o seguinte, para que existe a tabela PagSeguroTransacoesProdutos sendo que em nenhum dos scripts de linguagem oferecidos por ele existe a inclusão de dados nesta tabela? Com certeza fail. Na outra tabela PagSeguroTransacoes, esta sim é utilizada, mesmo assim com erros gritantes. Como por exemplo, o campo TransacaoID como chave primaria. Porque erro? Porque o PagSeguro faz um post cada vez que é atualizado a transação, desta maneira que esta apenas a primeira inclusão será feita no MySQL, as confirmações de pagamento, cancelamento ou outro status diferente da transação que será postado posteriormente serão ignoradas pelo MySQL pois so pode existir um registro com cada chave primária. Trocando em miudos, você não sabe quem pagou ou não, pois a transanção não será atualizada.

Erro apresentado: #1062 – Duplicate entry ‘TransacaoID’ for key 1

Ta bom ou quer mais? Mais? tem muita coisa, como falta de um campo data para saber quando aconteceu a confirmação, um campo de flag para saber o que você ja atualizou no sistema ou não, etc. Essas implementações eu irei fazer a seguir.

Coloquei o dedo na ferida, e agora? E agora vamos a…

 

Implementação

Tentei comentar o código de forma simples e sucinta, então qualquer explicação seria chuver no molhado, vamos lá.

N/D

Basicamente, ele se conecta no MySQL, depois checa através do CURL se foi realmente o PagSeguro que enviou a postagem, recebe os dados via post e grava os dados na tabela.

… mas que tabela? Ahh sim… vamos a criação da tabela do MySQL.


N/D

Na tabela acima todos os campos são basicamente os dados recebidos do PagSeguro. Existem mais campos adicionais que vem em POST tambem que não quis colocar, se você tiver conhecimento basta ler o manual do PagSeguro e adicionar os campos.

Os indices que coloquei foram 3. O primeiro de tipo UNIQUE em TransacaoID e StatusTransacao para evitar que um registro seja enviado mais de uma vez, isso pode ocorrer em servidores com conexão lenta, é melhor remediar, pois estamos falando de transações financeiras. Os outros dois são indices de chave (KEY) apenas, para indexar e deixar sua busca pelos registros mais rapidas. O primeiro é na Referencia, campo que você envia ao PagSeguro na hora da compra para vincular o pagamento a ele, seria nossa chave. O segundo é um campo criado por mim, status que nada mais é que uma flag que uso no meu sistema, para saber quando ja usei aquele registro ou não, por padrão, todos os registros inseridos tem status zero.

Legal ter o código aberto no blog, mas eu gosto de facilidade quando busco em outros blogs, por isso a partir de hoje, qualquer código estará disponivel tambem para download.

ATENÇÃO: Já esta disponivel a versão 2.0 deste script, mais segurança e agora coletando informações dos produtos, clique aqui.

download Faça download do código aqui.

… bem, acho que depois de um longo tempo sem atualizar o blog devido a uma cirurgia de redução de estomago (vou falar sobre isso depois), é uma postagem importante e relevante para os desenvolvedores da área. Espero que tenham gostado.

Have Fun!

ATENÇÃO: Já esta disponivel a versão 2.0 deste script, mais segurança e agora coletando informações dos produtos, clique aqui.

111 comments

  1. Excelente, mesmo! :-D

    Envia para o pessoal do PagSeguro isso. De repente eles arrumam para melhorar a qualidade do serviço deles.

    Sabia que existe um plugin do PagSeguro, ne? Então. Durante o trabalho “descobri” que é possível alterar os valores que colocamos para o produto pelo Firebug e o valor escolhido realmente passa para o sistema deles. Se alguém o estiver usando numa loja de informática, por exemplo, eu consigo pegar um boleto de um PC por R$1,00…

    Entramos em contato por TEL com a empresa que desenvolveu o plugin alertando isso. Já deve ter uns 15 dias que a atendente disse que retornaria e nada…

  2. Olá Diogo!

    Gostei muito do seu post, mas poderia me tirar uma dúvida? Estou iniciando um site de acesso restrito e gostaria de enviar um e-mail com o link de acesso para o cliente assim que o pagamento for liberado pelo pagseguro. Sabe me dizer como faço isso?

    Obrigado e boa sorte na sua recuperação!

    Bruno Lima.

  3. Opa.. Parabens… eu ia fazer o mesmo… limpar o código do pagseguro.. mas pelo jeito vc ja fez isso.
    Obrigado

  4. Rapaz…

    Tirei o dia hoje para ler tudo a respeito do pagseguro, pois pretendo coloca-lo em meu site, este seu tutorial está bacana d+, parabens.

    Estou adicionado ao meu favorito para depois ler cuidadosamente e verificar se consigo implantar esta rotina descrita por você no meu site, haja visto que não sou programador, e por ter sido “enrolado” uma centena de vezes, estou tentando fazer algumas coisas sozinho.

    Espero conseguir sem ter que contratar um programador para faze-lo.

    fraternal abraço e mlehoras pós cirurgia.

  5. Ola diogo, tudo bem? muito bom seu artigo, funcionou certinho. Estou tentando implementar pra na hora em que receber o post do pagseguro, verificar se o status esta aprovado ou não, caso esteja aprovado enviar automaticamente um email ao cliente, mas não estou conseguindo, tem como me ajudar?

  6. Cara, muito bom esse tutorial!
    Ajudou muito mesmo!
    Mas não está dando erro quando vc tem mais que um tipo de produto no carrinho? Ele está retornando apenas o primeiro da lista!
    Valew!

  7. Oi
    Primeiro muito obrigado por tudo
    Funciona tudo excelente.
    Mas se eu precisar do nome do curso, no pagseguro a variável é ProdID_x ProdDescricao_x , adicionei na tabela da base de dados e no código php para inserir e não funcionou….podias me dizer o que se pode passar quanto a isso?

  8. Nossa, há quanto tempo não venho aqui, apesar de não me interessar, gostei do tutorial, bem explicado afinal!
    Bom, retorne ao meu blog e veja como ele está ficando *-*
    Deixe um comentário se possível.
    Abç. Maa

  9. ola, tdo bom?
    procurei pelo teu email aqui, mas nao encontrei, eu tou precisando de uma ajuda tua, programo tb em PHP e uso a base de dados MySql, sera q podias me mandar um email pra agente cnversar?
    muito Obrigado.

  10. Olá Diogo! Estou com um probleminha tá funcionando mas ao continuar comprando ele não acrescenta os produtos só aumenta a quantidade, porque?

  11. Pribena, O script foi desenvolvido para pegar apenas o total de produtos e valor da compra. Voce deve fazer uma rotina para ele pegar todos os produtos. Recomendo criar outra tabela para isso e relacionar. Leia a documentação do Pagseguro para maiores informações.

  12. Então … resolvi o problema de parar de adicionar só a quantidade mas agora ele não está adicionando os outros produtos! por que?

  13. Muito bom posto Diogo.

    Mas me esclareça uma dúvida por gentileza.

    Uma vez que a compra já foi efetuada e os protudos também já foram inseridos em meus banco de dados, como faço para consultar o status da transação no PagSeguro ?

    Já tentei de inúmeras maneiras mas o PagSeguro não me retorna tal informação.

    Você já desenvolveu alguma maneira ?

    Abraços.

  14. Olá Diogo Dourado!

    parabens pelo belo post, é a primeira vez que visito seu blog e estou impressionado.

    Bom vamos lá tenho algumas dúvidas… eu tenho um botão de compra onde uso em um site, bom esse botão o cliente clica e vai ao site do pagseguro, bom dúvida, para que o retorno funcione devo enviar algum dado ao pagseguro ou não? todos os dados vão posteriormente e únicamenta para o retorno automatico?

    Copiei e coloquei seu codigo exatamente como esta exposto, troquei apenas os dados de acesso ao banco de dados meu tokem e link do site que eu quero que va, tambem configurei o link de retorno automatico no pagseguro etc…

    mais não entra nada no banco de dados e não sei o motivo, sabe por que?

  15. Ola,

    Quando o usuario compra via boleto na hora o pagseguro envia um post da transacao, alguns dias depois quando o cliente paga o pagseguro envia outro post para atualizar os dados no banco de dados. Nao achei no seu codigo aonde ele da o update na tabela?

  16. Gostaria de saber se este código que esta no blog esta vando ainda ou tem que ser atualizado pois estamos em 03-05-2010

    Aguardo retorno e muito obrigado por enquanto.

    Atenciosamente,
    Toninho

  17. Ronaldo, o retorno so funciona via PAGSEGURO > SEU SITE. Ou seja, voce deve efetuar um pedido ou compra no Pagseguro para o retorno ser acionado.

  18. Diogo, obrigado pelo post organizado e o exemplo.
    No entanto não consegui implementar o ProdID_x e nem a Referência.
    Desta forma não posso indentificar o produto através de de nenhum ID.

    Poderia mostrar um exemplo de como incluir Referencia ou ProdID_x.

    obrigado

  19. Olá, eu queria saber se esse código serve para “ATUALIZAÇÃO” do status do pedido, se eu posso usar ele para fazer o update do BD…

    oq devo fazer ? gerar minha TOKEN, cadastrar a url, e usar o script ?

  20. Eduardo, estes dados vem com o POST no retorno, basta captura e mandar gravar em um banco de dados. Em breve irei refazer o codigo com todas as opções possiveis.

  21. Andre, ele na verdade so adiciona informacoes em uma tabela. O UPDATE no pedido voce q tem q fazer, e vai variar de como esta sua tabela. Mas certamente voce ira entender quando instalar o script.

  22. Diogo, parabéns pelo blog. Ma mudando de assunto, O flogvip sem duvida é o melhor fotolog que há! Mas gostaria de saber porque ele vêm saindo do ar. Fico muito triste porque flogvip é muuuito bom e nao aguento ficar sem. Por favor, dê ao menos uma resposta pra acalmar toda essa agonia que dá ficar sem o flogvip!

  23. Muito bom felismente há pessoas como
    você desprovida de segundas intenções
    disponibilisam um trabalho como este
    parabéns

  24. Ola Diogo. Meus parabens pela iniciativa. O script está funcionando para todas as transações que não tem acento. Quando o pagamento é feito via cartão de crédito ou o nome do cliente contém acentos, o PagSeguro não valida o retorno. Vc sabe o que pode ser? abraços e obrigado

  25. Diogo,

    estou começando um site de compra coletiva e gostaria de implantar o pagseguro como forma de pagamento e com retorno automático, mas tudo isso sem perder as funcionalidades atuais do sistema.

    você pode fazer essa alteração para mim?

    me passa um e-mail com um orçamento.

    abraço,
    Rafael.

  26. Diogo
    Ainda não testei seu script, antes gostaria de te perguntar: Existe uma pagina que é chamada retorno.php que é feita um include pelo pagseguro. Minha pergunta é você já incluiu ela no teu script ? outra pergunta, o comando sql INSERT com a opção SET tem o mesmo efeito do UPDATE. Pergunto porque, digamos que na primeira vez ele grava um status x, depois o pagseguro manda outro post liberando, então é enviado um outro post com status y, será usado o mesmo INSERT com o SET ? Ficarei grato se responder estas questões. Grande abraço e obrigado pelo excelente trabalho. Milton

  27. Thales, voce ja identificou o erro, entao no post, remova todos os acentos que vierem no nome, deve funcionar. Estarei em breve atualizando este script e fazendo algo mais completo. Para remover acento, no meu blog mesmo voce vai encontrar uma funcao para isso.

  28. 1. O meu script é completo, nao necessita de nenhum arquivo do Pagseguro.

    2. Não, o INSERT SET não tem nada de UPDATE. INSERT insere os dados, UPDATE atualiza os dados.

    3. No script acima, ele sempre grava com INSERT, ou seja, se o status for atualizado ele ira gerar outro registro no banco de dados (INSERT). Para verificar qual o atual status do pedido, basta fazer um SELECT no banco de dados usando como filtro o ID e DATA decrescente (mais recente).

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.