Ir para conteúdo

Arquivado

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

demian

retorno automatico IMPOSSIVEL

Recommended Posts

Ola Pessoal, td bem ???

 

Sou novo aqui, programo php a 11 anos ja, e estou a mais de 72 horas tentando fazer o retorno automatico do pagseguro funcionar, lamentavelmente é assim que funciona no uol, sem exemplos de fato práticos, exemplos inteiros, tudo quebrado, cada coisa em um lugar, fala do php, mas não do html e vice versa, quer dizer, eu ja tentei mais de 30 exemplos na internet, e nada, absolutamente nada, no maximo eu pego o id da transação, eu tenho certeza ABSOLUTA que eu não estou recebendo os POSTS, primeiro que eles nunca são inseridos no banco de dados, segundo que quando tento gerar o log, também falha, quer dizer, nem o log eu consigo, ou seja, retorno zero do pagseguro.

 

Tenho certeza que o script esta em plataforma: Linux hm4204 2.6.18-194.32.2.el5.yos1 #1 SMP Thu Jan 6 17:24:47 BRST 2011 x86_64

 

 

Eu configurei o pag seguro para retornar em www.xxxx.com.br/progresso/pagseguro.php

 

 

 

Dentro do pagseguro.php eu tento assim que vi em um tutorial :

 

<?

##############################################################

# CONFIGURAÇÕES

##############################################################

 

$retorno_site = 'http://www.exemplo.com.br/compra_efedutada.html'; // Site para onde o usuário vai ser redirecionado

$retorno_token = '000000000000000000000000000'; // Token gerado pelo PagSeguro

 

$retorno_host = 'localhost'; // Local da base de dados MySql

$retorno_database = 'basededados'; // 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

 

 

###############################################################

# NÃO ALTERE DESTA LINHA PARA BAIXO

################################################################

 

$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());

 

// Validando dados no PagSeguro

 

$PagSeguro = 'Comando=validar';

$PagSeguro .= '&Token=' . $retorno_token;

$Cabecalho = "Retorno PagSeguro";

 

foreach ($_POST as $key => $value)

{

$value = urlencode(stripslashes($value));

$PagSeguro .= "&$key=$value";

}

 

if (function_exists('curl_exec'))

{

$curl = true;

}

elseif ( (PHP_VERSION >= 4.3) && ($fp = @fsockopen ('ssl://pagseguro.uol.com.br', 443, $errno, $errstr, 30)) )

{

$fsocket = true;

}

elseif ($fp = @fsockopen('pagseguro.uol.com.br', 80, $errno, $errstr, 30))

{

$fsocket = true;

}

 

if ($curl == true)

{

$ch = curl_init();

 

curl_setopt($ch, CURLOPT_URL, 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx');

curl_setopt($ch, CURLOPT_POST, true);

curl_setopt($ch, CURLOPT_POSTFIELDS, $PagSeguro);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_HEADER, false);

curl_setopt($ch, CURLOPT_TIMEOUT, 30);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

 

curl_setopt($ch, CURLOPT_URL, 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx');

$resp = curl_exec($ch);

 

curl_close($ch);

$confirma = (strcmp ($resp, "VERIFICADO") == 0);

}

elseif ($fsocket == true)

{

$Cabecalho = "POST /Security/NPI/Default.aspx HTTP/1.0\r\n";

$Cabecalho .= "Content-Type: application/x-www-form-urlencoded\r\n";

$Cabecalho .= "Content-Length: " . strlen($PagSeguro) . "\r\n\r\n";

 

if ($fp || $errno>0)

{

fputs ($fp, $Cabecalho . $PagSeguro);

$confirma = false;

$resp = '';

while (!feof($fp))

{

$res = @fgets ($fp, 1024);

$resp .= $res;

if (strcmp ($res, "VERIFICADO") == 0)

{

$confirma=true;

break;

}

}

fclose ($fp);

}

else

{

echo "$errstr ($errno)<br />\n";

}

}

 

 

if ($confirma) {

 

// Recebendo Dados

$TransacaoID = $_POST['TransacaoID'];

$VendedorEmail = $_POST['VendedorEmail'];

$Referencia = $_POST['Referencia'];

$TipoFrete = $_POST['TipoFrete'];

$ValorFrete = $_POST['ValorFrete'];

$Extras = $_POST['Extras'];

$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

TransacaoID='$TransacaoID',

VendedorEmail='$VendedorEmail',

Referencia='$Referencia',

TipoFrete='$TipoFrete',

ValorFrete='$ValorFrete',

Extras='$Extras',

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();");

 

}

 

Header("Location: $retorno_site"); exit();

?>

 

 

 

 

usando esta tabela aqui:

 

CREATE TABLE `PagSeguroTransacoes` (

`TransacaoID` varchar(36) NOT NULL,

`VendedorEmail` varchar(200) NOT NULL,

`Referencia` varchar(200) default NULL,

`TipoFrete` char(2) default NULL,

`ValorFrete` decimal(10,2) default NULL,

`Extras` decimal(10,2) default NULL,

`Anotacao` text,

`TipoPagamento` varchar(50) NOT NULL,

`StatusTransacao` varchar(50) NOT NULL,

`CliNome` varchar(200) NOT NULL,

`CliEmail` varchar(200) NOT NULL,

`CliEndereco` varchar(200) NOT NULL,

`CliNumero` varchar(10) default NULL,

`CliComplemento` varchar(100) default NULL,

`CliBairro` varchar(100) NOT NULL,

`CliCidade` varchar(100) NOT NULL,

`CliEstado` char(2) NOT NULL,

`CliCEP` varchar(9) NOT NULL,

`CliTelefone` varchar(14) default NULL,

`NumItens` int(11) NOT NULL,

`Data` datetime NOT NULL,

`status` tinyint(1) unsigned NOT NULL default '0',

UNIQUE KEY `TransacaoID` (`TransacaoID`,`StatusTransacao`),

KEY `Referencia` (`Referencia`),

KEY `status` (`status`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

 

 

 

Quando tento gravar o log, não grava NADA, NEM A FRASE DE 'GRAVANDO ... ' ABSOLUTAMENTE NADA.O meu servidor ja vi que da suporte a CURL !!!

 

 

 

Agora eu pergunto, pq ta errado ??? ta tudo certinho, tenho ceretza que ou é a locaweb ou alguma coisa, não é possivel, as senhas do banco de dados estão certas, todos os detalhes certos,

 

ALGUÉM ME AJUDA PELO AMOR DE DEUS ???

 

 

 

Demian Escobar

WEb Escobar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tive o mesmo problema com o pagseguro, mas enfim consegui resolver todos os problemas. Bem, irei apresentar todo o meu script para você, quem sabe cosnegue adpatá-lo:

 

<?php include("conexao.php");?>

<?php
//Definindo o TOKEN de segurança
define('TOKEN', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX');

//Caso eu tenha recebido o POST do pagseguro
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);  
}

//Função que acessa por cURL os dados da venda
function retorno_automatico ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,$CliNumero, $CliComplemento, $CliBairro, $CliCidade,$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens, $Parcelas){

$query = mysql_query("select * from vendas where transacao_id = '$TransacaoID'");
$resultado = mysql_num_rows($query);

//Descubro se o ID da transação já existe, sem sim, apenas atualizo, senão, insiro outro registro
if($resultado == 1){
	//Atualizando STATUS
	mysql_query("update vendas set status_transacao = '$StatusTransacao' where transacao_id = '$TransacaoID'");
	if ($StatusTransacao == 'Completo' || $StatusTransacao == 'Aprovado'){
			mysql_query("update vendas set data_finalizado = current_timestamp where transacao_id = '$TransacaoID'");
			mysql_query("update produtos set estoque = estoque - 1 where id = 1");

			//mandar e-mail para o usuário confirmando o pagamento e solicitando os dados
			include("include/email.php");
			//e-mail enviado para o usuário!	
	}
	if ($StatusTransacao == 'Cancelado')
		mysql_query("update vendas set data_finalizado = current_timestamp where transacao_id = '$TransacaoID'");
}
else{
	//Inserindo no banco de dados	
	mysql_query("insert into vendas(vendedor_email, transacao_id, referencia, anotacao, data_transacao, tipo_pagamento, status_transacao, cli_nome, cli_email, cli_endereco, cli_numero, cli_complemento, cli_bairro, cli_cidade, cli_estado, cli_cep, cli_telefone, produtos, num_itens, parcelas) values ('$VendedorEmail','$TransacaoID','$Referencia','$Anotacao',current_timestamp,'$TipoPagamento','$StatusTransacao','$CliNome','$CliEmail','$CliEndereco','$CliNumero','$CliComplemento','$CliBairro','$CliCidade','$CliEstado','$CliCEP','$CliTelefone','{$produtos[0]['ProdDescricao']}','$NumItens',$Parcelas)");
}

//Gravando um LOG
$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("include/retorno.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Recebemos o seu pedido!</title>
<link rel="stylesheet" type="text/css" href="css/confirmacao.css" />
</head>

<body>
<div id="compra">
<img src="img/compra-efetuada.png" alt="compra efetuada com sucesso"/>
</div>
</body>
</html>

 

meu código está todo comentado, talvez te ajude

Esto uusando a biblioteca VISIE Pagseguro, qeu você pode encontrar aqui -> http://visie.com.br/pagseguro/linguagem/php/

Eu sempre errava nas seguintes coisas:

 

  1. Token
  2. Url de retorno
  3. mysql_query

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estive fazendo uma gateway para Cielo, depois de duas semanas resovi fazer do meu geito, eles tinham um manual cheio de exemplos furados, coisas faltando e o proprio sistema que mandavam so funciona em ambiente de testes. Pelo que vejo não são os unicos. Deveria funcionar direto, sem segredos, recebendo o post, tente fazer sem usar Curl, ele so atrapalha. Pelo menos eu não gosto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não quero duvidar de quem tem 11 programando... mais vamos por partes... primeiro vamos verificar se realmente o post está chegando para voce... pode colocar isso na sua URL de retorno?

So lembrando que a pasta deve ter permissão de escrita ou deve haver um arquivo com o nome de ps.txt com permissão de escrita para poder gravar nele os logs... ( claro que você ja sabe disso...)

<?php
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($_POST){    
   $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();
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Amigos, beleza ??

 

 

Esta ajuda foi ótima, depois dela comecei a conseguir ver os logs, e eles estão sendo gerados normalmente, agora tem um PROBLEMASSO, que ue não sei o que é:

 

tenho uma conta do pag seguro, na area real, não na de testes, e coloquei 50 reais la, ou seja, são duas contas, a conta do dono do site, que vou chamar de conta 1 e a minha conta, que eu uso para testar, ai coloquei 50 pilas na minha conta e fico comprando, o problema é, na primeira compra, ele grava no banco de dados, na segunda ele não grava mais, mesmo eu tendo CERTEZA ABSOLUTA que o id da transação é diferente, pq eu consigo ver no log, que dizer, faço da minha conta uma compra de 1 real, ai ele grava no log, e no banco de dados, tudo certinho, ai 2 minutos deopis eu tento fazer uma segunda compra do mesmo usuario, ai ele grava no log normal, verifico que o id da transação é outro ( pq neste script se o id da transação for igual, ai atualiza, senão insere no banco de dados ) e mesmo assim ele não grava, de jeito nenhum, ai eu vou no phpmyadmin e apago, dai testo novamente e grava, ai qnd tento comprar pela segunda vez, ja não grava mais no banco de dados, porém, no log ta la !!!

 

Porque ?? no script ele verifica se o id é igual, como nao é, ele tem que gravar no bd, mas se ja estiver algo la, ele nõa grava, ai ficou a duvida, o pagseguro me limita ?? pq isto acontece ? Alguma luz ??

 

meu script ficou assim:

 

 

<?php

require_once ('classes/classe_trata.php');

require_once ('conexao.php');

 

//cria objeto da classe utils e mysql_

$utils = new utils; //instancia a classe utils

$mysql = new mysql_;

//$link = $mysql->conecta_bd(HOST, DBUSER, DBPASS);

 

 

//$db = mysql_connect("mxxxxxxxx","xxxxxxx","xxxxxxx") or die("Database error");

//mysql_select_db("souasamparb", $db);

 

 

//Definindo o TOKEN de segurança

define('TOKEN', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');

 

//Caso eu tenha recebido o POST do pagseguro

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);

}

 

//Função que acessa por cURL os dados da venda

function retorno_automatico ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,$ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,$StatusTransacao, $CliNome, $CliEmail, $CliEndereco,$CliNumero, $CliComplemento, $CliBairro, $CliCidade,$CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens, $Parcelas){

 

$query = mysql_query("select * from vendas where TransacaoID = '$TransacaoID'");

$resultado = mysql_num_rows($query);

 

//Descubro se o ID da transação já existe, sem sim, apenas atualizo, senão, insiro outro registro

if($resultado > 0){

//Atualizando STATUS

mysql_query("update vendas set StatusTransacao = '$StatusTransacao' where TransacaoID = '$TransacaoID'");

if ($StatusTransacao == 'Completo' || $StatusTransacao == 'Aprovado'){

mysql_query("update vendas set data_finalizado = current_timestamp where TransacaoID = '$TransacaoID'");

 

 

//mandar e-mail para o usuário confirmando o pagamento e solicitando os dados

//include("include/email.php");

//e-mail enviado para o usuário!

}

 

if ($StatusTransacao == 'Cancelado')

mysql_query("update vendas set data_finalizado = current_timestamp where TransacaoID = '$TransacaoID'");

}

else{

//Inserindo no banco de dados

mysql_query("insert into vendas(

`VendedorEmail` ,`TransacaoID` ,`Referencia` ,`Anotacao` ,

`DataTransacao` ,`TipoPagamento` ,`StatusTransacao` ,`CliNome` ,`CliEmail` ,`CliEndereco` ,

`CliNumero` ,`CliComplemento` ,`CliBairro` ,`CliCidade` ,`CliEstado` ,`CliCEP` ,`CliTelefone` ,

`NumItens` ,`produtos` ,`parcelas`, `data_finalizado`

 

) values (

 

'$VendedorEmail','$TransacaoID','$Referencia','$Anotacao',

current_timestamp,'$TipoPagamento','$StatusTransacao','$CliNome','$CliEmail','$CliEndereco',

'$CliNumero','$CliComplemento','$CliBairro','$CliCidade','$CliEstado','$CliCEP','$CliTelefone',

'$NumItens','".$produtos[0]['ProdDescricao']."', '$Parcelas', '')"

);

 

 

 

 

 

}

 

//Gravando um LOG

$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("acao/retorno.php");

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Recebemos o seu pedido!</title>

<link rel="stylesheet" type="text/css" href="css/confirmacao.css" />

</head>

 

<body>

<div id="compra">

<img src="img/compra-efetuada.png" alt="compra efetuada com sucesso"/>

</div>

</body>

</html>

 

 

 

Obrigadissimo pela atenção de vcs, fantastico,

 

 

Demian Escobar

Web Escobar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque você não tenta gravar os dados da transação antes de mandar para o PagSeguro, e usa o retorno apenas para tratar as alterações do status da transação? Assim você não precisa ficar verificando se a transação existe ou não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola, td bem ??

 

Por mais que eu verifique, não muda nada, pq deveria funcionar, a questão é que não funciona, as vezes grava, as vezes não, sei la, ta meio incerto isto, pq grava na primeira e na segunda não ??

 

 

Escobar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola, antes de tudo, obrigado pela atenção de vocês, estão sendo fantásticos.

 

Inserir manualemnte pelo phpmyadmin funciona normalmente quantas vezes forem, você tem um script que funcione de verade e eu possa testar ??

Alguém ??

 

Porque definitivamente este script é falho, ele só insere uma vez e nunca mais, ai se eu deletar ele do banco de dados, ele insere mais uma, e ai para, quer dizer, não to entedendo, mas não da certo, de forma alguma, alguém pode me dar uma luz por favor ?

 

 

Obrigado,

 

 

Escobar

Compartilhar este post


Link para o post
Compartilhar em outros sites

pq ta dando problema, ele retorna hora sim e hora não, entendeu agora o meu problema ?

 

Como eu disse, estou fazendo testes reais pq o ambiente de teste só da unknown data, mesmo eu tendo tirado feito tudo o que ja fizeram, aqui não rola, uso linux, e aqui não vai.

 

Quer dizer, ta complicado para mim, alguem pode me fornecer um código que funcione 100% ??

 

Agradeceria mto

 

 

obrigado

 

 

Esocbar

Compartilhar este post


Link para o post
Compartilhar em outros sites

pessoal, não to conseguindo de jeito nenhum também, já li todos os posts e nada...

 

o problema é que nao recebo NENHUM post na página de retorno...

copiei algumas linhas do código de vocês pra ver se funciona, mas nada!

eu conseguir fazer funcionar UMA VEZ! e dps dessa vez, não funcionou mais, nenhum dado no $_POST...

tanto q eu fiz no

<body>

<?php if($_POST){

echo 'com post';

}

else{

echo 'sem post';

}

?>

</body>

e sempre me aparece o 'sem post' !!

 

aqui vai o código que o pagseguro disponibiliza:

<?php

if (!defined('TOKEN')) define ('TOKEN', '');

/**
* RetornoPagSeguro
*
* Classe de manipulação para o retorno do post do pagseguro
*
* @package PagSeguro
*/
class RetornoPagSeguro {
 /**
  * _preparaDados
  *
  * Prepara os dados vindos do post e converte-os para url, adicionando
  * o token do usuario quando necessario.
  *
  * @internal é usado pela {@see RetornoPAgSeguro::verifica} para gerar os,
  * dados que serão enviados pelo PagSeguro
  *
  * @access private
  *
  * @param array $post         Array contendo os posts do pagseguro
  * @param bool $confirmacao   Controlando a adicao do token no post
  * @return string
  */
 function _preparaDados($post, $confirmacao=true) {
   if ('array' !== gettype($post)) $post=array();
   if ($confirmacao) {
     $post['Comando'] = 'validar';
     $post['Token'] = TOKEN;
   }
   $retorno=array();
   foreach ($post as $key=>$value){
     if('string'!==gettype($value)) $post[$key]='';
     $value=urlencode(stripslashes($value));
     $retorno[]="{$key}={$value}";
   }
   return implode('&', $retorno);
 }

 /**
  * _tipoEnvio
  *
  * Checa qual será a conexao de acordo com a versao do PHP
  * preferencialmente em CURL ou via socket
  *
  * em CURL o retorno será:
  * <code> array ('curl','https://pagseguro.uol.com.br/Security/NPI/Default.aspx') </code>
  * já em socket o retorno será:
  * <code> array ('fsocket', '/Security/NPI/Default.aspx', $objeto-de-conexao) </code>
  * se não encontrar nenhum nem outro:
  * <code> array ('','') </code>
  *
  * @access private
  * @global string $_retPagSeguroErrNo   Numero de erro do pagseguro
  * @global string $_retPagSeguroErrStr  Texto descritivo do erro do pagseguro
  * @return array                        Array com as configurações
  *
  */
 function _tipoEnvio() {
   //Prefira utilizar a função CURL do PHP
   //Leia mais sobre CURL em: http://us3.php.net/curl
   global $_retPagSeguroErrNo, $_retPagSeguroErrStr;
   if (function_exists('curl_exec'))
     return array('curl', 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx');
   elseif ((PHP_VERSION >= 4.3) && ($fp = @fsockopen('ssl://pagseguro.uol.com.br', 443, $_retPagSeguroErrNo, $_retPagSeguroErrStr, 30)))
     return array('fsocket', '/Security/NPI/Default.aspx', $fp);
   elseif ($fp = @fsockopen('pagseguro.uol.com.br', 80, $_retPagSeguroErrNo, $_retPagSeguroErrStr, 30))
     return array('fsocket', '/Security/NPI/Default.aspx', $fp);
   return array ('', '');
 }

 /**
  * not_null
  *
  * Extraido de OScommerce 2.2 com base no original do pagseguro,
  * Checa se o valor e nulo
  *
  * @access public
  *
  * @param mixed $value        Variável a ser checada se é nula
  * @return bool
  */
 function not_null($value) {
   if (is_array($value)) {
     if (sizeof($value) > 0) {
       return true;
     } else {
       return false;
     }
   } else {
     if (($value != '') && (strtolower($value) != 'null') && (strlen(trim($value)) > 0)) {
       return true;
     } else {
       return false;
     }
   }
 }

 /**
  * verifica
  *
  * Verifica o tipo de conexão aberta e envia os dados vindos
  * do post
  *
  * @access public
  *
  * @use RetornoPagSeguro::_tipoenvio()
  * @global string $_retPagSeguroErrNo   Numero de erro do pagseguro
  * @global string $_retPagSeguroErrStr  Texto descritivo do erro do pagseguro
  * @param array $post         Array contendo os posts do pagseguro
  * @param bool $tipoEnvio     (opcional) Verifica o tipo de envio do post
  * @return bool
  */
 function verifica($post, $tipoEnvio=false) {
   global $_retPagSeguroErrNo, $_retPagSeguroErrStr;
   if ('array' !== gettype($tipoEnvio))
     $tipoEnvio = RetornoPagSeguro::_tipoEnvio();
   $spost=RetornoPagSeguro::_preparaDados($post);
   if (!in_array($tipoEnvio[0], array('curl', 'fsocket')))
     return false;
   $confirma = false;
   if ($tipoEnvio[0] === 'curl') {
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $tipoEnvio[1]);
     curl_setopt($ch, CURLOPT_POST, true);
     curl_setopt($ch, CURLOPT_POSTFIELDS, $spost);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($ch, CURLOPT_HEADER, false);
     curl_setopt($ch, CURLOPT_TIMEOUT, 30);
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
     $resp = curl_exec($ch);
     if (!RetornoPagSeguro::not_null($resp)) {
       curl_setopt($ch, CURLOPT_URL, $tipoEnvio[1]);
       $resp = curl_exec($ch);
     }
     curl_close($ch);
     $confirma = (strcmp ($resp, 'VERIFICADO') == 0);
   } elseif ($tipoEnvio[0] === 'fsocket') {
     if (!$tipoEnvio[2]) {
       die ("{$_retPagSeguroErrStr} ($_retPagSeguroErrNo)");
     } else {
       $cabecalho = "POST {$tipoEnvio[1]} HTTP/1.0\r\n";
       $cabecalho .= "Content-Type: application/x-www-form-urlencoded\r\n";
       $cabecalho .= "Content-Length: " . strlen($spost) . "\r\n\r\n";
       $resp = '';
       fwrite ($tipoEnvio[2], "{$cabecalho}{$spost}");
       while (!feof($tipoEnvio[2])) {
         $resp = fgets ($tipoEnvio[2], 1024);
         if (strcmp ($resp, 'VERIFICADO') == 0) {
           $confirma = (strcmp ($resp, 'VERIFICADO') == 0);
           $confirma=true;
           break;
         }
       }
       fclose ($tipoEnvio[2]);
     }
   }
   if ($confirma && function_exists('retorno_automatico')) {
     $itens = array (
               'VendedorEmail', 'TransacaoID', 'Referencia', 'TipoFrete',
               'ValorFrete', 'Anotacao', 'DataTransacao', 'TipoPagamento',
               'StatusTransacao', 'CliNome', 'CliEmail', 'CliEndereco',
               'CliNumero', 'CliComplemento', 'CliBairro', 'CliCidade',
               'CliEstado', 'CliCEP', 'CliTelefone', 'NumItens',
             );
     foreach ($itens as $item) {
       if (!isset($post[$item])) $post[$item] = '';
       if ($item=='ValorFrete') $post[$item] = str_replace(',', '.', $post[$item]);
     }
     $produtos = array ();
     for ($i=1;isset($post["ProdID_{$i}"]);$i++) {
       $produtos[] = array (
         'ProdID'          => $post["ProdID_{$i}"],
         'ProdDescricao'   => $post["ProdDescricao_{$i}"],
         'ProdValor'       => (double) (str_replace(',', '.', $post["ProdValor_{$i}"])),
         'ProdQuantidade'  => $post["ProdQuantidade_{$i}"],
         'ProdFrete'       => (double) (str_replace(',', '.', $post["ProdFrete_{$i}"])),
         'ProdExtras'      => (double) (str_replace(',', '.', $post["ProdExtras_{$i}"])),
       );
     }
     retorno_automatico (
       $post['VendedorEmail'], $post['TransacaoID'], $post['Referencia'], $post['TipoFrete'],
       $post['ValorFrete'], $post['Anotacao'], $post['DataTransacao'], $post['TipoPagamento'],
       $post['StatusTransacao'], $post['CliNome'], $post['CliEmail'], $post['CliEndereco'],
       $post['CliNumero'], $post['CliComplemento'], $post['CliBairro'], $post['CliCidade'],
       $post['CliEstado'], $post['CliCEP'], $post['CliTelefone'], $produtos, $post['NumItens']
     );
   }
   return $confirma;
 }
}

if ($_POST) {
 RetornoPagSeguro::verifica($_POST);
 die();
}


?>

 

aqui vai o código da pagina de retorno:

ini_set('display_errors', true);
error_reporting(E_ALL);

DEFINE('TOKEN', 'xxxxxxxxxxxxxxxxxxxx');



function retorno_automatico ($VendedorEmail, $TransacaoID,
 $Referencia, $TipoFrete, $ValorFrete, $Anotacao, $DataTransacao,
 $TipoPagamento, $StatusTransacao, $CliNome, $CliEmail,
 $CliEndereco, $CliNumero, $CliComplemento, $CliBairro, $CliCidade,
 $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens) {

function log_post($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);
}

   log_post('teste mensagem', array ($VendedorEmail, $TransacaoID, $Referencia, $TipoFrete,
       $ValorFrete, $Anotacao, $DataTransacao, $TipoPagamento,
       $StatusTransacao, $CliNome, $CliEmail, $CliEndereco,
       $CliNumero, $CliComplemento, $CliBairro, $CliCidade,
       $CliEstado, $CliCEP, $CliTelefone, $produtos, $NumItens
 ));
}

require_once("pagseguro/retorno.php");


Compartilhar este post


Link para o post
Compartilhar em outros sites

pessoal, não to conseguindo de jeito nenhum também, já li todos os posts e nada...

 

o problema é que nao recebo NENHUM post na página de retorno...

copiei algumas linhas do código de vocês pra ver se funciona, mas nada!

eu conseguir fazer funcionar UMA VEZ! e dps dessa vez, não funcionou mais, nenhum dado no $_POST...

tanto q eu fiz no

<body>

<?php if($_POST){

echo 'com post';

}

else{

echo 'sem post';

}

?>

</body>

e sempre me aparece o 'sem post' !!

 

 

Mais você nunca irá printar isso na tela... o pagSeguro envia os posts em segundo plano.

 

Já tentou fazer o teste do 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

pessoal, não to conseguindo de jeito nenhum também, já li todos os posts e nada...

 

o problema é que nao recebo NENHUM post na página de retorno...

copiei algumas linhas do código de vocês pra ver se funciona, mas nada!

eu conseguir fazer funcionar UMA VEZ! e dps dessa vez, não funcionou mais, nenhum dado no $_POST...

tanto q eu fiz no

<body>

<?php if($_POST){

echo 'com post';

}

else{

echo 'sem post';

}

?>

</body>

e sempre me aparece o 'sem post' !!

 

 

Mais você nunca irá printar isso na tela... o pagSeguro envia os posts em segundo plano.

 

Já tentou fazer o teste do log?

http://forum.imasters.com.br/topic/425122-retorno-automatico-impossivel/page__view__findpost__p__1678410

 

 

Realmente...não tinha prestado atenção nisso! vacilo

mas agora consegui! valeu :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem ?

 

veja, eu nao sou programador agora mas ja fiz algumas coisas em coldfusion... Estou tentando aqui colocar esse codigo e usei seu artificio de ver o log. Também estava procurando as informacoes do POST mas nao aparecia nada. Depois desse seu procedimento eu vi tudo certinho aparecendo no arq texto. Muito legal! Sao coisas simples que o pagseguro poderia disponibilizar, mas...

Bom , o sistema está recebendo as informacoes mas nao consegue atualizar na tabela os dados da compra, por exemplo, o STATUS do pagamento. Toda hora que entro no meu site de compras coletivas , o sistema fala que o cara ainda nao pagou, mas o log recebe o status 'Aprovado', to ficando doido com isso, é algum detalhe . Como não posso dar o echo, o que aconselha fazer para saber o ponto exato do problema ?

Vou postar o código, se pudesse dar uma força...

Obrigado

 

<?php

require_once(dirname(dirname(dirname(__FILE__))) . '/app.php');

print_r($INI);

 

header('Content-Type: text/html; charset=ISO-8859-1');

 

define('TOKEN', $INI['pagseguro']['mid']);

 

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;

}

 

}

 

 

 

 

 

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($_POST){

$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();

}

 

 

if ($_POST) {

 

// POST recebido, indica que é a requisição do NPI.

$npi = new PagSeguroNpi();

$result = $npi->notificationPost();

 

$transacaoID = isset($_POST['TransacaoID']) ? $_POST['TransacaoID'] : '';

 

if ($result == "VERIFICADO") {

 

//VERIFICANDO PAGAMENTO

//---------------------------------------------------------------------

if( $_POST['StatusTransacao'] == 'Aprovado') {

 

//echo retorno de pagamento";

$order = Table::Fetch('order', $_POST['ProdID_1']);

 

if ( $order['state'] == 'unpay' ) {

//1

$table = new Table('order');

$table->SetPk('id', $_POST['ProdID_1']);

$table->pay_id = $_POST['TransacaoID'];

$table->money = $_POST['ProdValor_1'];

$table->state = 'pay';

$flag = $table->update(array('state', 'pay_id', 'money'));

 

 

if ( $flag ) {

$table = new Table('pay');

$table->id = $_POST['TransacaoID'];

$table->order_id = $_POST['ProdID_1'];

$table->money = $_POST['ProdValor_1'];

$table->currency = 'BRL';

$table->bank = $_POST['TipoPagamento'];

$table->service = 'pagseguro';

$table->create_time = time();

$table->insert( array('id', 'order_id', 'money', 'currency', 'service', 'create_time', 'bank') );

 

//update team,user,order,flow state//

ZTeam::BuyOne($order);

}

}

 

Utility::Redirect( WEB_ROOT . "/order/pay.php?id={$_POST['Referencia']}");

 

}

else {

// do nothing

//echo 'Não foi pago ainda';

}

//---------------------------------------------------------------------

 

 

/* O post foi validado pelo PagSeguro. */

$to = "Seu e-mail foi validado";

$subject = "POST foi Validado";

 

$query_string = "";

if ($_POST) {

$kv = array();

foreach ($_POST as $key => $value) {

$kv[] = "$key=$value";

}

 

$query_string = join("&", $kv);

}

 

$body = $query_string;

mail($to, $subject, $body);

 

} else if ($result == "FALSO") {

//O post não foi validado pelo PagSeguro.

$to = "Seu e-mail não foi validado";

$subject = "POST não foi Validado";

 

$query_string = "";

if ($_POST) {

$kv = array();

foreach ($_POST as $key => $value) {

$kv[] = "$key=$value";

}

 

$query_string = join("&", $kv);

}

 

$body = $query_string;

mail($to, $subject, $body);

 

} else {

//Erro na integração com o PagSeguro.

$to = "Erro de integração";

$subject = "POST com erro de integração";

 

$query_string = "";

if ($_POST) {

$kv = array();

foreach ($_POST as $key => $value) {

$kv[] = "$key=$value";

}

 

$query_string = join("&", $kv);

}

 

$body = $query_string;

mail($to, $subject, $body);

}

 

} 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.

Utility::Redirect( WEB_ROOT );

}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual relação o link que você enviou tem a ver com esse tópico? é algum complemento de resposta de alguém? é uma solução?

Ao meu ver é um problema, se é um problema sobre a mesma coisa porque não posta direto aqui?

Tente não criar tópicos desnecessários.

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.