Ir para conteúdo

POWERED BY:

Arquivado

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

regina

Como receber os dados do retorno automático do pagseguro PHP

Recommended Posts

Bom dia,

 

Estou finalizando uma loja...Minha dificuldade agora está no retorno do pagseguro.

O cliente faz a compra, escolhe como forma de pagamento o pagseguro, os dados vão para a página do pagseguro certinho quando o cliente termina ele retorna para a página do meu cliente mas não consigo pegar os dados.

 

Como faço para pegar o retorno:

 if(!empty($_GET["compra"])) {
$compra_id=$_GET["compra"];
 } else {
header('Content-Type: text/html; charset=ISO-8859-1');

define('TOKEN', 'token do meu cliente');

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.
} else if ($result == "FALSO") {
	//O post não foi validado pelo PagSeguro.
} else {
	//Erro na integração com o PagSeguro.
}

} 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.
?>
   <h3>Obrigado por efetuar a compra.</h3>
   <?php
}	$name = 'log_pagseguro.txt';
$text = var_export($_POST, true);
$file = fopen($name, 'a');
fwrite($file, $text);
fclose($file);
}

no arquivo que gravo o log vem apenas

array (

)

Já tentei diversas formas que encontrei mas só recebo este retorno.

 

Agradeço a quem puder e tiver paciência para me ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando o seguinte script consegui obter o

	if(isset($_POST['notificationType']) && $_POST['notificationType'] == 'transaction'){
   //Todo resto do código iremos inserir aqui.

   $email = "email@cliente.com.br";
   $token = "token do meu cliente";

   $url = "https://ws.pagseguro.uol.com.br/v2/transactions/notifications/" . $_POST['notificationCode'] . "?email=" . $email . "&token=" . $token;

   $curl = curl_init($url);
   curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
   $transaction= curl_exec($curl);
   curl_close($curl);

   if($transaction == 'Unauthorized'){
       //Insira seu código avisando que o sistema está com problemas, sugiro enviar um e-mail avisando para alguém fazer a manutenção

       exit;//Mantenha essa linha
   }
   $transaction = simplexml_load_string($transaction);
?>	<h3>Obrigado por efetuar a compra via pagseguro.</h3>
   <?php
}
$name = 'log_pagseguro.txt';
$text = var_export($_POST, true);
$file = fopen($name, 'a');
fwrite($file, $text);
fclose($file);
}

recebi os seguintes valores notificationCode e notificationType

 

agora como fazer para receber os demais dados?

 

Agradeço a quem puder ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muita gente tem dificuldades em utilizar retorno automático, é por isso que o PagSeguro criou a API de notificações, o qual é bem mais simples de utilizar...

 

Segue um tutorial abaixo explicando passo a passo:

 

http://sounoob.com.br/2011/09/06/recebendo-notificacoes-do-pagseguro-usando-php-sem-utilizar-a-biblioteca-oficial/

Compartilhar este post


Link para o post
Compartilhar em outros sites

==> Oi Web Lucas Oliveira

 

eu já li e reli os tutoriais do pagseguro, mas não consigo unir o conceito ao script.

 

Agradeço

 

==> Oi senartes,

 

eu estou utilizando este tutorial que você indicou, minha dificuldade está a partir daí, eu peguei o

array (

'notificationCode' => '191C6D',

'notificationType' => 'transaction',

)

 

agora como faço para conseguir pegar o restante dos dados, tenho muita dificuldade com o xml, e fico mais ansiosa porque sei que não é tão difícil como percebo.

 

Quando volto do pagseguro preciso exibir o número da compra (que já gravei e enviei junto ao pagseguro) na tela e também preciso dele para enviar o e-mail ao comprador e também gravar a forma de pagamento e outros dados para gerenciamento do meu cliente.

 

tentei assim:

$array_xml = array(

"compra_id" =>(string)$transaction->reference,

"data" =>(string)$transaction->date,

"numero_documento" =>(string)$transaction->code,

"tipo_forma_pgto" =>(string)$transaction->paymentMethod->type,

"codigo_forma_pgto" =>(string)$transaction->paymentMethod->code,

"parcelas" =>(string)$transaction->installmentCount,

"valor_PagSeguro" =>(string)$transaction->grossAmount,

"taxas_PagSeguro" =>(string)$transaction->feeAmount,

"situacao" =>(string)$transaction->status,

);

mas não gravou nada no meu arquivo de log, ou melhor, gravou sim, mas dados em branco:

array (

'compra_id' => '',

'data' => '',

'numero_documento' => '',

'tipo_forma_pgto' => '',

'codigo_forma_pgto' => '',

'parcelas' => '',

'valor_PagSeguro' => '',

'taxas_PagSeguro' => '',

'situacao' => '',

)NULL

O script completo

if(isset($_POST['notificationType']) && $_POST['notificationType'] == 'transaction'){
  $email = "loja@cliente.com.br";
  $token = "xxxxx";

#dados são passados para o PagSeguro junto a uma URL
  $url = "https://ws.pagseguro.uol.com.br/v2/transactions/notifications/" . $_POST['notificationCode'] . "?email=" . $email . "&token=" . $token;

  $curl = curl_init($url);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  $transaction= curl_exec($curl);
  curl_close($curl);
#configuração para o CURL para não verificar os certificados SSL do PagSeguro.
#Como precisamos da resposta do servidor do PagSeguro então vamos marcar no CURL que é para ele trazer uma resposta
#Hora de executar o CURL, ele deverá retornar a resposta do servidor do PagSeguro, que deverá ser um XML, iremos gravar essa informação na variavel $transaction
  if($transaction == 'Unauthorized'){
       //Insira seu código avisando que o sistema está com problemas, sugiro enviar um e-mail avisando para alguém fazer a manutenção
	$e_destino="devs@pagseguro.zendesk.com";
	$mensagem="Favor verificar o erro no momento da requisição de informações sobre o pagamento PagSeguro, Unauthorized!".$_POST['notificationCode'];
	envia_info("loja@cliente.com.br","Cliente","Unauthorized Requisição de pagamento PagSeguro",$e_destino,"Cliente",$mensagem);
#		header('Location: /');
       exit;//Mantenha essa linha
  }
  $transaction = simplexml_load_string($transaction);
  $transaction = $xml->transaction;

  $array_xml = array(
	"compra_id" 		=>(string)$transaction->reference,
	"data" 			=>(string)$transaction->date,
	"numero_documento"	=>(string)$transaction->code,
	"tipo_forma_pgto"	=>(string)$transaction->paymentMethod->type,
	"codigo_forma_pgto"	=>(string)$transaction->paymentMethod->code,
	"parcelas"		=>(string)$transaction->installmentCount,
	"valor_PagSeguro"	=>(string)$transaction->grossAmount,
	"taxas_PagSeguro"	=>(string)$transaction->feeAmount,
	"situacao" 		=>(string)$transaction->status,
  );

Será que você pode me ajudar?

 

Agradeço por enquanto

 

Fazendo um teste direto na url como indicado em blogpagseguro.com.br/2012/02/recebendo-notificacao-de-transacao/

 

retorna o xml todos os dados da minha compra.

Minha dificuldade está em pegar o notificationType e o notificationCode quando eles chegam do pagseguro.

 

Devo criar um script para:

 

ler o txt;

verificar o último conteúdo;

pegar os dados (como se lê array em arquivo texto?)

enviar a requisição ao pagseguro para obter os valores?

 

agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Consegui pegar os dados que necessito ao finalizar a compra, agora só estou com alguns probleminhas ao gravar os valores retornados, por exemplo:

 

1) recebo

valor da compra 17.69

valor da taxa 0.90

 

ao gravar fica assim

valor da compra 9.99

valor da taxa 0.00

 

em ambos os casos os valores estão como double(3,2).

 

2) Como faço para gravar a data retornada pelo Pagseguro?

 

Desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Regina , neste caso já é um pouco de conhecimento de tipos de dados do MySQL.

Existe certos tipos de dados indicados para se gravar valores financeiros (dinheiro em outras palavras).

Mas o mais indicado é sem dúvida o DECIMAL por apresentar um valor preciso.

 

EX. decimal(7,2)

isso gravar na tabela valores na casa dos milhões.

Aí na hora de imprimi-los na tela é só formatar o valor usando number_formar();

 

 

Exemplo prático:

Digamos que em seu banco esteja gravado assim: 1800.24

 

Então:

 

<?php

$valor_bd = 1800.24;

 

$valor_formatado = number_format($valor_bd, 2, ',', ' ');

 

echo $valor_formatado;

 

//saída 1 800,24

?>

 

Espero que tenha ajudado!

 

Abs!

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.