Integração do gateway de pagamento do PayPal em PHP usando a API REST do PayPal
O PayPal é um dos gateways de pagamento mais confiáveis da Internet. É amplamente utilizado em sites para aceitar pagamentos online. No entanto, a documentação da API do PayPal não é fácil de entender. Para um desenvolvedor que vai integrar o gateway de pagamento do PayPal pela primeira vez, levará muitas horas para ter sucesso. Passei uma quantidade absurda de horas lendo a documentação da API do PayPal. E depois perceba que não há necessidade de ler a documentação do Paypal em profundidade para integrá-lo.
Neste artigo, estudamos como integrar um gateway de pagamento do PayPal usando a API REST do PayPal. Usaremos a biblioteca GitHub fornecida pelo Omnipay. Omnipay fornece uma maneira limpa e fácil de integrar diferentes gateway de pagamento em seu aplicativo da web. Sua estrutura de código também é limpa e eficiente. Os desenvolvedores adorariam.
Obtenha o ID e o segredo do cliente do PayPal
Para integração do PayPal no site, primeiro você precisa criar um aplicativo REST API em uma conta de desenvolvedor do PayPal. Depois de criar o aplicativo, você obterá o ID do cliente e o segredo do cliente que serão exigidos nas próximas etapas.
Para criar o aplicativo REST API, acesse sua conta de desenvolvedor do PayPal e faça login no painel.
No painel do desenvolvedor, clique no menu ‘Meus aplicativos e credenciais’. Clique no botão ‘Criar aplicativo’ na seção de aplicativos da API REST.
Na próxima etapa, preencha o nome do aplicativo e você obterá seu ID e segredo do cliente. No meu caso, na captura de tela abaixo, posso ver as credenciais do sandbox. No seu caso, podem ser credenciais ativas. Ou você também pode tentar com suas credenciais de sandbox.
Instalação da biblioteca e configuração básica
Como eu disse, usaremos o Omnipay para integração da API REST do PayPal. Precisamos primeiro instalar suas bibliotecas usando o Composer. Execute o comando abaixo para instalar as bibliotecas.
composer require league/omnipay omnipay/paypal
Depois de instalar a biblioteca, crie um arquivo de configuração onde armazenamos nossas credenciais de API, gravamos a conexão do banco de dados e inicializamos o gateway.
config.php
<?php
require_once "vendor/autoload.php";
use OmnipayOmnipay;
define('CLIENT_ID', 'PAYPAL_CLIENT_ID_HERE');
define('CLIENT_SECRET', 'PAYPAL_CLIENT_SECRET_HERE');
define('PAYPAL_RETURN_URL', 'YOUR_SITE_URL/success.php');
define('PAYPAL_CANCEL_URL', 'YOUR_SITE_URL/cancel.php');
define('PAYPAL_CURRENCY', 'USD'); // set your currency here
// Connect with the database
$db = new mysqli('localhost', 'MYSQL_DB_USERNAME', 'MYSQL_DB_PASSWORD', 'MYSQL_DB_NAME');
if ($db->connect_errno) {
die("Connect failed: ". $db->connect_error);
}
$gateway = Omnipay::create('PayPal_Rest');
$gateway->setClientId(CLIENT_ID);
$gateway->setSecret(CLIENT_SECRET);
$gateway->setTestMode(true); //set it to 'false' when go live
Aqui, passei o parâmetro ‘Paypal_Rest’ para o método de criação do Omnipay. O Omnipay em segundo plano chama a API REST do PayPal enquanto faz o pagamento por meio dele.
Em seguida, crie um formulário simples onde um usuário pode inserir o valor. Para fins de demonstração, mantenho apenas um campo no formulário. Você pode estender o formulário de acordo com sua necessidade.
form.html
<form action="charge.php" method="post">
<input type="text" name="amount" value="20.00" />
<input type="submit" name="submit" value="Pay Now">
</form>
Quando o pagamento for concluído, devemos salvar os detalhes da transação na tabela do banco de dados. Crie uma tabela de banco de dados executando a consulta SQL abaixo.
CREATE TABLE `payments` ( `id` int(11) NOT NULL AUTO_INCREMENT,
`payment_id` varchar(255) NOT NULL,
`payer_id` varchar(255) NOT NULL,
`payer_email` varchar(255) NOT NULL,
`amount` float(10,2) NOT NULL,
`currency` varchar(255) NOT NULL,
`payment_status` varchar(255) NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Esta tabela não contém nenhuma chave estrangeira, pois é apenas para fins de demonstração. O usuário pode adicionar uma coluna user_id nesta tabela para fazer referência ao pagamento com o usuário.
Integração do gateway de pagamento do PayPal em PHP usando a API REST do PayPal
Ao usar a API REST do PayPal, o usuário redirecionará para o PayPal para concluir o pagamento. Depois de fazer o pagamento, o usuário redirecionará de volta ao nosso aplicativo com base no status de sucesso ou falha. Definimos esses URLs no config.php
arquivo acima.
Assim que o usuário redirecionar de volta ao nosso aplicativo com resposta de sucesso, precisamos executar o pagamento em nosso arquivo PHP, que é o success.php
nosso caso. Também armazenamos as informações de pagamento após a execução do pagamento usando a API REST do PayPal. Portanto, nosso código será o seguinte.
charge.php
<?php
require_once 'config.php';
if (isset($_POST['submit'])) {
try {
$response = $gateway->purchase(array(
'amount' => $_POST['amount'],
'currency' => PAYPAL_CURRENCY,
'returnUrl' => PAYPAL_RETURN_URL,
'cancelUrl' => PAYPAL_CANCEL_URL,
))->send();
if ($response->isRedirect()) {
$response->redirect(); // this will automatically forward the customer
} else {
// not successful
echo $response->getMessage();
}
} catch(Exception $e) {
echo $e->getMessage();
}
}
success.php
<?php
require_once 'config.php';
// Once the transaction has been approved, we need to complete it.
if (array_key_exists('paymentId', $_GET) && array_key_exists('PayerID', $_GET)) {
$transaction = $gateway->completePurchase(array(
'payer_id' => $_GET['PayerID'],
'transactionReference' => $_GET['paymentId'],
));
$response = $transaction->send();
if ($response->isSuccessful()) {
// The customer has successfully paid.
$arr_body = $response->getData();
$payment_id = $arr_body['id'];
$payer_id = $arr_body['payer']['payer_info']['payer_id'];
$payer_email = $arr_body['payer']['payer_info']['email'];
$amount = $arr_body['transactions'][0]['amount']['total'];
$currency = PAYPAL_CURRENCY;
$payment_status = $arr_body['state'];
// Insert transaction data into the database
$isPaymentExist = $db->query("SELECT * FROM payments WHERE payment_id = '".$payment_id."'");
if($isPaymentExist->num_rows == 0) {
$insert = $db->query("INSERT INTO payments(payment_id, payer_id, payer_email, amount, currency, payment_status) VALUES('". $payment_id ."', '". $payer_id ."', '". $payer_email ."', '". $amount ."', '". $currency ."', '". $payment_status ."')");
}
echo "Payment is successful. Your transaction id is: ". $payment_id;
} else {
echo $response->getMessage();
}
} else {
echo 'Transaction is declined';
}
cancel.php
<h3>User is canceled the payment.</h3>
Envie informações do produto para o PayPal
No código acima, estamos enviando o valor a pagar no PayPal. Você também pode enviar informações sobre o produto. Seus clientes podem ver os detalhes desses produtos na página de pagamento antes de efetuar um pagamento.
Para enviar as informações do produto, você precisa passar a matriz ‘itens’ para o purchase
método a seguir.
$response = $gateway->purchase(array(
'amount' => $_POST['amount'],
'items' => array(
array(
'name' => 'Course Subscription',
'price' => $_POST['amount'],
'description' => 'Get access to premium courses.',
'quantity' => 1
),
),
'currency' => PAYPAL_CURRENCY,
'returnUrl' => PAYPAL_RETURN_URL,
'cancelUrl' => PAYPAL_CANCEL_URL,
))->send();
Aqui, passei os detalhes do produto estaticamente. Você deve torná-lo dinâmico dependendo do seu produto.
Espero que você conheça a integração do gateway de pagamento do PayPal em PHP. Eu gostaria de ouvir suas opiniões ou sugestões na seção de comentários abaixo.
Artigos relacionados
- Aceite pagamentos com cartão de crédito usando o PayPal Payments Pro em PHP
- Aceitar pagamento com cartão de crédito usando o gateway de pagamento Authorize.net em PHP
- Um guia para integração do Stripe em sites com PHP