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. Primeiro obrigado pelo comprometimento de tentar melhorar algo sem cobrar nada. Mas Diogo não gravou no banco cara
    :( o que pode ser? abraço

  2. Olá Diogo,
    Esta é a minha primeira vez aqui e já estou agradecido mesmo sem usar o pagseguro ainda, parabéns pela iniciativa.
    Não sou programador, estou utilizando o joomla + Virtuemart para desenvolver a loja virtual. está praticamente tudo pronto, já coloquei o modo pagseguro para funcionar mas não estou sabendo colocar o retorno automático.
    Outro ponto que quero é fazer com que eu crie um formulario no joomla e estes dados passem direto para o pagseuro, para não ter a necessidade de que o cliente não precise fazer dois cadastros,me disseram que tinha como fazer isso no pagseguro mas não sei fazer.
    e o basico, onde eu coloco esse bendito código? Em que página? e onde fica esta página para que eu possa colocar esse código.

    Espero que responda o mais breve possível

    Um abraço

  3. Gostaria de saber se esse codigo funciona em MsSql tbm, e se ao realizar o retorno se o UPDATE estiver em WHERE=’TransacaoID’ vai tudo certinho, e tabém se na parte do if ($StatusTransacao == ‘Completo’ OR $StatusTransacao == ‘Aprovado’)
    posso realizar um novo update baseado nos dados que foram devolvidos e updeitados do Pagseguro. Muitas perguntas x_x

  4. Bom dia Diogo, Eu tenho dúvidas quanto ao retorno automático do pagseguro em meu site. Há uma pag chamada rotorno.php, mas não esta Quando clica no produto pra comprar não vai pra pag do pagseguro, fica uma msg que diz “Não há pagamento adequado, e seu saldo não é suficiente”. O que devo fazer …?

    Obrigada e parabéns pelo blog.

  5. Boa noite Diogo,
    Implementei seu script e rodou beleza, só estou tendo um problema, não identifiquei em qual coluna você está gravando o valor da Compra, só vi o frete e os extras, onde vem o valor efetivamente de compra? Pra fazer um testes incluí os campos $ProdDescricao_x e $ProdValor_x, porém eles estão ficando sempre vazios no banco, tem alguma ideia?
    Abraços,
    Fábio

  6. Fala Diogo tudo beleza ? Feliz ano novo !!!
    cara, primeiramente, parabens ai pelo belo trabalho.
    Tenho algumas duvidas aqui sobre seu script…
    0. Na tabela mysql que vc cria, vc coloca uma coluna status, essa coluna nao e’ preenchida em nenhum momento no script, ela precisa estar ai ?
    1. A linha 59 e’ uma copia da linha 51 do script, precisa recolocar essa informacao no curl ?
    2. Sobre a entrada no banco usando insert, entendi oque vc colocou sobre fazer um SELECT e filtrar o resultado, mas se fizer um UPDATE o resultado nao vai ser mais rapido doque filtrar ? claro que isso pra alguma loja online que tenha uma movimentacao bem grande…
    sou ainda amador em programacao, essas sao duvidas mesmo… grande abraco !!!

  7. Cara, muito bom o seu tutorial, fiquei umas 7 horas até conseguir achar um que prestasse e o seu foi o melhor deles. muito bom mesmo e de fácil implantação.

    Só faltou explicar como recuperar os dados referentes ao ProdID_x e etc.

    Parabéns pela iniciativa.

    Estou desenvolvendo uma empresa agora e tenho muitos projetos que pretendo realizar, se quiser, me manda um email pra manter contato, gosto de trabalhar com pessoas de boa iniciativa.

    Abraços!!!

  8. Nossa.. O MELHOR!

    O unico script da net que funciona!

    Muito bom muito bom mesmo!

    Ajudou muito.. estava a muito tempo procurando um deste que funcionasse..

    E eu só gostria de saber.. Se por exemplo.. Alguem faz uma compra via boleto, o status vai ficar “Aguardando pagamento” quando ele pagar.. Como vai enviar os dados para minha tabela que está “Pago” ?

  9. Otavio, no script nao tem, mas é bom voce fazer um LOG e verificar o erro. Tente fazer o log de tudo, desde acesso ao aquivo a insercao no mysql para gerar erros e acertos. Assim facilmente identificara o erro.

  10. Pedro,

    0- Nao precisa, eu uso em meus projetos para verificar atualizações e leituras.
    1- Nao lembro disso, to com preguiça de ver o arquivo, entao deixa ele ae. :P
    2- É por isso que eu uso o status, para ele filtrar somente os que ainda nao li. É questao de logica de programacao, faça como achar melhor, ok? O INSERT ou UPDATE no final das contas é a mesma coisa, vai de voce em deixar os registros em historico ou atualizar de forma mais amigavel. :)

  11. Cara, eu ja tinha usado o seu codigo em um site e funcionou beleza, fui usar novamente, mais desta vez ele não passa do “if($confirma)”, ou seja não executa o insert e outros comandos q eu fiz, tu sabe se mudou alguma coisa no retorno do pagseguro desde que tu publicou o codigo?

  12. Muito, mas muito bom esse seu artigo.
    Por acaso, vc não sabe me diser ou aonde axo como configurar o ambiente de teste no windows rodando um wamp? No site do Pagseguro não ajuda muito.

    Abraço

  13. esse script funciona para loja zen cart?
    quando um cliente faz a compra meu sistema processa a venda antes da transação no pagseguro ser concluida. tem solução com esse retorno?
    obrigado e parabéns pelo trabalho.

  14. gostaria de saber se tem como eu por retorno automatico pra usar 2 sites no mesmo pagseguro pois estou com essa dificuldade…

  15. pq não funciona o ProdID_x…vai para o banco de dados em branco quando tento adicionar!

  16. Olá,

    Estou tentado fazer a integração do pagseguro, mas o POST sem vem vazio, e não consigo recuperar nenhum dado.

    Você tem alguma sugestão?

    Obrigado

  17. Amigo, eu posso alterar isso, né?:

    $TransacaoID = $_POST[‘TransacaoID’];
    $VendedorEmail = $_POST[‘VendedorEmail’];
    $Referencia = $_POST[‘Referencia’];
    $TipoFrete = $_POST[‘TipoFrete’];
    $ValorFrete = $_POST[‘ValorFrete’];
    $Extras = $_POST[‘Extras’];
    $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’];

    Preciso deixar assim:

    $TransacaoID = $_POST[‘TransacaoID’];
    $VendedorEmail = $_POST[‘VendedorEmail’];
    $Referencia = $_POST[‘Referencia’];
    $TipoFrete = $_POST[‘TipoFrete’];
    $ValorFrete = $_POST[‘ValorFrete’];
    $Extras = $_POST[‘Extras’];
    $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’];

    Pode me mostrar um formulário de exemplo? Não sei para eu serve $Extras = $_POST[‘Extras’];
    $Anotacao = $_POST[‘Anotacao’];
    $TipoPagamento = $_POST[‘TipoPagamento’];
    $StatusTransacao = $_POST[‘StatusTransacao’]
    $Referencia = $_POST[‘Referencia’]

  18. Você deve implementar a verificação de valor postado pelo pagseguro em relação ao que deveria ser pago. Afinal é facílimo rackear o form que faz post na área de pagamento do pagseguro e modificar um input hidden de ProdValor_1 para 1 centavo e finalizar a compra!!!!!!!

  19. Caro amigo, estou tendo problema com o retorno do PagSeguro, tentei fazer do jeito em que me pediu para fazer, mas no entanto não funcionou, como poderei resolver este problema?

  20. Thomás, o script é responsavel apenas pela captação de dados. A veracidade das informações fica a cargo do programador e sua implementação no sistema.

  21. Olá, implementei a biblioteca do pagseguro na minha loja, só que não consegui rodar o frete, por causa desse erro:
    Fatal error: Call to undefined function curl_init() in …\Biblioteca\pagseguro\frete.php on line 72

    Conhece esse erro?

    Desde já eu agradeço!

  22. Realmente, o melhor script que já vi, funciona perfeitamente.
    Tem meses que estou tentando fazer funcionar, com vários scripts diferentes, e nada, e com este, simples e rápido, funcionou perfeitamente.

    Parabéns!

  23. Olá, meu status não altera quando o meio de pagamento é TEF. Fica sempre como Aguardando Pagto. Porque? Algueém sabe?

  24. Luciano, vou ver se é problema geral ou apenas seu. Irei fazer um teste e posto aqui depois, ok? Estou com um problema de saude mas em no maximo 2 dias eu te respondo.

  25. Caro xará, estou tendo a mesma dúvida de muitos aqui.
    Se eu simplesmente chamar por posto o valor de ProdValor_x (denominando uma variável a ele e tentando inserir no banco), simplesmente não consigo. O mesmo vale para ProdValor_0, ProdValor_1 .. etc.
    Sabe como podemos resolver isso de uma forma bem simples?
    Forte abraço e parabéns pelo SCRIPT!

  26. Olá Diogo, funcionou quase tudo, eu só não consegui gravar o valor da venda na tabela, é isso mesmo?

    e depois de feito o processo ele redireciona para um link correto?

  27. Fála Dourado!!!
    Show de bola…

    Quando deve sair a versão 2.0?

    Forte abraço!

  28. Oi Diogo tudo bem.
    Estou criando um site para vender livros digitais, só quero colocar somente a opção de pagamento em boleto, conseguir criar a interface inicail do site como validar login, armazenar o cadastro do cliente, gerar a numeração correta do boleto atraves dos dados do cliente mais estou com dificuldade em receber ou processar as informações vidas do banco em um retorno. Vc teria uma ideia de como poderia implementar algo em PHP.

Deixe uma resposta

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.