Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Vamos falar sobre o retorno automático do PagSeguro. Funciona mais ou menos assim:
Quando o usuário efetua uma ação que valha a pena você saber (como por exemplo "O pagamento será feito via boleto, então, estamos
aguardando o pagamento") o PagSeguro manda uma mensagem para você para que você possa ficar sabendo o que aconteceu e possa atualizar
seu banco de dados.
Legal, como ele faz isso? Via carta?
Não, ele não faz isso via carta porque demoraria muito tempo. A intenção é que seu sistema atualize os dados de compra dos seus usuários
de maneira que você tenha mais tempo para tomar aquela limonada em frente ao mar.
Então o PagSeguro tentará conversar de igual para igual: robô para robô. Para isso ele envia essa mensagem via POST. Algo como escrever
o seguinte código html e apertar o botão submit.
<form action="robo_da_loja_virtual" method="post">
<input type="hidden" name="TransacaoID" value="CTH-341-HTPS-1245V-GDCN" />
<input type="hidden" name="Referencia" value="ID234" />
<input type="hidden" name="DataTransacao" value="25/05/2009 11:41:35" />
...
<input type="submit" value="Enviar" />
</form>
Junto com essas informações você receberá o "StatusTransacao" (que pode ser "Completo", "Aguardando Pagto", "Aprovado", "Em Análise" ou
"Cancelado") e "TipoPagamento" (que pode ser "Pagamento", "Cartão de Crédito", "Boleto" ou "Pagamento online").
Com isso você consegue atualizar seu banco de forma simples e fácil.
Hmmmm... isso vai deixar minha loja automática, vou começar agora!
Calma, pequeno gafanhoto... Você já pensou naquelas pessoas que devemos ter medo: os Hackers?! Sim, eu poderia criar um formulário html no meu
computador e enviar a mensagem para seu site, dizendo que minha conta está aprovada, e "automágicamente" você atualizará minha compra.
Para prevenir-se dessas pessoas indesejáveis, o PagSeguro trabalha com a "verificação automática". Que funciona mais ou menos assim. O seu robô
deverá enviar um POST (formulário html e clicar em submit) para o PagSeguro (endereço: https://pagseguro.uol.com.br/Security/NPI/Default.aspx)) com
todos os dados recebidos mais o valor de "Comando" como "validar" e o valor de "Token" contendo o numéro do seu Token secreto que você gera no
seu painel de controle do PagSeguro em "Ferramentas" > "7. Retorno automático" > "2) Token para Conferência de Segurança".
Quando você submete um formulário em html você tem como resposta uma página html normal. A página de "verificação automática" é na verdade a resposta
do comando "validar" que você enviou. Se o PagSeguro realmente enviou esses dados para você, a página deverá ter escrito "VERIFICADO" caso contrário
você verá uma tela contendo o erro de "inválido".
O PagSeguro então me previne de Hackers, me convenceu. Vou começar agora!
Para começar, a primeira coisa que você deve fazer é definir para qual URL o pagseguro deve enviar seu POST informando o status do pagamnto do
seu cliente. Para facilitar sua vida, é a mesma URL de retorno de seu usuário. Você define ela no seu painel de controle do PagSeguro em
"Ferramentas" > "7. Retorno automático" > "1) Ative a URL de retorno". Você deve ativá-la e indicar qual é a url de retorno do seu cliente.
Eita! Mas, se a mesma URL, não vai dar conflito?!
Não! Quando o usuário retorna para sua página, depois de efetuar a transação ele vai via GET, ou seja, ele simplesmente é mandado para a página
sem nenhuma informação extra. Você pode recuperar o seu usuário usando a sessão (mas isso é outro assunto). Já o robô do PagSeguro conversa
com o seu robô através (e unicamente) de POSTs.
POST, GET, URL, Retorno, Validação, isso já está me deixando com a cuca doendo
Calma, para facilitar sua vida, o PagSeguro disponibilizou uma
biblioteca muito boa em PHP que deixa seu trabalho ridicularmente simples. Vou explicar
como funciona.
Depois de definir sua URL de retorno e gerar seu Token você deve começar a escrever seu robô.
Você deve indicar o seu token através de um "define" em php.
define ('TOKEN', 'numero_do_seu_token');
Defina também a função de retorno, ela só será executada depois que o pagseguro enviou o post, você enviou o post de verificação e o
PagSeguro disse que é valido. Essa função recebe os seguintes parâmetros:
retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
);
Então nossa função poderia ser escrita assim:
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
if ($StatusTransacao == 'Completo' OR $StatusTransacao == 'Aprovado') {
$banco = new BancoDeDados();
$banco->update('TabelaDeCompras', $Referencia, 'Liberado');
manda_email($CliEmail, "Seu pagamento foi efetuado! Você receberá seu produto em no máximo 7 dias úteis.");
}
}
Esta função está usando um objeto genérico que chamei de "BancoDeDados" e esse objeto tem (em tese) um método "update" que atualiza
meu banco de dados para o Status de minha linha do banco de dados para 'Liberado' caso o Status que recebi do PagSeguro for 'Completo' ou
'Aprovado' (a diferença entre os dois não sei ao certo até agora, mas os dois indicam que o pagamento foi efetuado). Você pode usar o ADODB
ou PDO ou mysql na unha mesmo para atualizar seu banco de dados, fique à vontade para programar seu robô para fazer o que você quiser.
Também usei uma função chamada "manda_email" que, supostamente, manda um e-mail para o e-mail passado como primeiro parâmetro com a mensagem
especificada. Você pode usar sua própria biblioteca ou mesmo a função "mail" do próprio PHP.
Inclua o arquivo "retorno.php" que vem junto com a biblioteca. Use include/include_once/require/require_once para inserir esse arquivo ao seu
código. Particularmente, eu prefiro o require_once porque se o arquivo tiver alguma falha (conflitar com alguma função pré-definida por exemplo)
ele para o script, evitando erros futuros e o "once" faz ele não inluir novamente caso ele já tenha sido incluído.
require_once("retorno.php");
Lembre-se, a url de retorno é a mesma de retorno para o robô do PagSeguro, então, após esta linha escreva um html normal (ou tratamento usando
sessions) dizendo ao seu usuário: "Olha, o pagamento será feito pelo pagseguro e assim que recebermos a confirmação de pagamento, você receberá
um e-mail".
Em suma, seu script ficará assim:
<?php
require_once ('banco_de_dados.php'); # Biblioteca de banco de dados (fictícia)
require_once ('email.php'); # Funções de e-mail (fictício)
define ('TOKEN', 'numero_do_seu_token');
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens if ($StatusTransacao == 'Completo' OR $StatusTransacao == 'Aprovado') {
$banco = new BancoDeDados();
$banco->update('TabelaDeCompras', $Referencia, 'Liberado');
manda_email($CliEmail, "Seu pagamento foi efetuado! Você receberá seu produto em no máximo 7 dias úteis.");
}
}
require_once("retorno.php");
?><html>
<head>
<title>Obrigado!</title>
</head>
<body>
<h1>Obrigado, falta muito pouco para liberar seu produto...</h1>
<p>O pagamento será feito pelo pagseguro e assim que recebermos a confirmação de pagamento, você receberá um e-mail.</p>
</body>
</html>Todos os dados, que você diz é exatamente o que? Após a verificação ou todos os dados, independente de verificação?
Para o primeiro caso, você pode usar o tratamento através da superglobal $_POST. Fica mais ou menos assim:
<?php
if (isset($_POST)) {
// Gravar estes dados no post
}
define ('Token', 'seu_token');
function ...
Já para o segundo caso, defina sua função "retorno_automatico" para tratar os dados como desejar. Inserindo ou não no banco de dados.
Exemplo:
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
if ($StatusTransacao == 'Completo' OR $StatusTransacao == 'Aprovado') {
$banco = new BancoDeDados();
$banco->query ("
INSERT INTO `tabela` (TransacaoID, Referencia, CliNome, CliEmail) VALUES
($TransacaoID, $Referencia, $CliNome, $CliEmail)
");
manda_email($CliEmail, "Seu pagamento foi efetuado! Você receberá seu produto em no máximo 7 dias úteis.");
}
}
Lembrando que se para cada compra podemos ter varios produtos, a variável $produtos é um array de produtos, onde cada item do array contem a seguinte estrutura:
array (
'ProdID' => '',
'ProdDescricao' => '',
'ProdValor' => '',
'ProdQuantidade' => '',
'ProdFrete' => '',
'ProdExtras' => '',
);
Logo, ele é o único que recebe um tratamento específico. Você também pode usar o "$NumItens" para saber quantos produtos o seu carrinho tem.
Bem, nao sei se ajudou o suficiente, mas acho que é isso... A lista de dados que vêm (e descrições de cada um) está na documentação oficial do PagSeguro.
Aqui não deu certo, fiz uma transferencia mas o banco de dados não atualizo, segue o script:
>
<?php
define ('TOKEN', 'meutoken');
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
if ($StatusTransacao == 'Completo' OR $StatusTransacao == 'Aprovado') {
mysql_connect("localhost","userdobanco","senha");
mysql_select_db("netosjb_news2");
$consulta = mysql_query("INSERT INTO `PagSeguroTransacoes` (TransacaoID, Referencia, CliNome, CliEmail, ProdQuantidade) VALUES ($TransacaoID, $Referencia, $CliNome, $CliEmail, $produtos[ProdQuantidade])");
}
}
require_once("retorno.php");
?>Pergunta, você está testando isso onde? Online ou no seu localhost? Se for localhos o PagSeguro não tem como te enviar o POST.
Lembre que o status de "Aprovado" e "Completo" é quando o pagamento foi efetuado (cartão, boleto, transferencia online ou tranf. de pagseguro para pagseguro). O seu if pode estar barrando nesse sentido.
Lembre, também que não há essa variável $produtos[ProdQuantidade] e sim $produtos[0]['ProdQuantidade'] já que ele é um array de arrays.
O que eu posso te aconselhar é o seguinte: faça um log das informações. Mais ou menos assim:
<?php
if (isset($_POST)) {
log('Recebeu o post, verificando junto ao PagSeguro', $_POST);
}
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
log('Dados Verificados! Agora minha função funciona normalmente.', array ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
));
}
E a função log faz o seguinte:
function log($mensagem, $data) {
$f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
fwrite($f, "$mensagem\n"); # escrevendo a mensagem, mais uma quebra de linha
fwrite($f, var_export($data, true)); # imprime os dados no arquivo de log
fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
fclose($f);
}
Vale a pena lembrar que o arquivo tem que ter permissão de escrita (se você estiver trabalhando em sistema UNIX isso pode não vir como padrão).ok, vou testar aqui estou testando online
Edit:
ae funcinou, recebi o post no pagseguro.log, só não conseguir fazer a função log funcionar ai eu fiz assim:
<?php
define ('TOKEN', 'xxxxxxxx');
if (isset($_POST)) {
$f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
fwrite($f, "'Recebeu o post, verificando junto ao PagSeguro'\n"); # escrevendo a mensagem, mais uma quebra de linha
fwrite($f, var_export( $_POST, true)); # imprime os dados no arquivo de log
fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
fclose($f);
}
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
$f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
fwrite($f, "'Dados Verificados! Agora minha função funciona normalmente.'\n"); # escrevendo a mensagem, mais uma quebra de linha
fwrite($f, var_export(array ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
), true)); # imprime os dados no arquivo de log
fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
fclose($f);
}
require_once("retorno.php");
Agora só presiso adapta pra gravar os dados no meu banco de dados
você sabe como posso fazer pra guarda os seguintes dados no banco de dados?
'TransacaoID'
'Referencia'
'DataTransacao'
'StatusTransacao'
'CliNome'
'CliEmail'
'ProdDescricao_1' (apenas do produto numero 1)
'ProdValor_1' (apenas do produto numero 1)
Eu fiz assim só que não deu certo:
mysql_connect("localhost","xxxx","xxxx"); // supondo que seja mysql
mysql_select_db("netosjb_news2");
mysql_query("INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ($TransacaoID, $Referencia, $CliNome, $CliEmail, $DataTransacao, $StatusTransacao, $produtos[0]['$ProdDescricao'], $produtos[0]['$ProdValor'])");
}sua query
mysql_query("INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ($TransacaoID, $Referencia, $CliNome, $CliEmail, $DataTransacao, $StatusTransacao, $produtos[0]['$ProdDescricao'], $produtos[0]['$ProdValor'])");
Está com a(s) seguinte(s) falha(s):
O $produtos é um array contendo arrays. Até aí tudo bem o seu "$produtos[0]" está realmente pegando o primeiro item do array (primeiro produto), mas dentro dele temos arrays associativos, então a chamada é para a palavra "ProdDescricao" e não "$ProdDescricao", que no caso, o PHP interpreta como uma variável, que provavelmente é vazia. Ficando assim sua expressão: "$produtos[0][]". Na verdade você deve fazer o seguinte:
mysql_query("INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ($TransacaoID, $Referencia, $CliNome, $CliEmail, $DataTransacao, $StatusTransacao, $produtos[0]['ProdDescricao'], $produtos[0]['ProdValor'])");
Experimentaê e me manda resposta :D
Não funcionou http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif , recebi os dados apenas no pagseguro.log
<?php
define ('TOKEN', 'xxxxxx');
if (isset($_POST)) {
$f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
fwrite($f, "'Recebeu o post, verificando junto ao PagSeguro'\n"); # escrevendo a mensagem, mais uma quebra de linha
fwrite($f, var_export( $_POST, true)); # imprime os dados no arquivo de log
fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
fclose($f);
}
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
mysql_connect("localhost","xxxx","xxxx");
mysql_select_db("netosjb_news2");
mysql_query("INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ($TransacaoID, $Referencia, $CliNome, $CliEmail, $DataTransacao, $StatusTransacao, $produtos[0]['ProdDescricao'], $produtos[0]['ProdValor'])");
$f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
fwrite($f, "'Dados Verificados! Agora minha função funciona normalmente.'\n"); # escrevendo a mensagem, mais uma quebra de linha
fwrite($f, var_export(array ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
), true)); # imprime os dados no arquivo de log
fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
fclose($f);
}
require_once("retorno.php");
?>Você pode postar o seu log?
com a grande ajuda do michael consegui terminar o meu retorno automatico, agora ao receber um post da pagseguro eles são salvos no banco de dados.
<?php
define ('TOKEN', 'numero_do_token');
if (isset($_POST)) {
$f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
fwrite($f, "'Recebeu o post, verificando junto ao PagSeguro'\n"); # escrevendo a mensagem, mais uma quebra de linha
fwrite($f, var_export( $_POST, true)); # imprime os dados no arquivo de log
fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
fclose($f);
}
function retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
) {
mysql_connect("localhost","user_db","senha_db");
mysql_select_db("nome_db");
mysql_query("INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ('$TransacaoID','$Referencia','$CliNome', '$CliEmail','$DataTransacao','$StatusTransacao','{$produtos[0]['ProdDescricao']}','{$produtos[0]['ProdValor']}')");
$f=fopen ('pagseguro.log', 'a'); # o "a" é para ele "appendar" o conteúdo, ou seja, colocar ao final
fwrite($f, "'Dados Verificados! Agora minha função funciona normalmente.'\n"); # escrevendo a mensagem, mais uma quebra de linha
fwrite($f, var_export(array ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
), true)); # imprime os dados no arquivo de log
fwrite($f, "\nSQL: INSERT INTO PagSeguroTransacoes (TransacaoID, Referencia, CliNome, CliEmail, datahora, StatusTransacao, ProdDescricao, ProdValor) VALUES ('$TransacaoID','$Referencia', '$CliNome','$CliEmail','$DataTransacao','$StatusTransacao','{$produtos[0]['ProdDescricao']}','{$produtos[0]['ProdValor']}')\n");
fwrite($f, "\n---------\n\n"); # um espaço para separar as ocorrencias
fclose($f);
}
require_once("retorno.php");
?>
Obrigado michal granados pela grande ajuda.Micheal, simplesmente OTIMO artigo, esta de parabens.
:)
a diferença entre os dois não sei ao certo até agora, mas os dois indicam que o pagamento foi efetuado)
Li melhor hoje e fui atraz das diferenças:
Completo: Pagamento completo
Aguardando Pagto: Aguardando pagamento do cliente
Aprovado: Pagamento aprovado, aguardando compensação
Em Análise: Pagamento aprovado, em análise pelo PagSeguro
Cancelado: Pagamento cancelado pelo PagSeguro
Então @silverfox,
o que a documentação diz eu sei, mas não sei exatamente a diferença. Acontece que meus posts vem sempre um OU outro, mas tanto para um quanto para outro a transação está aprovada, mas a diferença ainda não sei se é pelo tipo de pagamento ou se realmente tem uma diferença prática.
Bom, se alguém souber informe. Vou ler alguns logs de minhas contas para ver se consigo achar um padrão.
A variável "StatusTransacao" pode receber as seguintes variáveis:
Completo: Pagamento completo
Aguardando Pagto: Aguardando pagamento do cliente
Aprovado: Pagamento aprovado, aguardando compensação
Em Análise: Pagamento aprovado, em análise pelo PagSeguro
Cancelado: Pagamento cancelado pelo PagSeguro
Ai pergunto:
Se o cliente escolheu por exemplo realizar o pagamento via boleto bancário o "StatusTransacao" inicial será "Aguardando Pagto", correto?
Quando o cliente realizar o pagamento e o status mudar para "Completo" o PagSeguro enviará para minha URL de retorno outro POST com esta informação? Se sim terei que retornar novamente uma verificação com o TOKEN ? Como funciona essa "atualização" do status da transação?
Além da pergunta acima, tenho outra dúvida: para cada item do pedido é enviado uma variável deste tipo abaixo no POST de verificação?
>
ProdID_x: ID do produto
ProdDescricao_x: Descrição do produto
ProdValor_x: Valor unitário do produto
ProdQuantidade_x: Quantidade comprada do produto
ProdFrete_x: Valor do frete deste produto Formato: 0,00
ProdExtras_x Valor de taxas estras deste produto Formato: 0,00
Exemplo:
ProdID_1, ProdDescricao_1, ProdValor_1, ProdQuantidade_1, ProdFrete_1, ProdExtras_1, ProdID_2, ProdDescricao_2, ...
>
A variável "StatusTransacao" pode receber as seguintes variáveis:
Completo: Pagamento completo
Aguardando Pagto: Aguardando pagamento do cliente
Aprovado: Pagamento aprovado, aguardando compensação
Em Análise: Pagamento aprovado, em análise pelo PagSeguro
Cancelado: Pagamento cancelado pelo PagSeguro
Ai pergunto:
Se o cliente escolheu por exemplo realizar o pagamento via boleto bancário o "StatusTransacao" inicial será "Aguardando Pagto", correto?
Quando o cliente realizar o pagamento e o status mudar para "Completo" o PagSeguro enviará para minha URL de retorno outro POST com esta informação? Se sim terei que retornar novamente uma verificação com o TOKEN ? Como funciona essa "atualização" do status da transação?
Sim, o PagSeguro enviará outro POST informando que a transação agora é "Completo", um POST igual ao anterior, só que com o "StatusTransacao" como "Completo".
Particularmente eu uso apenas os StatusTransacao do tipo Completo e Aprovado, que são os únicos que me interessam. Daí vale a regra de negócio de cada um.
Em PHP ficaria assim...
if (in_array($StatusTranacao, array('Completo', 'Aprovado'))) {
$db->update(...)
}>
Além da pergunta acima, tenho outra dúvida: para cada item do pedido é enviado uma variável deste tipo abaixo no POST de verificação?
ProdID_x: ID do produto
ProdDescricao_x: Descrição do produto
ProdValor_x: Valor unitário do produto
ProdQuantidade_x: Quantidade comprada do produto
ProdFrete_x: Valor do frete deste produto Formato: 0,00
ProdExtras_x Valor de taxas estras deste produto Formato: 0,00
Exemplo:
ProdID_1, ProdDescricao_1, ProdValor_1, ProdQuantidade_1, ProdFrete_1, ProdExtras_1, ProdID_2, ProdDescricao_2, ...
Exatamente! O PagSeguro enviará os valores de ProdExtras_X e ProdFrete_X também, mesmo que você não tenha passado. Ele enviará (provavelmente) tais valores como 0,00.
Bom dia a todos,
o retorno automático é realmente bem simples de se implantar, mas estou com uma dúvida e acredito que seja o local para discutirmos.
Tenho funcionando o pague uol e tudo tranquilo, mas fiz apenas teste, ainda não entreguei o sistema ao meu cliente, mas me surgiu uma dúvida.
Imagine que no momento que o cliente faz o pagamento, o site por acaso está fora o ar temporariamente.
O post não vai chegar, o pedido não vai ser atualizado. Apenas chegara o e-mail do pague uol confirmando e tal.
Minha dúvida é se tem como verificar uma transição especifica futuramente.
Se tiver, fica bem interessante, na lista de pedidos posso por um botão para fazer REFRESH no status, no qual vai solicitar o stats no pague uol e receber o retorno.
Alguém tem ideia se é possível?
>
Bom dia a todos,
o retorno automático é realmente bem simples de se implantar, mas estou com uma dúvida e acredito que seja o local para discutirmos.
Tenho funcionando o pague uol e tudo tranquilo, mas fiz apenas teste, ainda não entreguei o sistema ao meu cliente, mas me surgiu uma dúvida.
Imagine que no momento que o cliente faz o pagamento, o site por acaso está fora o ar temporariamente.
O post não vai chegar, o pedido não vai ser atualizado. Apenas chegara o e-mail do pague uol confirmando e tal.
Minha dúvida é se tem como verificar uma transição especifica futuramente.
Se tiver, fica bem interessante, na lista de pedidos posso por um botão para fazer REFRESH no status, no qual vai solicitar o stats no pague uol e receber o retorno.
Alguém tem ideia se é possível?
Acho que não tem como, estava até fazendo uns testes com navegadores como o lynx mas parece que sem javascript, o site deles é inacessível. Sim serugança nota dez. Mas sinto falta do uso de uma API para o PagSeguro. Sei lá, algo como:
PagSegutro->contratos(usuario='xxx', senha='xxx', token='xxx')
que retornaria uma lista de todas as TrasacoesID de sei lá, cinco últimos dias.
E depois um:
PagSeguro->Status(usuario='xxx', senha='xxx', token='xxx', trasacaoID='xxx')
e ele te retorna o status, ou ainda um
PagSeguro->Dados(usuario='xxx', senha='xxx', token='xxx', trasacaoID='xxx')
que retorna não só o status mas todos os dados.
Algumas ações também poriam ser muito úteis como.
PagSeguro->emitirCobranca(usuario='xxx', senha='xxx', token='xxx', para='email@xxx.com', [dados de cobrança como um formulário de POST do PagSeguro, ou seja, produto_1, preco_1, etc, etc')
E ele se encarregava de enviar e-mail para o carinha normalmente. :D
Não sei se eles estão pensando em fazer algo parecido e tal :D , mas que ia ajudar a comunidade e muito, ah isso ia.
Estou pensando em fazer uns testes com o SELENIUM (plugin para Firefox) ou algo com javascript. Mas vamos que vamos.
Boa noite Pessoal!
Primeiramente Michel, parabéns pelo excelente "tutorial", ele foi bastante util.
Referente ao status do pagamento informado pelo PagSeguro (Completo e Aprovado), eles querem dizer o seguinte:
Aprovado -> O Pagamento foi efetuado com sucesso pelo cliente e
Completo -> O Pagamento foi efetuado com sucesso pelo cliente e além disso o PagSeguro já liberou este valor na sua conta (isso vale também para devoluções e estornos).
Entendido?
Rodrigo Bilheiro
>
Aprovado -> O Pagamento foi efetuado com sucesso pelo cliente e
Completo -> O Pagamento foi efetuado com sucesso pelo cliente e além disso o PagSeguro já liberou este valor na sua conta (isso vale também para devoluções e estornos).
"Aprovado" ta incompleta a frase, cade o resto.??? ou é só isso mesmo e esse "E" ta sobrando?
Falow abraços
>
>
Aprovado -> O Pagamento foi efetuado com sucesso pelo cliente e
Completo -> O Pagamento foi efetuado com sucesso pelo cliente e além disso o PagSeguro já liberou este valor na sua conta (isso vale também para devoluções e estornos).
"Aprovado" ta incompleta a frase, cade o resto.??? ou é só isso mesmo e esse "E" ta sobrando?
Falow abraços
acho que aquele "e" indica é a deixa para o "Completo"
Olá Michael e demais, primeiro quero agradecer a todos por todas as dicas aqui... realmente ajuda e muitissimo.
O motivo do meu contato é o seguinte: eu gostaria de saber como eu faço para gravar todos os produtos vindos no post já que não há como prever a quantidade de produtos; ou seja, na minha tabela tenho:
ProdID / ProdDescricao / ProdValor / ProdQuantidade / ProdFrete / ProdExtras
Acontece que quando eu recebo o post do Pagseguro recebo da seguinte forma:
'ProdID_1' => '',
'ProdDescricao_1' => '',
'ProdValor_1' => '',
'ProdQuantidade_1' => '',
'ProdFrete_1' => '',
'ProdExtras_1' => '',
'ProdID_2' => '',
'ProdDescricao_2' => '',
'ProdValor_2' => '',
'ProdQuantidade_2' => '',
'ProdFrete_2' => '',
'ProdExtras_2' => '',
ProdID_3...
ProdID_4...
Enfim, posso receber muitos produtos no mesmo post. Eu gostaria de saber como vou tratar e armazenar no banco estas informações; poderiam me sugerir alguma coisa? Se possível disponibilizar o código para que eu possa estudar?
O objetivo é que depois de armazenados no banco eu vou precisar disponibilizar para consulta todos os registros dos produtos "pela referência (recebida pelo post)" e também calcular a soma de todos os produtos e exibir o resultado em uma área restrita.
Eu estou sentindo dificuldades quanto a gravar os produtos no banco por conta da quantidade que é imprevisível.
Obrigado desde já à todos.
Resposta muito rápida!
Você sabe como fazer referencias com bancos de dados?
Não?!
Experimente isto: Inseriu no banco de dados uma nova compra, ok? Então você pega esse ID. (last_insert_id, last_id, insert_id, dá uma procurada no google pra ver como você deve implementar isso com seu banco de dados). E então você aloca em outra tabela um produto com referencia a esta compra. Entendeu? Se não, eu desenho.
Eis as tabelas:
tabela de compras:
ID_COMPRA, NOME_USUARIO, EMAIL, TRANSACAO_ID
tabela de produtos
ID_PRODUTO, ID_COMPRA, PRODUTO, PESO, VALOR
Agora, populando...
ID_COMPRA, NOME_USUARIO, EMAIL, TRANSACAO_ID
1 Michael ... 598-23097-32
ID_PRODUTO, ID_COMPRA, PRODUTO, PESO, VALOR
1 1 café 100 150
2 1 leite 200 298
3 1 manteiga 200 570
Perceba que, ao popular, você indica de qual compra aquele produto faz parte. Logo, quando você fizer um select na segunda tabela com um where ID_COMPRA igual a 1 você terá todos os produtos da compra numero 1. :D
Experimente fazer isso com JOINs você vai gostar do que é possivel.
Michael, ok, mas e quanto "a gravar os produtos no banco por conta da quantidade que é imprevisível"? Já tentei de tudo e não consigo um meio de fazer isso.
Eu recebo o post com n produtos, exemplo abaixo:
ID_PRODUTO, ID_COMPRA, PRODUTO, PESO, VALOR
1 1 café 100 150
2 1 leite 200 298
3 1 manteiga 200 570
No exemplo acima todos os produtos pertencem a mesma compra. Poderia me ajudar com o código para inseir no banco? Desculpe incomodar é que estou aprendendo agora e vejo que é bem experiente. Obrigado desde já.
>
Resposta muito rápida!
Você sabe como fazer referencias com bancos de dados?
Não?!
Experimente isto: Inseriu no banco de dados uma nova compra, ok? Então você pega esse ID. (last_insert_id, last_id, insert_id, dá uma procurada no google pra ver como você deve implementar isso com seu banco de dados). E então você aloca em outra tabela um produto com referencia a esta compra. Entendeu? Se não, eu desenho.
Eis as tabelas:
tabela de compras:
ID_COMPRA, NOME_USUARIO, EMAIL, TRANSACAO_ID
tabela de produtos
ID_PRODUTO, ID_COMPRA, PRODUTO, PESO, VALOR
Agora, populando...
ID_COMPRA, NOME_USUARIO, EMAIL, TRANSACAO_ID
1 Michael ... 598-23097-32
ID_PRODUTO, ID_COMPRA, PRODUTO, PESO, VALOR
1 1 café 100 150
2 1 leite 200 298
3 1 manteiga 200 570
Perceba que, ao popular, você indica de qual compra aquele produto faz parte. Logo, quando você fizer um select na segunda tabela com um where ID_COMPRA igual a 1 você terá todos os produtos da compra numero 1. :D
Experimente fazer isso com JOINs você vai gostar do que é possivel.
Michael, eu poderia no caso utilizar a transação id para fazer essa relação? Não seria mais fácil fazer assim? E como recebo tudo no post então não teria que utilizar outras instruções... o que acha???
Para fazer o looping eu usei o código abaixo:
for ($i=1;isset($_POST["ProdID_1"]);$i++) {
$produto = $_POST["ProdID_{$i}"];
if($produto != ''){
$ProdID = $_POST["ProdID_{$i}"];
$ProdDescricao = $_POST["ProdDescricao_{$i}"];
$ProdValor = $_POST["ProdValor_{$i}"];
$ProdQuantidade = $_POST["ProdQuantidade_{$i}"];
mysql_select_db($database_cursosemaudio_con, $cursosemaudio_con);
$query_rsVendas = "INSERT INTO vendas (prod_id, prod_descricao, prod_valor, prod_quantidade) VALUES ('$ProdID', '$ProdDescricao', '$ProdValor', '$ProdQuantidade')";
$rsVendas = mysql_query($query_rsVendas, $cursosemaudio_con) or die(mysql_error());
}
}
Quebrei a cabeça hoje até as 03:00 da manhã, mas consegui chegar onde queria, falta agora implementar a outra tabela com os dados do cliente e depois dazer a relação de uma para outra.
Como eu faria para que todos os dados recibidos fossem guardados no banco de dados do mysql?