Ir para conteúdo

POWERED BY:

Arquivado

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

Matheus Rennê

[Resolvido] API de notificação não retorna nada

Recommended Posts

Olá, sei que tem vários tópicos aqui sobre o mesmo assunto. Já li um monte e já tentei um monte de coisas, mas não consigo o retorno dos dados.

 

- Estou usando a página de redirecionamento dinâmico;

- Já gerei o TOKEN de segurança;

- Já ativei os pagamentos via API;

- Já ativei a notificação de transações para a url www.dominio.com.br/retorno/pagseguro.php

 

Requisição de pagamento

<?php
$post_item_id           = $_POST['item_id'];
$post_item_descr        = $_POST['item_descr'];
$post_item_quant        = $_POST['item_quant'];
$post_item_valor        = $_POST['item_valor'];
$post_cliente_nome      = $_POST['cliente_nome'];
$post_cliente_email     = $_POST['cliente_email'];
$post_ref               = $_POST['ref'];
$post_id_oferta         = $_POST['id_oferta'];
$post_id_cliente        = $_POST['id_cliente'];
$post_nome_cupom        = $_POST['nome_cupom'];
$post_dtcupom_minima    = $_POST['dtcupom_minima'];
$post_dtcupom_maxima    = $_POST['dtcupom_maxima'];
$post_valor_real        = $_POST['valor_real'];
$post_desconto          = $_POST['desconto'];
$post_redurl            = 'http://www.dominio.com.br/conta/cupons';

$url = "https://ws.pagseguro.uol.com.br/v2/checkout";

$data['email'] = 'atendimento@.....';
$data['token'] = '2DE7B7B......';
$data['currency'] = 'BRL';
$data['itemId1'] = $post_item_id;
$data['itemDescription1'] = $post_item_descr;
$data['itemAmount1'] = $post_item_valor;
$data['itemQuantity1'] = $post_item_quant;
$data['shippingCost'] = '0.00';
$data['itemWeight1'] = '0';
$data['reference'] = $post_ref;
$data['senderName'] = $post_cliente_nome;
$data['senderEmail'] = $post_cliente_email;
$data['redirectURL'] = $post_redurl;

$data = http_build_query($data);

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$xml= curl_exec($curl);

if($xml == 'Unauthorized'){
   //Insira seu código de prevenção a erros
   mail("suporte@.....","Unauthorized Requisição de pagamento PagSeguro","Deu erro na hora da requisição de pagamento PagSeguro, Unauthorized!");
   header('Location: /');
   exit;//Mantenha essa linha
}

curl_close($curl);

$xml= simplexml_load_string($xml);

if(count($xml -> error) > 0){
   //Insira seu código de tratamento de erro, talvez seja útil enviar os códigos de erros.
   mail("suporte@....","Erro Requisição de pagamento PagSeguro","Deu erro na hora da requisição de pagamento do PagSeguro: $xml->error");
   header('Location: /');
   exit;
}

include('conexao.php');
dbcon();

$cod_transacao = $xml -> code;

mysql_query("INSERT INTO `" . TB_CUPOM . "` VALUE (NULL, '$post_id_oferta', '$post_id_cliente', '1', '$post_item_valor', '$post_valor_real', '$post_desconto', '$post_dtcupom_minima', '$post_dtcupom_maxima', '$cod_transacao', '1', NOW())");
$idcupom_insert = mysql_insert_id();

mysql_query("INSERT INTO `" . TB_CUPOM_IMPRESSO . "` VALUES (NULL, '$idcupom_insert', '$post_id_oferta', '$post_ref', '$post_nome_cupom', 'F')");

header('Location: https://pagseguro.uol.com.br/v2/checkout/payment.html?code=' . $xml -> code);
?>

 

 

Retorno

<?php
if(isset($_POST['notificationType']) && $_POST['notificationType'] == 'transaction'){
   $email = "atendimento@.......";
   $token = "2DE7B7B.......";

   $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
       mail("suporte@.....","Unauthorized Retorno PagSeguro","Deu erro na hora do retorno do PagSeguro, Unauthorized!");
       exit;//Mantenha essa linha
   }

   $transaction = simplexml_load_string($transaction);

   $transaction = $xml->transaction;

   $data = $transaction->date;
   $code = $transaction->code;

   $status = $transaction->status; 

   $metodo_pagto = $transaction->paymentMethod->type;

   $modo_pagto = $transaction->paymentMethod->code;

   $idCompra = $transaction->reference;
   $valor = $transaction->grossAmount;
   $desconto = $transaction->discountAmount;
   $taxasPagSeguro = $transaction->feeAmount;
   $valor_liquido = $transaction->netAmount;
   $nomeCliente = $transaction->sender->name;
   $emailCliente = $transaction->sender->email;
   $total = $valor-$desconto;

   $array = array(
       'idcompra'=>$idCompra,
       'valor'=>$valor,
       'desconto'=>$desconto,
       'taxasPagSeguro'=>$taxasPagSeguro,
       'valor_liquido'=>$valor_liquido,
       'nomeCliente'=>$nomeCliente,
       'emailCliente'=>$emailCliente,
       'metodo_pagto'=>$metodo_pagto,
       'modo_pagto'=>$modo_pagto,
       'status'=>$status,
       'data'=>$data,
       'code'=>$code,
       'transacaoID'=>$notificationType
   );

   print_r($array);
?>

 

A requisição de pagamento funciona corretamente. Consigo ver as compras no Pagseguro. Queria o retorno para que a mudança do status ocorra de forma automática, sem que eu precise fazer isso manualmente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está recebendo o post com o código da notificação?

Já tentou criar arquivo de log para ver o que está acontecendo no seu código?

 

Verifiquei seu

print_r($array); 

 

Você não irá conseguir ver isso, porque o PagSeguro envia os posts em outra sessão.

 

Dar uma lida em:

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

Cara, resolveu seu problema que você postou anteriormente?

 

Se sim posta ai qual era o problema para quem estiver pesquisando não ficar se matando...

 

O redirectURL é a pagina que será redirecionada quando o comprador finalizar o fluxo de pagamento.

Esse cara sobrepõem a pagina de redirecionamento fixa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi meu problema sim, mas depois que fiz a postagem anterior.

 

Desisti de usar a API e estou usando o retorno automático. Estou usando o próprio código que o Pagseguro gera com algumas modificações para gravar o status na tabela. Segue abaixo:

 

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

define('TOKEN', '........');

include('conexao.php');
dbcon();

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'] : '';

   //Pega o status da transação e referência
   $status_transacao = isset($_POST['StatusTransacao'])?$_POST['StatusTransacao']:'';
   $ref    = $_POST['Referencia'];

   if ($result == "VERIFICADO") {
       //O post foi validado pelo PagSeguro.
       // Atualiza o status do pedido no banco
       if('Aprovado' == $status_transacao || 'Completo' == $status_transacao || 'Em Análise' == $status_transacao){
           $idCupom = mysql_result(mysql_query("SELECT `id_cupom` FROM `" . TB_CUPOM_IMPRESSO . "` WHERE `cupom`='$ref'"), 0);
           mysql_query("UPDATE `" . TB_CUPOM . "` SET `status`='2' WHERE `id`='$idCupom'");
       } elseif ('Aguardando Pagto' == $status_transacao) {
           $idCupom = mysql_result(mysql_query("SELECT `id_cupom` FROM `" . TB_CUPOM_IMPRESSO . "` WHERE `cupom`='$ref'"), 0);
           mysql_query("UPDATE `" . TB_CUPOM . "` SET `status`='1' WHERE `id`='$idCupom'");
       } elseif ('Cancelado' == $status_transacao) {
           $idCupom = mysql_result(mysql_query("SELECT `id_cupom` FROM `" . TB_CUPOM_IMPRESSO . "` WHERE `cupom`='$ref'"), 0);
           mysql_query("UPDATE `" . TB_CUPOM . "` SET `status`='5' WHERE `id`='$idCupom'");
       }
   } else if ($result == "FALSO") {
       //O post não foi validado pelo PagSeguro.
       mail("suporte@...","POST inválido PagSeguro","O post não foi validado pelo PagSeguro.");
   } else {
       //Erro na integração com o PagSeguro.
       mail("suporte@....","Retorno PagSeguro","Erro na integração do retorno com o PagSeguro.");
   }

   // LOG
   $name = 'pagseguro.txt';
   $text = var_export($_POST, true);
   $file = fopen($name, 'a');
   fwrite($file, $text);
   fclose($file);
} 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.
   mail("suporte@...","POST não recebido PagSeguro","POST não recebido.");
   echo '<h3>Obrigado por efetuar a compra.</h3>';
}
?>

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.