Melhorando a experiência do cliente com a tela de redirecionamento PayPal
O redirecionamento do cliente para o ambiente seguro da PayPal garante ao cliente uma maior segurança no momento do pagamento.
Entre as etapas de integração com PayPal, existe o redirecionamento do cliente para o ambiente seguro da PayPal, que garante ao cliente uma maior segurança no momento do pagamento. Normalmente, esse redirecionamento é feito após a operação SetExpressCheckout e é feita da seguinte forma:
[php]<?php
//URL de retorno, caso o cliente confirme o pagamento
$returnURL = ‘http://localhost/return’;
//URL de cancelamento, caso o cliente desista do pagamento
$cancelURL = ‘http://localhost/cancel’;
//Vai usar o Sandbox, ou produção?
$sandbox = true;
if ($sandbox) {
$paypalURL = ‘https://www.sandbox.paypal.com/cgi-bin/webscr’;
$apiEndpoint = ‘https://api-3t.sandbox.paypal.com/nvp’;
//credenciais da API para o Sandbox
$user = ‘usuario’;
$pswd = ‘senha’;
$signature = ‘assinatura’;
} else {
$paypalURL = ‘https://www.paypal.com/cgi-bin/webscr’;
$apiEndpoint = ‘https://api-3t.paypal.com/nvp’;
//credenciais da API para produção
$user = ‘usuario’;
$pswd = ‘senha’;
$signature = ‘assinatura’;
}
/**
* $items[][0] = quantidade
* $items[][1] = Nome do curso
* $items[][2] = Descrição do curso
* $items[][3] = Preço do curso
*/
$items = array(
array(2, ‘Item 1’, ‘Primeiro item de teste’, 100)
);
//Calculando total do Express Checkout
$total = 0;
foreach ($items as $item) {
$total += $item[0] * $item[3];
}
//Campos que serão enviados com a operação SetExpressCheckout
$nvp = array(
‘PAYMENTREQUEST_0_AMT’ => $total,
‘PAYMENTREQUEST_0_CURRENCYCODE’ => ‘BRL’,
‘PAYMENTREQUEST_0_PAYMENTACTION’ => ‘Sale’,
‘RETURNURL’ => $returnURL,
‘CANCELURL’ => $cancelURL,
‘METHOD’ => ‘SetExpressCheckout’,
‘VERSION’ => ‘90.0’,
‘PWD’ => $pswd,
‘USER’ => $user,
‘SIGNATURE’ => $signature,
‘NOSHIPPING’ => 1,
‘REQCONFIRMSHIPPING’ => 0,
‘USERACTION’ => ‘COMMIT’
);
for ($i = 0, $t = count($items); $i < $t; ++$i) {
$nvp[‘L_PAYMENTREQUEST_0_QTY’ . $i ] = $items[$i][0];
$nvp[‘L_PAYMENTREQUEST_0_NAME’ . $i] = $items[$i][1];
$nvp[‘L_PAYMENTREQUEST_0_DESC’ . $i ] = $items[$i][2];
$nvp[‘L_PAYMENTREQUEST_0_AMT’ . $i] = $items[$i][3];
if (isset($items[$i][4])) {
$nvp[‘L_PAYMENTREQUEST_0_ITEMCATEGORY’ . $i] = $items[$i][4];
}
}
//Executando a operação
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $apiEndpoint);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($nvp));
$response = urldecode(curl_exec($curl));
curl_close($curl);
$responseNvp = array();
if (preg_match_all(‘/(?<name>[^\=]+)\=(?<value>[^&]+)&?/’, $response, $matches)) {
foreach ($matches[‘name’] as $offset => $name) {
$responseNvp[$name] = $matches[‘value’][$offset];
}
}
//Se a operação tiver sido bem sucedida, redirecionamos o cliente para o
//ambiente de pagamento.
if (isset($responseNvp[‘ACK’]) && $responseNvp[‘ACK’] == ‘Success’) {
$query = array(
‘cmd’ => ‘_express-checkout’,
‘token’ => $responseNvp[‘TOKEN’]
);
//redireciona o cliente para a página de pagamento
header(sprintf(‘Location: %s?%s’, $paypalURL, http_build_query($query)));
} else {
//alguma coisa aconteceu
}[/php]
Se observarmos na linha 102, o seguinte código faz o redirecionamento, caso a operação SetExpressCheckout tenha sido executada com sucesso:
[php]//redireciona o cliente para a página de pagamento
header(sprintf(‘Location: %s?%s’, $paypalURL, http_build_query($query)));[/php]
O que acontece, porém, é que dependendo da conexão do cliente, esse redirecionamento pode demorar alguns instantes. Além disso, o cliente não sabe o que está acontecendo. Para melhorar a experiência do cliente, a PayPal recomenda, à todos os vendedores, que uma tela de redirecionamento seja exibida, avisando-o sobre o redirecionamento para o ambiente seguro de pagamento PayPal. A tela é a seguinte:

Para adicionar a tela de redirecionamento é muito simples. O primeiro passo, é criar um arquivo redirect.php com o seguinte conteúdo:
[php]<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="2; url=<?php echo $redirectURL;?>">
<title>Aguarde alguns segundos.</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery(‘<div class="sa_payPal_overlay" style="visibility:visible;position:fixed; width:100%; height:100%; filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=1, StartColorStr=\’#88ffffff\’, EndColorStr=\’#88ffffff\’); background: rgba(255,255,255,0.8); top:0; left:0; z-index: 999999;"><div style=" background: #FFF; background-image: linear-gradient(top, #FFFFFF 45%, #E9ECEF 80%);background-image: -o-linear-gradient(top, #FFFFFF 45%, #E9ECEF 80%);background-image: -moz-linear-gradient(top, #FFFFFF 45%, #E9ECEF 80%);background-image: -webkit-linear-gradient(top, #FFFFFF 45%, #E9ECEF 80%);background-image: -ms-linear-gradient(top, #FFFFFF 45%, #E9ECEF 80%);background-image: -webkit-gradient(linear, left top,left bottom,color-stop(0.45, #FFFFFF),color-stop(0.8, #E9ECEF));display: block;margin: auto;position: fixed; margin-left:-220px; left:45%;top: 40%;text-align: center;color: #2F6395;font-family: Arial;padding: 15px;font-size: 15px;font-weight: bold;width: 530px;-webkit-box-shadow: 3px 2px 13px rgba(50, 50, 49, 0.25);box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 0px 5px;border: 1px solid #CFCFCF;border-radius: 6px;"><img style="display:block;margin:0 auto 10px" src="https://www.paypalobjects.com/en_US/i/icon/icon_animated_prog_dkgy_42wx42h.gif"><h2>Aguarde alguns segundos.</h2> <p style="font-size:13px; color: #003171; font-weight:400">Você está sendo redirecionado para um ambiente seguro do PayPal<br /> para finalizar seu pagamento.</p><div style="margin:30px auto 0;"><img src="http://apps.hostkong.com/paypal_logo.png"/></div></div></div>’).appendTo(‘body’);
});
</script>
</head>
<body>
Aguarde…
</body>
</html>
[/php]
Em seguida, modificamos o arquivo que executa a operação SetExpressCheckout para chamar a tela de redirecionamento:
[php]<?php
//URL de retorno, caso o cliente confirme o pagamento
$returnURL = ‘http://localhost/return’;
//URL de cancelamento, caso o cliente desista do pagamento
$cancelURL = ‘http://localhost/cancel’;
//Vai usar o Sandbox, ou produção?
$sandbox = true;
if ($sandbox) {
$paypalURL = ‘https://www.sandbox.paypal.com/cgi-bin/webscr’;
$apiEndpoint = ‘https://api-3t.sandbox.paypal.com/nvp’;
//credenciais da API para o Sandbox
$user = ‘usuario’;
$pswd = ‘senha’;
$signature = ‘assinatura’;
} else {
$paypalURL = ‘https://www.paypal.com/cgi-bin/webscr’;
$apiEndpoint = ‘https://api-3t.paypal.com/nvp’;
//credenciais da API para produção
$user = ‘usuario’;
$pswd = ‘senha’;
$signature = ‘assinatura’;
}
/**
* $items[][0] = quantidade
* $items[][1] = Nome do curso
* $items[][2] = Descrição do curso
* $items[][3] = Preço do curso
*/
$items = array(
array(2, ‘Item 1’, ‘Primeiro item de teste’, 100)
);
//Calculando total do Express Checkout
$total = 0;
foreach ($items as $item) {
$total += $item[0] * $item[3];
}
//Campos que serão enviados com a operação SetExpressCheckout
$nvp = array(
‘PAYMENTREQUEST_0_AMT’ => $total,
‘PAYMENTREQUEST_0_CURRENCYCODE’ => ‘BRL’,
‘PAYMENTREQUEST_0_PAYMENTACTION’ => ‘Sale’,
‘RETURNURL’ => $returnURL,
‘CANCELURL’ => $cancelURL,
‘METHOD’ => ‘SetExpressCheckout’,
‘VERSION’ => ‘90.0’,
‘PWD’ => $pswd,
‘USER’ => $user,
‘SIGNATURE’ => $signature,
‘NOSHIPPING’ => 1,
‘REQCONFIRMSHIPPING’ => 0,
‘USERACTION’ => ‘COMMIT’
);
for ($i = 0, $t = count($items); $i < $t; ++$i) {
$nvp[‘L_PAYMENTREQUEST_0_QTY’ . $i ] = $items[$i][0];
$nvp[‘L_PAYMENTREQUEST_0_NAME’ . $i] = $items[$i][1];
$nvp[‘L_PAYMENTREQUEST_0_DESC’ . $i ] = $items[$i][2];
$nvp[‘L_PAYMENTREQUEST_0_AMT’ . $i] = $items[$i][3];
if (isset($items[$i][4])) {
$nvp[‘L_PAYMENTREQUEST_0_ITEMCATEGORY’ . $i] = $items[$i][4];
}
}
//Executando a operação
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $apiEndpoint);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($nvp));
$response = urldecode(curl_exec($curl));
curl_close($curl);
$responseNvp = array();
if (preg_match_all(‘/(?<name>[^\=]+)\=(?<value>[^&]+)&?/’, $response, $matches)) {
foreach ($matches[‘name’] as $offset => $name) {
$responseNvp[$name] = $matches[‘value’][$offset];
}
}
//Se a operação tiver sido bem sucedida, redirecionamos o cliente para o
//ambiente de pagamento.
if (isset($responseNvp[‘ACK’]) && $responseNvp[‘ACK’] == ‘Success’) {
$query = array(
‘cmd’ => ‘_express-checkout’,
‘token’ => $responseNvp[‘TOKEN’]
);
$redirectURL = sprintf(‘%s?%s’, $paypalURL, http_build_query($query));
//carrega a página de redirecionamento
require ‘redirect.php’;
} else {
//alguma coisa aconteceu
}[/php]
Se observarmos, a mudança no código de integração é bastante simples. Em vez de redirecionar de forma “dura”, chamamos a página de redirecionamento, que avisará ao cliente sobre o processo:
[php]
$redirectURL = sprintf(‘%s?%s’, $paypalURL, http_build_query($query));
//carrega a página de redirecionamento
require ‘redirect.php’;
[/php]







