sábado, 19 de novembro de 2011

CodeIgniter e PagSeguro – Retorno Automático



Salve!

Vamos falar um pouco sobre a integração do UOL PagSeguro com aplicações desenvolvidas utilizando o CodeIgniter como framework.

Após muitos testes, buscas pela internet, perguntas em Fórum de discussão, eu consegui fazer pelos meus próprios meios. E compartilho aqui pois acredito que outras pessoas estejam com o mesmo problema.

Enviar as informações de pagamento para o PagSeguro é muito fácil e eu não preciso comentar nada por aqui. O grande “vilão” dessa conversa é o Retorno Automático.

Vamos começar pelo Controler.
Obs. Imagine que essa função seria exatamente a informada nas configurações de retorno do PagSeguro (http://www.seusite.com.br/retorno_automatico).


public function retorno_pagseguro(){

if (count($_POST) > 0) {

// POST recebido, indica que é a requisição do NPI.
//$npi = new PagSeguroNpi();
$this->load->library(PagSeguroNpi);//Carrega a library
$result = $this->PagSeguroNpi->notificationPost();

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

if ($result == "VERIFICADO") {
//O post foi validado pelo PagSeguro.
$source = array('.', ',');
$replace = array('', '.');
$pagamento['TransacaoID'] = $_POST['TransacaoID'];
$pagamento['Referencia'] = $_POST['Referencia'];
$pagamento['TipoPagamento'] = $_POST['TipoPagamento'];
$pagamento['StatusTransacao'] = $_POST['StatusTransacao'];
$pagamento['Anotacao'] = $_POST['Anotacao'];
$pagamento['DataTransacao'] = $_POST['DataTransacao'];
$pagamento['ProdValor_1'] = str_replace($source, $replace, $_POST['ProdValor_1']);
$this->load->model('financeiro_model');//Carrega a Model
$this->financeiro_model->GravaRetorno($pagamento);//Grava os dados recebido
if($_POST['StatusTransacao'] == 'Aprovado'){
$histpagto = $this->financeiro_model->GetPagtoByID($_POST['Referencia']);
$pag['valor'] = $histpagto[0]->nu_valor;
$pag['idanunciante'] = $histpagto[0]->id_anunciante;
$this->financeiro_model->AtualizaCredito($pag);
$pag['idtransacao'] = $_POST['TransacaoID'];
$pag['idpagto'] = $_POST['Referencia'];
$this->financeiro_model->AtualizaHistPag($pag);
$informacao['status'] = '1';
}elseif($_POST['StatusTransacao'] == 'Em Análise'){
$informacao['status'] = '2';
}elseif($_POST['StatusTransacao'] == 'Aguardando Pagto'){
$informacao['status'] = '3';
}elseif($_POST['StatusTransacao'] == 'Completo'){
$informacao['status'] = '4';
}elseif($_POST['StatusTransacao'] == 'Cancelado'){
$informacao['status'] = '5';
}
} else if ($result == "FALSO") {
//O post não foi validado pelo PagSeguro.
$informacao['status'] = '1000';
} else {
//Erro na integração com o PagSeguro.
$informacao['status'] = '3';
}

} 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.
$informacao['status'] = '3';
}

$this->load->view('header_interna_view', $page_infos);//Carrega o cabeçalho
$this->load->view('empresa/sidebar_view');//Carrega a Sidebar
$this->load->view('financeiro/retorno_view', $informacao);//Carrega a view de conteudo

$this->load->view('footer_view');//carrega do rodapé

}


Agora a library:

<?php

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

define('TOKEN', '2EEF70CFFCB547DBA7823F19C7D17F24');

class PagSeguroNpi {

private $timeout = 20; // Timeout em segundo

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

}

?>


Testem! Qualquer problema, sugestão ou qualquer outra coisa, deixe um comentário.

Um comentário:

  1. Porque no seguinte trecho:
    //Erro na integração com o PagSeguro.
    $informacao['status'] = '3';
    }

    } 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.
    $informacao['status'] = '3';
    }

    Sempre é atribuído o valor 3?

    ResponderExcluir