[Tutorial] Pagamento Automбtico via PagSeguro (PHP+MySQL)
#1

Neste tуpico irei ensinar como receber notificaзхes de pagamentos em uma pбgina PHP e enviar para um banco de dados MySQL, utilizando como exemplo o PagSeguro, pode nгo ser o melhor tutorial possнvel pois estou comeзando a estudar PHP agora, mas o importante й que funciona, se alguйm souber melhorias que eu posso fazer no cуdigo, basta postaR aqui que eu atualizarei.

Requisitos: Conta PagSeguro e uma hospedagem que tenha suporte para MySQL e PHP

Explicaзгo: Depois que vocк configura uma URL de retorno, toda vez que um pagamento tiver seu status alterado o PagSeguro envia dados informando no formato POST para a URL de retorno.
O que iremos fazer nesse tutorial й, criar uma pбgina de retorno e armazenar os dados enviados pelo PagSeguro em um banco de dados MySQL.

Entгo vamos lб! Primeiramente, entre no site do PagSeguro, Clique em "Painel", "Minha Conta" e depois vб em "Preferкncias" e "Integraзхes". Nessa pбgina, habilite a notificaзгo de transaзгo e gere um token. Se vocк souber como irб ficar sua URL, jб pode definir ela, exemplo: http://www.meusite.com/pagseguro.php

Apуs isso, clique em "Confira informaзхes dessa funcionalidade." e ative a URL de retorno e novamente coloque uma URL, nesse tutorial a pбgina serб chamada de "pagseguro.php" como citei no exemplo acima.

Ps.: Anote o Token.

Agora crie um banco de dados no MySQL chamado "pagseguro", e rode o cуdigo abaixo:

Код:
	
CREATE TABLE `pagseguro` 
(
	`Code` VARCHAR(128) NOT NULL,
	`Cash` INT(11) NOT NULL
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
Feito isso, iremos criar nossa pбgina que se chamarб "pagseguro.php", ela que irб receber a notificaзгo do PagSeguro e enviarб para o banco de dados:

http://pastebin.com/zGC1AzHv

Obs.: Altere os dados de conexгo ao MySQL e a definiзгo do TOKEN.

Em seguida, upe a pбgina "pagseguro.php" na hospedagem.

Com tudo isso feito, basta vocк gerar um link de pagamento, eu tenho este:

http://pastebin.com/WQf9sYdv

Obs.: Altere os campos e-mail e token.

Importante notar, o ID do item (produto) nesse caso й muito importante, й nele que o script classificarб o produto, por exemplo, nesse script, o produto nъmero 1 vale 1000 cash.
O ID do item й classificado no arquivo XML, na chave <id>. No pastebin do link de pagamento vocк irб encontrar.

Esse script tem uma ideia de que os players digitem o cуdigo de transaзгo dentro do jogo para receber seu cash. O resto й com vocк =P

Vocк pode encontrar todos os campos enviados pelo PagSeguro aqui.

Crйditos:
CaioTJF
http://sounoob.com.br/
Reply
#2

Boa, @UP
Reply
#3

Velho, eu te amo cara ... fazia um tempo que eu nгo mexia com PHP, tinha que revirar a mente pra poder tentar fazer isso mas ... tu me salvou agora cara. Muito obrigado por compartilhar.

@EDIT
Dб pra implementar informaзхes nгo dб, tipo adicionar mais informaзхes da compra pelo pagseguro?
Reply
#4

Quote:
Originally Posted by pWesley
Посмотреть сообщение
Velho, eu te amo cara ... fazia um tempo que eu nгo mexia com PHP, tinha que revirar a mente pra poder tentar fazer isso mas ... tu me salvou agora cara. Muito obrigado por compartilhar.

@EDIT
Dб pra implementar informaзхes nгo dб, tipo adicionar mais informaзхes da compra pelo pagseguro?
Sim dб.

https://pagseguro.uol.com.br/v2/guia...tos.html#!rmcl

Nessa pбgina contйm todo tipo de informaзгo que pode ser enviada por vocк.

E aqui vocк pode vк todos os POST que o PagSeguro envia de volta:

https://pagseguro.uol.com.br/desenvo...de_dados.jhtml

Por exemplo, vocк deseja pegar o nome de quem comprou, basta getar no $_POST:

$_POST['CliNome'];

Algumas coisas vocк precisa enviar pelo XML, tipo a referencia, nгo testei todos.
Reply
#5

Obrigado Amigo !
Reply
#6

Bom, vocк pediu para supor melhorias, entгo vamos lб:

PHP код:
if ($result == "VERIFICADO")
{
   if(
$Status == "Aprovado")
   {
      if(
$Produto_ID == "1"$Cash 1000
SEMPRE que for comparar uma variбvel com uma string no PHP, use strict equals (===).

Certo, mas qual a diferenзa?

A equalidade do PHP (==) nгo leva em conta o tipo de dado. Ou seja, se vocк fizer
PHP код:
$nVar 0;
if(
$nVar == "caio"
A condicional vai ser verdadeira. Porque o interpretador vai converter a string caio para inteiro, entгo ela assume o valor neutro, 0. Jб atй mesmo fiz uma mega postagem aqui falando sobre isso.

O strict equals leva em consideraзгo o tipo de dado, logo a condiзгo abaixo serб falsa:
PHP код:
$nVar 0;
if(
$nVar === "caio"
Aliбs, $Produto_ID realmente й uma string?

Vocк usou mysqli_* e isto й уtimo! Mas seu cуdigo й vulnerбvel a Inject, posso entrar e me autenticar como pagante. Dк uma lida: How to Prevent

No mais ficou bom.
Reply
#7

Muito bom!

@Dolby, a maioria aqui sу quer saber se baixar um GameMode pirata, ninguйm vai saber usar Inject. Mas, isso й uma falha grave, deveria ser counterada (gнria de LOL).
Reply
#8

Quote:
Originally Posted by Dolby
Посмотреть сообщение
Bom, vocк pediu para supor melhorias, entгo vamos lб:

PHP код:
if ($result == "VERIFICADO")
{
   if(
$Status == "Aprovado")
   {
      if(
$Produto_ID == "1"$Cash 1000
SEMPRE que for comparar uma variбvel com uma string no PHP, use strict equals (===).

Certo, mas qual a diferenзa?

A equalidade do PHP (==) nгo leva em conta o tipo de dado. Ou seja, se vocк fizer
PHP код:
$nVar 0;
if(
$nVar == "caio"
A condicional vai ser verdadeira. Porque o interpretador vai converter a string caio para inteiro, entгo ela assume o valor neutro, 0. Jб atй mesmo fiz uma mega postagem aqui falando sobre isso.

O strict equals leva em consideraзгo o tipo de dado, logo a condiзгo abaixo serб falsa:
PHP код:
$nVar 0;
if(
$nVar === "caio"
Aliбs, $Produto_ID realmente й uma string?

Vocк usou mysqli_* e isto й уtimo! Mas seu cуdigo й vulnerбvel a Inject, posso entrar e me autenticar como pagante. Dк uma lida: How to Prevent

No mais ficou bom.
MySQLi por si jб escapa os caracteres. Nгo estб vulnerбvel a SQL Injection.
Reply
#9

Thanks Dolby, vou dar um update.

Mas minha dъvida й, como ocorreria o SQL Injection nesse caso?

Todos os dados POST enviado pra page, o script envia para o site do PagSeguro e ele retorna se й verdadeiro ou nгo, eu sу envio pro MySQL.
Reply
#10

Quote:
Originally Posted by Dolby
Посмотреть сообщение
Bom, vocк pediu para supor melhorias, entгo vamos lб:

PHP код:
if ($result == "VERIFICADO")
{
   if(
$Status == "Aprovado")
   {
      if(
$Produto_ID == "1"$Cash 1000
SEMPRE que for comparar uma variбvel com uma string no PHP, use strict equals (===).

Certo, mas qual a diferenзa?

A equalidade do PHP (==) nгo leva em conta o tipo de dado. Ou seja, se vocк fizer
PHP код:
$nVar 0;
if(
$nVar == "caio"
A condicional vai ser verdadeira. Porque o interpretador vai converter a string caio para inteiro, entгo ela assume o valor neutro, 0. Jб atй mesmo fiz uma mega postagem aqui falando sobre isso.

O strict equals leva em consideraзгo o tipo de dado, logo a condiзгo abaixo serб falsa:
PHP код:
$nVar 0;
if(
$nVar === "caio"
Aliбs, $Produto_ID realmente й uma string?

Vocк usou mysqli_* e isto й уtimo! Mas seu cуdigo й vulnerбvel a Inject, posso entrar e me autenticar como pagante. Dк uma lida: How to Prevent

No mais ficou bom.
Tu nem sabe do que falas, filha da puta burro.
Reply
#11

Mt bom, faz anos que vбrias pessoas aqui do fуrum procuram um sistema desse tipo
Reply
#12

Quote:
Originally Posted by Kamper
Посмотреть сообщение
MySQLi por si jб escapa os caracteres. Nгo estб vulnerбvel a SQL Injection.
Nгo й bem assim que funciona, usando escape nos caracteres nгo quer dizer que esta 100% protegido contra Sql Injection, muito pelo contrбrio NГO estб, por isso digo e repito NUNCA, eu disse NUNCA use essas tйcnicas de escape nos caracteres.

Quote:
Originally Posted by CaioTJF
Посмотреть сообщение
Thanks Dolby, vou dar um update.

Mas minha dъvida й, como ocorreria o SQL Injection nesse caso?

Todos os dados POST enviado pra page, o script envia para o site do PagSeguro e ele retorna se й verdadeiro ou nгo, eu sу envio pro MySQL.
Neste caso й mais DIFНCIL que ocorra pois como vocк esta trabalhando com retorno automбtico a query sу sera executada quando receber as informaзхes retornadas pelo PagSeguro.

Mas leve em conta oque o Dolby disse, Seu cуdigo й sim vulnerбvel a Inject. Uma das melhores maneiras de prevenir o Sql Injection й usando Prepared Statements.


Mas como assim?

Em consultas usando Prepared Statements os parвmetros nгo sгo enviados diretamente na consulta. Eles sгo enviados em um “pacote” separado ao SGBD.

Alйm disso vocк pode configurar uma consulta uma vez e ter a capacidade de executб-lo vбrias vezes, ligando diferentes conjuntos de dados ao usar apenas uma consulta.

OBS: Usando Prepared Statements nгo й possнvel fazer a injeзгo de SQL convencional.


Se protegendo:

O PHP possui alguns drivers para conexгo com o banco de dados MySQL.
Recomendo a vocк Mysqli e PDO, porйm na maioria dos meus projetos faзo o uso do PDO.
Mas isso й por gosto mesmo, escolha o que possui a sintaxe que mais lhe agrade.

Segue abaixo um exemplo do seu cуdigo, porйm usando Prepared Statements.

PHP код:
// Mysqli
function inserir($code$cash) {
    if(
$stmt $conn->prepare("INSERT INTO pagseguro (Code, Cash) VALUES (?, ?)")) {
        
// Passando os valores para o parвmetro como inteiro
        
$stmt->bind_param("ii"$code$cash);
        
// Executa a instruзгo
        
$stmt->execute();
        
// Fechando as instruзгo
        
$stmt->close();
    }

Parabйns pela iniciativa, qualquer coisa estou por aн. Abrss.
Reply
#13

- sua lуgica, estб boa! mas lhe garanto que se fizer uso de PDO, vai estar mais seguro estude um pouco aqui ..
http://php.net/manual/pt_BR/book.pdo.php
Reply
#14

Eiss jб respondeu a todas as dъvidas referente a minha postagem. Incorporo as palavras dele.
Reply
#15

Quote:
Originally Posted by Eiss
Посмотреть сообщение
Nгo й bem assim que funciona, usando escape nos caracteres nгo quer dizer que esta 100% protegido contra Sql Injection, muito pelo contrбrio NГO estб, por isso digo e repito NUNCA, eu disse NUNCA use essas tйcnicas de escape nos caracteres.



Neste caso й mais DIFНCIL que ocorra pois como vocк esta trabalhando com retorno automбtico a query sу sera executada quando receber as informaзхes retornadas pelo PagSeguro.

Mas leve em conta oque o Dolby disse, Seu cуdigo й sim vulnerбvel a Inject. Uma das melhores maneiras de prevenir o Sql Injection й usando Prepared Statements.


Mas como assim?

Em consultas usando Prepared Statements os parвmetros nгo sгo enviados diretamente na consulta. Eles sгo enviados em um “pacote” separado ao SGBD.

Alйm disso vocк pode configurar uma consulta uma vez e ter a capacidade de executб-lo vбrias vezes, ligando diferentes conjuntos de dados ao usar apenas uma consulta.

OBS: Usando Prepared Statements nгo й possнvel fazer a injeзгo de SQL convencional.


Se protegendo:

O PHP possui alguns drivers para conexгo com o banco de dados MySQL.
Recomendo a vocк Mysqli e PDO, porйm na maioria dos meus projetos faзo o uso do PDO.
Mas isso й por gosto mesmo, escolha o que possui a sintaxe que mais lhe agrade.

Segue abaixo um exemplo do seu cуdigo, porйm usando Prepared Statements.

PHP код:
// Mysqli
function inserir($code$cash) {
    if(
$stmt $conn->prepare("INSERT INTO pagseguro (Code, Cash) VALUES (?, ?)")) {
        
// Passando os valores para o parвmetro como inteiro
        
$stmt->bind_param("ii"$code$cash);
        
// Executa a instruзгo
        
$stmt->execute();
        
// Fechando as instruзгo
        
$stmt->close();
    }

Parabйns pela iniciativa, qualquer coisa estou por aн. Abrss.
Obrigado ^^
Atualizei o tуpico
Reply
#16

Bom, falta ensinar como se usa com includes INI.
Reply
#17

No nosso servidor usamos integraзгo automбtica com o PagSeguro e o Paypal desde janeiro desse ano e tem sido uma mгo na roda, jб que nгo hб necessidade nenhuma de interferкncia administrativa no processo.

Sobre o tutorial: muito boa a iniciativa e o tutorial ficou уtimo. Sу que eu acho que vocк podia ter detalhado um pouco mais, como por exemplo ter dado instruзхes de como usar o sandbox para testes. Mas enfim, muito bom tutorial.
Reply
#18

Sistema interessante, tente frizar nas observaзхes que o Dolby comentou.
Reply
#19

Deixa eu ver se entendi, o ID do produto (que no caso й opcional) serб usado para definir a quantidade de cash que serб adicionada ao banco de dados apуs a notificaзгo?
Reply


Forum Jump:


Users browsing this thread: 6 Guest(s)