Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Nas últimas postagens temos falado sobre a integração com as APIs de pagamento PayPal. Hoje vamos falar sobre um outro tipo de API do PayPal que pode ser de extrema importância para vários modelos de negócio; A Notificação de Pagamento Instantâneo (ou IPN da sigla em ingês). A IPN é um sistema de mensagens que avisará sua aplicação sobre modificações de status em transações o que é muito interessante quando temos um back-office que precisa tomar decisões rapidamente. O primeiro passo para integrarmos com o serviço de notificação é habilitar o serviço no PayPal, para isso faremos login em nossa conta de vendedor e, na aba "Minha Conta" vamos até a opção "Mais Opções" dentro de "Perfil"
/applications/core/interface/imageproxy/imageproxy.php?img=http://189.90.143.178/pp/wps7.png&key=d53d1f8b01f83abac732802f52aac8a13ddf8f3b70429ddf31d0ca5ee0559126" /> Em seguida selecionamos a opção "Notificações de Pagamento Instantâneo" que fica em "Minhas Ferramentas de Venda":
/applications/core/interface/imageproxy/imageproxy.php?img=http://189.90.143.178/pp/ipn1.png&key=ff0d047476be694e0870a1e6e6c9ac268ceb1662d5ade63b5a9c72584eb3d0d8" /> Em seguida definimos a URL que receberá as notificações:
/applications/core/interface/imageproxy/imageproxy.php?img=http://189.90.143.178/pp/ipn2.png&key=d98b6bfd7777b5cb4f9001378ecfa891c41162e32f64f694960a2f14b1722e70" /> Bom, a partir desse momento o PayPal enviará notificações para a URL que foi definida, porém precisaremos manipular essas notificações. Para isso precisamos compreender o funcionamento do sistema de notificações:
<?php
/**
* Observador de Notifica????es de Pagamento Instant??neo
*/
class InstantPaymentNotification {
/**
* @var string
*/
private $endpoint = 'https://www.paypal.com';
/**
* @var IPNHandler
*/
private $ipnHandler;
/**
* Constroi o objeto que receber?? as notifica????es de pagamento
* instant??neas do PayPal..
* @param boolean $sandbox Define se ser?? utilizado o Sandbox
* @throws InvalidArgumentException
*/
public function __construct( $sandbox = false ) {
if ( !!$sandbox ) {
$this->endpoint = 'https://www.sandbox.paypal.com';
}
$this->endpoint .= '/cgi-bin/webscr?cmd=_notify-validate';
}
/**
* Aguarda por notifica????es de pagamento instant??nea; Caso uma nova
* notifica????o seja recebida, faz a verifica????o e notifica um manipulador
* com o status (verificada ou n??o) e a mensagem recebida.
* @see InstantPaymentNotification::setIPNHandler()
* @throws BadMethodCallException Caso o m??todo seja chamado antes
* de um manipulador ter sido definido ou nenhum email de recebedor
* tenha sido informado.
*/
public function listen() {
if ( $this->ipnHandler !== null && count( $this->receiverEmail ) >= 1 ) {
if ( $_SERVER[ 'REQUEST_METHOD' ] == 'POST' ) {
if ( filter_input( INPUT_POST , 'receiver_email' , FILTER_VALIDATE_EMAIL ) ) {
$curl = curl_init();
curl_setopt( $curl , CURLOPT_URL , $this->endpoint );
curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false );
curl_setopt( $curl , CURLOPT_RETURNTRANSFER , 1 );
curl_setopt( $curl , CURLOPT_POST , 1 );
curl_setopt( $curl , CURLOPT_POSTFIELDS , http_build_query( $_POST ) );
$response = curl_exec( $curl );
$error = curl_error( $curl );
$errno = curl_errno( $curl );
curl_close( $curl );
if ( empty( $error ) && $errno == 0 ) {
$this->ipnHandler->handle( $response == 'VERIFIED' , $_POST );
}
}
}
} else {
throw new BadMethodCallException( 'Nenhum manipulador de mensagem ou email foi definido' );
}
}
/**
* Define o objeto que irá manipular as notificações de pagamento
* instantâneas enviadas pelo PayPal.
* @param IPNHandler $ipnHandler
*/
public function setIPNHandler( IPNHandler $ipnHandler ) {
$this->ipnHandler = $ipnHandler;
}
}
Essa classe é reutilizável, independentemente das regras de negócio da sua aplicação, tudo o que ela faz é receber a notificação, verificá-la no PayPal e avisar um manipulador sobre o evento. Para definir o manipulador utilizaremos a seguinte interface:
<?php
/**
* Interface para definição de um manipulador de Notificação
* de Pagamento Instantânea.
*/
interface IPNHandler {
/**
* Manipula uma notificação de pagamento instantânea recebida
* pelo PayPal.
* @param boolean $isVerified Identifica que a mensagem foi
* verificada como tendo sido enviada pelo PayPal.
* @param array $message Mensagem completa enviada pelo
* PayPal.
*/
public function handle( $isVerified , array $message );
}
Como podemos ver, o método handle() da interface IPNHandler receberá dois parâmetros:
<?php
/**
* Manipulador de exemplo de Notificação de Pagamento
* Instantâneo
*/
class SampleIPNHandler implements IPNHandler {
/**
* @param boolean $isVerified
* @param array $message
* @see IPNHandler::handle()
*/
public function handle( $isVerified , array $message ) {
/**
* Verificamos se foi realmente o PayPal quem enviou a
* notificação
*/
if ( $isVerified ) {
/**
* Verificamos se o email contido no campo receiver_email
* é o nosso email; Essa é uma segunda verificação necessária.
*/
if ( $message[ 'receiver_email' ] == 'meu-email@dominio.com' ) {
// está tudo ok, seguimos com nossas regras de negócio
// podemos enviar um email para alguém, emitir nota fiscal
// eletrônica se for o caso ou qualquer outra decisão
// relacionada com as regras de negócio.
}
}
}
}
Agora é só criar o arquivo que receberá as notificações:
<?php
$ipn = new InstantPaymentNotification( true );
$ipn->setIPNHandler( new SampleIPNHandler() );
$ipn->listen();
E é isso. No próximo tutorial vamos ver como criar um manipulador que enviará a notificação diretamente para nossos celulares ou tablets no exato momento que o PayPal enviar a notificação.
http://imasters.com.br/artigo/23471/paypal/recebendo-notificacoes-instantaneas-de-pagamento
Carregando comentários...