Интеграция PayPal Payment Gateway в PHP с использованием PayPal REST API
PayPal – один из самых надежных платежных шлюзов в Интернете. Он широко используется на веб-сайтах для приема платежей в Интернете. Однако документацию API PayPal понять непросто. Для разработчика, который собирается интегрировать платежный шлюз PayPal в первый раз, это займет много часов. Я потратил безумное количество часов на чтение документации API PayPal. А позже поймете, что нет необходимости глубоко читать документацию Paypal, чтобы интегрировать ее.
В этой статье мы изучаем, как интегрировать платежный шлюз PayPal с помощью PayPal REST API. Мы собираемся использовать библиотеку GitHub, предоставленную Omnipay. Omnipay предоставляет простой и понятный способ интеграции различных платежных шлюзов в ваше веб-приложение. Их структура кода также чиста и эффективна. Разработчикам это понравится.
Получите идентификатор клиента PayPal и секрет клиента
Для интеграции PayPal на веб-сайт вам сначала необходимо создать приложение REST API в учетной записи разработчика PayPal. После создания приложения вы получите идентификатор клиента и секрет клиента, которые потребуются на следующих шагах.
Чтобы создать приложение REST API, перейдите в свою учетную запись разработчика PayPal и войдите в панель управления.
На панели инструментов разработчика щелкните меню «Мои приложения и учетные данные». Нажмите кнопку «Создать приложение» в разделе приложений REST API.
На следующем шаге введите имя приложения, и вы получите свой идентификатор клиента и секрет клиента. В моем случае на скриншоте ниже я вижу учетные данные песочницы. В вашем случае это могут быть живые учетные данные. Или вы также можете попробовать свои учетные данные песочницы.
Установка библиотеки и базовая настройка
Как я уже сказал, мы будем использовать Omnipay для интеграции PayPal REST API. Нам нужно сначала установить их библиотеки с помощью Composer. Выполните команду ниже, чтобы установить библиотеки.
composer require league/omnipay omnipay/paypal
После установки библиотеки создайте файл конфигурации, в котором мы храним наши учетные данные API, записываем соединение с БД и инициализируем шлюз.
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
Здесь я передал параметр Paypal_Rest методу create Omnipay. Omnipay в фоновом режиме вызывает PayPal REST API при совершении платежа через него.
Затем создайте простую форму, в которой пользователь может ввести сумму. В демонстрационных целях я оставляю в форме только одно поле. Вы можете расширить форму в соответствии с вашими требованиями.
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>
Когда платеж будет завершен, мы должны сохранить детали транзакции в таблице базы данных. Создайте таблицу базы данных, выполнив приведенный ниже SQL-запрос.
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;
Эта таблица не содержит внешнего ключа, так как предназначена только для демонстрационных целей. Пользователь может добавить столбец user_id в эту таблицу для ссылки на платеж с пользователем.
Интеграция PayPal Payment Gateway в PHP с использованием PayPal REST API
При использовании PayPal REST API пользователь будет перенаправлен на PayPal для завершения платежа. После совершения платежа пользователь будет перенаправлен обратно в наше приложение в зависимости от статуса успеха или отказа. Мы определили эти URL-адреса в config.php
файле выше.
После того, как пользователь перенаправляется обратно в наше приложение с успешным ответом, нам нужно выполнить платеж в нашем файле PHP, который success.php
в нашем случае. Мы также сохраняем платежную информацию после выполнения платежа с помощью PayPal REST API. Итак, наш код будет следующим.
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>
Отправить информацию о продукте в PayPal
В приведенном выше коде мы отправляем сумму для оплаты через PayPal. Вы также можете отправить информацию о продукте. Ваши клиенты могут увидеть эти сведения о продукте на странице оплаты до совершения платежа.
Чтобы отправить информацию о продукте, вам необходимо передать массив items в purchase
метод следующим образом.
$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();
Здесь я передал детали продукта статически. Вы должны сделать его динамичным в зависимости от вашего продукта.
Надеюсь, вы узнали об интеграции PayPal Payment Gateway в PHP. Я хотел бы услышать ваши мысли или предложения в разделе комментариев ниже.
Статьи по Теме
- Принимайте платежи по кредитным картам с помощью PayPal Payments Pro на PHP
- Принимайте оплату кредитной картой с помощью платежного шлюза Authorize.net на PHP
- Руководство по интеграции Stripe на веб-сайт с PHP