Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal não estou recebendo a confirmação do PagSeguro, porque o script não salva os dados no banco de dados, fiz algo errado? por favor alguém poderia ajudar?
$retorno_site = 'retorno.php'; // Site para onde o usuário vai ser redirecionado ao termino do pagamento
$retorno_token = 'meu token'; // Token gerado pelo PagSeguro
$retorno_host = 'localhost'; // Local da base de dados MySql
$retorno_database = 'DB'; // Nome da base de dados MySql
$retorno_usuario = 'usuario'; // Usuario com acesso a base de dados MySql
$retorno_senha = 'senha'; // Senha de acesso a base de dados MySql
class PagSeguroNpi {
private $timeout = 20; // Timeout em segundos
public function notificationPost() {
$postdata = 'Comando=validar&Token='.TOKEN;
foreach ($_POST as $key => $value) {
$valued = $this->clearStr($value);
$postdata .= "&$key=$valued";
}
return $this->verify($postdata);
}
private function clearStr($str) {
if (!get_magic_quotes_gpc()) {
$str = addslashes($str);
}
return $str;
}
private function verify($data) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = trim(curl_exec($curl));
curl_close($curl);
return $result;
}
}
function MoedaBR($valor) {
$valor = str_replace('.','',$valor);
$valor = str_replace(',','.',$valor);
return $valor;
}
function ConverterData($data) {
$data = explode(' ', $data);
$hora = $data[1]; $data = $data[0];
$data = explode('/', $data);
$data = $data[2].'-'.$data[1].'-'.$data[0].' ';
return $data.$hora;
}
$lnk = mysql_connect($retorno_host, $retorno_usuario, $retorno_senha) or die ('Nao foi possível conectar ao MySql: ' . mysql_error());
mysql_select_db($retorno_database, $lnk) or die ('Nao foi possível ao banco de dados selecionado no MySql: ' . mysql_error());
define('TOKEN', $retorno_token);
retorno_automatico (
$VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
$CliNumero, $CliComplemento, $CliBairro, $CliCidade,
$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
);
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');
}
}
class createLog{
private $name = 'ps.txt';
private $type = 'ab';
public $log;
function setType($type = '') {
$this -> type = $type;
}
function setFileName($name = ''){
$this -> name = $name;
}
public function setLog($log){
$this -> log = $this -> log . $log;
}
public function createlog(){
$f = fopen ($this -> name, $this -> type);
fwrite($f, $this -> log . "\n\n");
fclose($f);
}
}
if (count($_POST) > 0) {
$log = new createLog();
$log -> setLog("POST @ " . date("d/m/Y H:i:s") . "\n");
$log -> setLog("<pre>" . var_export($_POST, true) . "</pre>\n<--------------->\n");
$log -> createlog();
$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<=$NumItens;$i++) {
$ProdID = $_POST["ProdID_{$i}"];
$ProdDescricao = $_POST["ProdDescricao_{$i}"];
$ProdValor = MoedaBR($_POST["ProdValor_{$i}"]);
$ProdQuantidade = $_POST["ProdQuantidade_{$i}"];
$ProdFrete = MoedaBR($_POST["ProdFrete_{$i}"]);
mysql_query("INSERT into PagSeguroProdutos SET
VendedorEmail='$VendedorEmail',
TransacaoID='$TransacaoID',
Ordem='$i',
ProdID='$ProdID',
ProdDescricao='$ProdDescricao',
ProdValor='$ProdValor',
ProdQuantidade='$ProdQuantidade',
ProdFrete='$ProdFrete'");
}
}
}echo"ok<br>";
}Esse script foi baixado pelo PagSeguro diz lá que funcionaria, mas não sei se configurei certo porque não salva os dados.
usando SET pra insert?
Jesus...
Qual o problema em SET no insert?
INSERT INTO tabela SET id = 1
A sintaxe disso está correta.
Ninguém tem alguma solução para me ajudar??
grava em um arquivo de texto o mysql_error() e posta ai para ver se deu algum erro...
Dica...
Porque você não grava o pedido antes de enviar para o PagSeguro, envia na referencia o id da tabela, e quando chegar o retorno você apenas atualiza o status?
Boa Tarde Senartes estou agora utilizando o script disponibilizado pelo PagSeguro, segue abaixo:
<?
$retorno_token = 'Meu_TOKEN'; // Token gerado pelo PagSeguro
define(TOKEN, $retorno_token);
class PagSeguroNpi {
private $timeout = 20; // Timeout em segundos
public function notificationPost() {
$postdata = 'Comando=validar&Token='.TOKEN;
foreach ($_POST as $key => $value) {
$valued = $this->clearStr($value);
$postdata .= "&$key=$valued";
}
return $this->verify($postdata);
}
private function clearStr($str) {
if (!get_magic_quotes_gpc()) {
$str = addslashes($str);
}
return $str;
}
private function verify($data) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = trim(curl_exec($curl));
curl_close($curl);
return $result;
}
}
if (count($_POST) > 0) {
// POST recebido, indica que é a requisição do NPI.
$npi = new PagSeguroNpi();
$result = $npi->notificationPost();
$transacaoID = isset($_POST['TransacaoID']) ? $_POST['TransacaoID'] : '';
if ($result == "VERIFICADO") {
//O post foi validado pelo PagSeguro.
echo"Opa Informações Recebidas <br>";
//Ainda não coloquei os dados Mysql estou esperando printar: echo"Opa Informações Recebidas <br>"; na tela
} else if ($result == "FALSO") {
//O post não foi validado pelo PagSeguro.
echo"Ops Erro, o Pag Seguro não enviou os Dados da Compra. <br>"; echo"Erro na comunicação<br>";
}
} else {
// POST não recebido, indica que a requisição é o retorno do Checkout PagSeguro.
// No término do checkout o usuário é redirecionado para este bloco.
echo"<h3>Sem Resposta do PagSeguro.</h3>";
}
?>
E o script não está executando o que vem depois do "if (count($_POST) > 0) {" ou seja nenhum dado está sendo retornado, não sei se é erro meu, se o PagSeguro não está enviando os dados ou se é erro no script.
Se alguém puder ajudar serei eternamente grato!
Hááá quando eu mudo essa parte do script o que é printado na tela é FALSE:
if (count($_POST) == 0) {
/*
Mudei para == para o script entrar
nessa parte eu sei que é errado,
mas só fiz para fazer um teste
*/
// POST recebido, indica que é a requisição do NPI.
$npi = new PagSeguroNpi();
$result = $npi->notificationPost();
echo $result."<br>"; // Aqui eu printo o Retorno da Classe
$transacaoID = isset($_POST['TransacaoID']) ? $_POST['TransacaoID'] : '';
if ($result == "VERIFICADO") {
//O post foi validado pelo PagSeguro.
echo"Opa Informações Recebidas <br>";
} else if ($result == "FALSO") {
//O post não foi validado pelo PagSeguro.
echo"Ops Erro, o Pag Seguro não enviou os Dados da Compra. <br>"; echo"Erro na comunicação<br>";
}
} else {
// POST não recebido, indica que a requisição é o retorno do Checkout PagSeguro.
// No término do checkout o usuário é redirecionado para este bloco.
echo"<h3>Sem Resposta do PagSeguro.</h3>";
}
O retorno final é sempre o mesmo:
FALSO
Ops Erro, o Pag Seguro não enviou os Dados da Compra.
Sério mesmo preciso muito de Ajuda.
eu não conheço essa tela de erro do PagSeguro (Ops Erro, o Pag Seguro não enviou os Dados da Compra.), post um print ai para eu ver...
Esse texto foi eu quem coloquei, quando executo o script e faço o teste o script retorna "Sem Resposta do PagSeguro" ou seja ele não entra no if (count($_POST) > 0) { ou seja ele não recebe os POST do PagSeguro...
>
if ($result == "VERIFICADO") {
//O post foi validado pelo PagSeguro.
echo"Opa Informações Recebidas <br>";
} else if ($result == "FALSO") {
//O post não foi validado pelo PagSeguro.
echo"Ops Erro, o Pag Seguro não enviou os Dados da Compra. <br>";
} else {
//Erro na integração com o PagSeguro.
echo"Erro na comunicação<br>";
}
Meu velho, que você precisa criar um script que recebe um post de um formulário de contato ( do tipo fale conosco por exemplo ), se você imprimir na tela ( echo, print_r, var_dump...) quando o cliente preencher os campos e enviar o fomulário você irá conseguir visualizar?
Creio que não... quem irá ver essas mensagens será quem está enviando, concorda?
O mesmo acontece com o retorno do PagSeguro. Você não irá ver as mensagens na sua tela, porque quem envia o post é o servidor do PagSeguro, logo quem irá ver essas mensagens seria o Robot do PagSeguro.
Para ver onde que passou o que, utilize logs, tente gravar arquivos de logs, assim é a maneira mais fácil.
Tem um tópico inteiro sobre o retorno automático, aconselho você perder uns 15 minutinhos do seu tempo vendo os exemplos, problemas, sugestões, duvidas... você irá economizar horas tentando entender de outra forma...
http://forum.imasters.com.br/topic/295416-retorno-automatico-pagseguro/
Meu velho, que você precisa criar um script que recebe um post de um formulário de contato ( do tipo fale conosco por exemplo ), se você imprimir na tela ( echo, print_r, var_dump...) quando o cliente preencher os campos e enviar o fomulário você irá conseguir visualizar?
Creio que não... quem irá ver essas mensagens será quem está enviando, concorda?
O mesmo acontece com o retorno do PagSeguro. Você não irá ver as mensagens na sua tela, porque quem envia o post é o servidor do PagSeguro, logo quem irá ver essas mensagens seria o Robot do PagSeguro.
Para ver onde que passou o que, utilize logs, tente gravar arquivos de logs, assim é a maneira mais fácil.
Tem um tópico inteiro sobre o retorno automático, aconselho você perder uns 15 minutinhos do seu tempo vendo os exemplos, problemas, sugestões, duvidas... você irá economizar horas tentando entender de outra forma...
http://forum.imasters.com.br/topic/295416-retorno-automatico-pagseguro/
Obrigado por Responder meu Tópico senartes, eu li o tópico, e segui algumas recomendações, uma delas foi a que você me propôs num outro tópico e eu nem prestei muita atenção que era a criação de um Log, criei uma classe que salva os dados num arquivo texto segue o código:
class createLog{
private $name = 'ps/ps.txt';
private $type = 'ab';
public $log;
function setType($type = '') {
$this -> type = $type;
}
function setFileName($name = ''){
$this -> name = $name;
}
public function setLog($log){
$es = str_replace(' ', '', $log);
$ar = array("'" => "", "=" => "=", ">" => "", ")" => "", "array(" => "", "\n" => "", "," => ",\n");
$st = strtr($es, $ar);
$this -> log = $st;
if($log != ""){
return TRUE;
}else{
return FALSE;
}
}
public function createlog(){
$f = fopen ($this -> name, $this -> type);
fwrite($f, $this -> log);
fclose($f);
}
}
$log = new createLog();
$log -> setLog(var_export($_POST, true));
$log -> createlog();
ele salva os dados corretamente, pedi para essa CLASSE tratar os dados antes de salvar para ser mais fácil do meu código pegar essas informações, mas meu problema é enviar essas informações para o PagSeguro... eis o Resultado Final do meu Log:
VendedorEmail=silviocapaldi@yahoo.com.br,
TransacaoID=F9B5E1EA22A64BACA83871A24451D1A3,
Referencia=11,
Extras=0,00,
TipoFrete=FR,
ValorFrete=0,00,
Anotacao=,
DataTransacao=02/08/201108:49:54,
TipoPagamento=Boleto,
StatusTransacao=AguardandoPagto,
CliNome=GuilhermeBrunoMarquesBiancardi,
CliEmail=guilhermeaw.com@gmail.com,
CliEndereco=RuadasFlores,
CliNumero=123,
CliComplemento=apto69,
CliBairro=.,
CliCidade=MontesClaros,
CliEstado=MG,
CliCEP=39400000,
CliTelefone=1935232436,
NumItens=4,
Parcelas=1,
ProdID_1=145206,
ProdDescricao_1=Produto1Teste,
ProdValor_1=0,22,
ProdQuantidade_1=5,
ProdFrete_1=0,00,
ProdExtras_1=0,00,
ProdID_2=846364,
ProdDescricao_2=Produto2Teste,
ProdValor_2=0,16,
ProdQuantidade_2=4,
ProdFrete_2=0,00,
ProdExtras_2=0,00,
ProdID_3=805540,
ProdDescricao_3=Produto3Teste,
ProdValor_3=0,25,
ProdQuantidade_3=3,
ProdFrete_3=0,00,
ProdExtras_3=0,00,
ProdID_4=474953,
ProdDescricao_4=Produto4Teste,
ProdValor_4=0,20,
ProdQuantidade_4=1,
ProdFrete_4=0,00
ProdExtras_4=0,00,
Resolvi meu Problema! Valeu Galera que tentou ajudar! Tópico com meu código:
Valeu senardes mas já resolvi meu problema e criei um tópico postando meu código!
usando SET pra insert?
Jesus...
sintaxe de insert:
INSERT INTO tabela (campo1, campo2) values ('{$campo1}', '{$campo2}');