Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gaw

[Resolvido] Retorno PagSeguro

Recommended Posts

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.