Сайт электронной коммерции не обходится без платежного шлюза. Существует множество платежных шлюзов, из которых можно выбирать, но самый известный онлайн-шлюз — это PayPal. Это американец, который существует уже два десятилетия. Первоначально он был известен как Confinity, но с 2001 года он известен как PayPal.
PHP является одной из самых распространенных платформ для сайтов электронной коммерции. PHP является безопасным, быстрым и надежным языком в банковской и финансовой индустрии. Сегодня различные веб-сайты электронной коммерции работают на PHP.
В этом пошаговом руководстве давайте узнаем, как интегрировать платежный шлюз PayPal в PHP.
Ниже приведены функции, которые мы будем выполнять в демонстрационном процессе интеграции PayPal в PHP.
- Кнопка покупки PayPal извлекает товары из базы данных и веб-страницы.
- Когда покупатель нажимает кнопку PayPal, покупатель перенаправляет на страницу PayPal, где обрабатывается платеж.
- Покупатель перенаправляется обратно на веб-страницу после оплаты через PayPal; Детали оплаты будут доступны на веб-странице.
Вам также может понравиться:
Многофункциональная библиотека обработки платежей для Java
Прежде чем мы начнем интегрировать API платежного шлюза PayPal, давайте один раз рассмотрим структуру файла.
Джава
xxxxxxxxxx
1
paypal_integration_php/
2
├── config.php
4
├── dbConnect.php
6
├── index.php
8
├── success.php
10
├── cancel.php
12
├── ipn.php
14
├── css/
16
│ └── style.css
18
└── images/
PayPal имеет среду для песочницы для тестирования функциональных возможностей до того, как разработчик заставит их работать. Таким образом, разработчик программного обеспечения может решить любые проблемы до того, как бизнес начнет принимать платежи от любого клиента. Разработчик может легко получить доступ к этой изолированной программной среде, зарегистрировав учетную запись PayPal.
Шаг 1. Создание учетных записей в песочнице
Шаги по открытию учетной записи песочницы PayPal перечислены ниже.
- Первое, что вам нужно, это иметь учетную запись PayPal. Если вы этого не сделаете, вы можете подписаться на один здесь здесь https://www.paypal.com/in/webapps/mpp/account-selection . Если у вас уже есть учетная запись PayPal, перейдите на страницу разработчика PayPal https://developer.paypal.com/ и войдите в систему.
- Теперь нажмите на панель инструментов; это видно в верхней части навигации.
- Теперь нажмите учетные записи под ярлыком песочницы.
- Вы увидите, что по умолчанию создана учетная запись покупателя; это создано с помощью вашего email-покупателя.
- Вам необходимо создать учетную запись продавца, выполнив следующие действия.
- Нажмите Создать аккаунт
- Установите тип учетной записи на бизнес
- Выберите страну
- Нажмите Создать аккаунт
Шаг 2: Создание таблиц базы данных
Вам нужно две таблицы для хранения продукта и информации о платеже в базе данных. Приведенные ниже запросы SQL создают таблицы продуктов и платежей в базе данных MySQL.
Для продукта:
Джава
xxxxxxxxxx
1
CREATE TABLE `products` (
2
`id` int(11) NOT NULL AUTO_INCREMENT,
4
`name` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
6
`image` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
8
`price` float(10,2) NOT NULL,
10
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1=Active | 0=Inactive',
12
PRIMARY KEY (`id`)
14
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Для оплаты:
Джава
xxxxxxxxxx
1
CREATE TABLE `payments` (
2
`payment_id` int(11) NOT NULL AUTO_INCREMENT,
4
`item_number` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
6
`txn_id` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
8
`payment_gross` float(10,2) NOT NULL,
10
`currency_code` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
12
`payment_status` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
14
PRIMARY KEY (`payment_id`)
16
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Шаг 3. Настройки PayPal и настройка данных (config.php)
Переменные согласия шлюза Paypal определены в файле config.php.
Джава
xxxxxxxxxx
1
<?php
2
/*
3
* PayPal and database configuration
4
*/
5
// PayPal configuration
7
define('PAYPAL_ID', 'Insert_PayPal_Business_Email');
8
define('PAYPAL_SANDBOX', TRUE); //TRUE or FALSE
9
define('PAYPAL_RETURN_URL', 'http://www.example.com/success.php');
11
define('PAYPAL_CANCEL_URL', 'http://www.example.com/cancel.php');
12
define('PAYPAL_NOTIFY_URL', 'http://www.example.com/ipn.php');
13
define('PAYPAL_CURRENCY', 'USD');
14
// Database configuration
16
define('DB_HOST', 'MySQL_Database_Host');
17
define('DB_USERNAME', 'MySQL_Database_Username');
18
define('DB_PASSWORD', 'MySQL_Database_Password');
19
define('DB_NAME', 'MySQL_Database_Name');
20
// Change not required
22
define('PAYPAL_URL', (PAYPAL_SANDBOX == true)?"https://www.sandbox.paypal.com/cgi-bin/webscr":"https://www.paypal.com/cgi-bin/webscr");
Шаг 4: Подключение базы данных (dbConnect.php)
Джава
xxxxxxxxxx
1
PHP and MySQL are used to connect the database.
2
<?php
4
// Connect with the database
5
$db = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
6
// Display error if failed to connect
8
if ($db->connect_errno) {
9
printf("Connect failed: %s\n", $db->connect_error);
10
exit();
11
}
Шаг 5: Продукты (index.php)
- Все продукты взяты из базы данных и перечислены на веб-странице
- Кнопка «Купить сейчас» PayPal расположена сбоку от каждого продукта.
- Чтобы получить доступ к платежному шлюзу, вам необходимо отправить HTML-форму с предопределенными переменными PayPal.
Джава
xxxxxxxxxx
1
<?php
2
// Include configuration file
4
include_once 'config.php';
6
// Include database connection file
8
include_once 'dbConnect.php';
9
?>
10
<div class="container">
12
<?php
14
// Fetch products from the database
15
$results = $db->query("SELECT * FROM products WHERE status = 1");
16
while($row = $results->fetch_assoc()){
17
?>
19
<div class="pro-box">
21
<img src="images/<?php echo $row['image']; ?>"/>
23
<div class="body">
25
<h5><?php echo $row['name']; ?></h5>
27
<h6>Price: <?php echo '$'.$row['price'].' '.PAYPAL_CURRENCY; ?></h6>
29
<!-- PayPal payment form for displaying the buy button -->
31
<form action="<?php echo PAYPAL_URL; ?>" method="post">
33
<!-- Identify your business so that you can collect the payments. -->
35
<input type="hidden" name="business" value="<?php echo PAYPAL_ID; ?>">
37
<!-- Specify a Buy Now button. -->
39
<input type="hidden" name="cmd" value="_xclick">
41
<!-- Specify details about the item that buyers will purchase. -->
43
<input type="hidden" name="item_name" value="<?php echo $row['name']; ?>">
45
<input type="hidden" name="item_number" value="<?php echo $row['id']; ?>">
47
<input type="hidden" name="amount" value="<?php echo $row['price']; ?>">
49
<input type="hidden" name="currency_code" value="<?php echo PAYPAL_CURRENCY; ?>">
51
<!-- Specify URLs -->
53
<input type="hidden" name="return" value="<?php echo PAYPAL_RETURN_URL; ?>">
55
<input type="hidden" name="cancel_return" value="<?php echo PAYPAL_CANCEL_URL; ?>">
57
<!-- Display the payment button. -->
59
<input type="image" name="submit" border="0" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynow_LG.gif">
61
</form>
63
</div>
65
</div>
67
<?php } ?>
69
</div>
Шаг 6: Успешный платеж (success.php)
После успешного завершения платежа выполняются следующие шаги
- После успешной оплаты в PayPal покупатель перенаправляется на эту страницу.
- Используя метод PHP $ _Get, данные транзакции извлекаются из URL
- Информация о платеже сохраняется в базе данных на основе идентификатора транзакции.
- Детали оплаты доступны на веб-странице
Джава
xxxxxxxxxx
1
<?php
2
// Include configuration file
3
include_once 'config.php';
4
// Include database connection file
6
include_once 'dbConnect.php';
7
// If transaction data is available in the URL
9
if(!empty($_GET['item_number']) && !empty($_GET['tx']) && !empty($_GET['amt']) && !empty($_GET['cc']) && !empty($_GET['st'])){
10
// Get transaction information from URL
11
$item_number = $_GET['item_number'];
12
$txn_id = $_GET['tx'];
13
$payment_gross = $_GET['amt'];
14
$currency_code = $_GET['cc'];
15
$payment_status = $_GET['st'];
16
// Get product info from the database
18
$productResult = $db->query("SELECT * FROM products WHERE id = ".$item_number);
19
$productRow = $productResult->fetch_assoc();
20
// Check if transaction data exists with the same TXN ID.
22
$prevPaymentResult = $db->query("SELECT * FROM payments WHERE txn_id = '".$txn_id."'");
23
if($prevPaymentResult->num_rows > 0){
25
$paymentRow = $prevPaymentResult->fetch_assoc();
26
$payment_id = $paymentRow['payment_id'];
27
$payment_gross = $paymentRow['payment_gross'];
28
$payment_status = $paymentRow['payment_status'];
29
}else{
30
// Insert transaction data into the database
31
$insert = $db->query("INSERT INTO payments(item_number,txn_id,payment_gross,currency_code,payment_status) VALUES('".$item_number."','".$txn_id."','".$payment_gross."','".$currency_code."','".$payment_status."')");
32
$payment_id = $db->insert_id;
33
}
34
}
35
?>
36
38
<div class="container">
40
<div class="status">
42
<?php if(!empty($payment_id)){ ?>
44
<h1 class="success">Your Payment has been Successful</h1>
46
48
<h4>Payment Information</h4>
50
<p><b>Reference Number:</b> <?php echo $payment_id; ?></p>
52
<p><b>Transaction ID:</b> <?php echo $txn_id; ?></p>
54
<p><b>Paid Amount:</b> <?php echo $payment_gross; ?></p>
56
<p><b>Payment Status:</b> <?php echo $payment_status; ?></p>
58
60
<h4>Product Information</h4>
62
<p><b>Name:</b> <?php echo $productRow['name']; ?></p>
64
<p><b>Price:</b> <?php echo $productRow['price']; ?></p>
66
<?php }else{ ?>
68
<h1 class="error">Your Payment has Failed</h1>
70
<?php } ?>
72
</div>
74
<a href="index.php" class="btn-link">Back to Products</a>
76
</div>
Шаг 7: Отмена платежа (cancel.php)
Если покупатель отменяет платеж на странице PayPal, он / она будет перенаправлен на эту страницу.
Джава
xxxxxxxxxx
1
<div class="container">
2
<div class="status">
3
<h1 class="error">Your PayPal Transaction has been Canceled</h1>
4
</div>
5
<a href="index.php" class="btn-link">Back to Products</a>
6
</div>
Шаг 8. Настройка автоматического возврата PayPal и перевода платежа
Это необходимо для получения реквизитов транзакции от PayPal; если этого не сделано, вы получите необходимые данные.
Следуйте шагам
- Войдите в свою учетную запись PayPal (Бизнес)
- На моей учетной записи TAB нажмите на профиль
- Теперь под размещенными платежными сервисами нажмите на сайте настройки платежей
- Выберите переключатель «Автовозврат» и введите URL перенаправления в поле URL.
- Также установите переключатель «Передача платежных данных».
- Нажмите Сохранить
Шаг 9: Настройка IPN
Эта настройка необходима для обеспечения безопасности платежа. Первое, что вам нужно сделать, это добавить приведенный ниже код в форму HTML с переменными PayPal.
Джава
xxxxxxxxxx
1
<input type="hidden" name="notify_url" value="<?php echo PAYPAL_NOTIFY_URL; ?>">
Теперь войдите в свою учетную запись Paypal и выполните следующие действия:
- Нажмите на значок шестеренки, чтобы перейти к настройкам
- Зайдите в инструменты продаж и нажмите на уведомления о мгновенной оплате
- На этой странице нажмите на выбрать настройки IPN
- Введите URL-адрес уведомления и включите получение сообщений IPN
- Нажмите сохранить
Шаг 10. Настройка и проверка транзакции.
Теперь, когда ваш IPN включен, PayPal будет отправлять вам мгновенные уведомления о транзакциях. Добавьте приведенный ниже код в ipn.php, чтобы подтвердить транзакцию и сохранить информацию о платеже в базе данных.
Джава
xxxxxxxxxx
1
<?php
2
// Include configuration file
3
include_once 'config.php';
4
// Include database connection file
6
include_once 'dbConnect.php';
7
/*
9
* Read POST data
10
* reading posted data directly from $_POST causes serialization
11
* issues with array data in POST.
12
* Reading raw POST data from input stream instead.
13
*/
14
$raw_post_data = file_get_contents('php://input');
15
$raw_post_array = explode('&', $raw_post_data);
16
$myPost = array();
17
foreach ($raw_post_array as $keyval) {
18
$keyval = explode ('=', $keyval);
19
if (count($keyval) == 2)
20
$myPost[$keyval[0]] = urldecode($keyval[1]);
21
}
22
// Read the post from PayPal system and add 'cmd'
24
$req = 'cmd=_notify-validate';
25
if(function_exists('get_magic_quotes_gpc')) {
26
$get_magic_quotes_exists = true;
27
}
28
foreach ($myPost as $key => $value) {
29
if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
30
$value = urlencode(stripslashes($value));
31
} else {
32
$value = urlencode($value);
33
}
34
$req .= "&$key=$value";
35
}
36
/*
38
* Post IPN data back to PayPal to validate the IPN data is genuine
39
* Without this step, anyone can fake IPN data
40
*/
41
$paypalURL = PAYPAL_URL;
42
$ch = curl_init($paypalURL);
43
if ($ch == FALSE) {
44
return FALSE;
45
}
46
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
47
curl_setopt($ch, CURLOPT_POST, 1);
48
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
49
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
50
curl_setopt($ch, CURLOPT_SSLVERSION, 6);
51
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
52
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
53
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
54
// Set TCP timeout to 30 seconds
56
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
57
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close', 'User-Agent: company-name'));
58
$res = curl_exec($ch);
59
/*
61
* Inspect IPN validation result and act accordingly
62
* Split response headers and payload, a better way for strcmp
63
*/
64
$tokens = explode("\r\n\r\n", trim($res));
65
$res = trim(end($tokens));
66
if (strcmp($res, "VERIFIED") == 0 || strcasecmp($res, "VERIFIED") == 0) {
67
// Retrieve transaction info from PayPal
69
$item_number = $_POST['item_number'];
70
$txn_id = $_POST['txn_id'];
71
$payment_gross = $_POST['mc_gross'];
72
$currency_code = $_POST['mc_currency'];
73
$payment_status = $_POST['payment_status'];
74
// Check if transaction data exists with the same TXN ID
76
$prevPayment = $db->query("SELECT payment_id FROM payments WHERE txn_id = '".$txn_id."'");
77
if($prevPayment->num_rows > 0){
78
exit();
79
}else{
80
// Insert transaction data into the database
81
$insert = $db->query("INSERT INTO payments(item_number,txn_id,payment_gross,currency_code,payment_status) VALUES('".$item_number."','".$txn_id."','".$payment_gross."','".$currency_code."','".$payment_status."')");
82
}
83
}
85
?>
Шаг 11: Создание шлюза живым
Как только вы закончите тестирование, пришло время запустить платежный шлюз. Для этого вам нужно внести изменения в файл config.php. Вам необходимо настроить бизнес-идентификатор PayPal и отключить идентификатор песочницы.
Джава
xxxxxxxxxx
1
define('PAYPAL_ID', 'Insert_PayPal_Business_Email');
2
define('PAYPAL_SANDBOX', FALSE);
Это оно! Ваш платежный портал PayPal активен.
Заключение
Выполнив следующие действия, вы сможете успешно интегрировать платежный шлюз PayPal с PHP . Если у вас возникнут какие-либо проблемы, вы всегда можете посетить PayPal и посмотреть, есть ли у них решение. Или вы можете нанять разработчика PHP, который имеет опыт интеграции PayPal и PHP.
Пожалуйста, не стесняйтесь связаться с нами в комментариях.
Дальнейшее чтение
Загадка тестирования «Интеграция платежных шлюзов»
20 лет открытого исходного кода: почему лучшие платежные API используют общий код