Gaw 5 Denunciar post Postado Julho 28, 2011 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'"); } } } } else { echo"ok<br>"; } Compartilhar este post Link para o post Compartilhar em outros sites
Custellinha 0 Denunciar post Postado Julho 28, 2011 usando SET pra insert? Jesus... sintaxe de insert: INSERT INTO tabela (campo1, campo2) values ('{$campo1}', '{$campo2}'); Compartilhar este post Link para o post Compartilhar em outros sites
Gaw 5 Denunciar post Postado Julho 28, 2011 Esse script foi baixado pelo PagSeguro diz lá que funcionaria, mas não sei se configurei certo porque não salva os dados. Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Julho 28, 2011 usando SET pra insert? Jesus... Qual o problema em SET no insert? INSERT INTO `tabela` SET `id` = 1 A sintaxe disso está correta. Compartilhar este post Link para o post Compartilhar em outros sites
Gaw 5 Denunciar post Postado Julho 28, 2011 Ninguém tem alguma solução para me ajudar?? Compartilhar este post Link para o post Compartilhar em outros sites
alcaidedigital 57 Denunciar post Postado Julho 29, 2011 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? Compartilhar este post Link para o post Compartilhar em outros sites
Gaw 5 Denunciar post Postado Julho 29, 2011 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>"; } else { //Erro na integração com o PagSeguro. 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>"; } else { //Erro na integração com o PagSeguro. 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. Compartilhar este post Link para o post Compartilhar em outros sites
alcaidedigital 57 Denunciar post Postado Agosto 1, 2011 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... Compartilhar este post Link para o post Compartilhar em outros sites
Gaw 5 Denunciar post Postado Agosto 1, 2011 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... Compartilhar este post Link para o post Compartilhar em outros sites
alcaidedigital 57 Denunciar post Postado Agosto 1, 2011 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/ Compartilhar este post Link para o post Compartilhar em outros sites
Gaw 5 Denunciar post Postado Agosto 2, 2011 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, Compartilhar este post Link para o post Compartilhar em outros sites
Gaw 5 Denunciar post Postado Agosto 2, 2011 Resolvi meu Problema! Valeu Galera que tentou ajudar! Tópico com meu código: Solução PagSeguro Compartilhar este post Link para o post Compartilhar em outros sites
alcaidedigital 57 Denunciar post Postado Agosto 2, 2011 Solução para log - > http://forum.imasters.com.br/topic/425122-retorno-automatico-impossivel/page__view__findpost__p__1678410 Compartilhar este post Link para o post Compartilhar em outros sites
Gaw 5 Denunciar post Postado Agosto 2, 2011 Valeu senardes mas já resolvi meu problema e criei um tópico postando meu código! Solução PagSeguro Compartilhar este post Link para o post Compartilhar em outros sites