Інтеграція 1С-Bitrix з платіжною системою CloudPayments
CloudPayments — російський платіжний шлюз з віджетом оплати на JS, який вбудовується в сторінку без редиректу. Покупець вводить дані карти прямо на сторінці магазину — конверсія вища, ніж при редиректу. API заснований на REST, підтримує рекурентні платежі, 3-D Secure, холдирування.
Архітектура інтеграції
CloudPayments надає два варіанти оплати:
Checkout Widget — JS-віджет, форма відкривається у popup або inline на сторінці магазину. Дані карти йдуть прямо в CloudPayments (PCI DSS), на сервер магазину — тільки токен транзакції.
API без редиректу — магазин збирає дані карти сам і передає в API. Потребує сертифікації PCI DSS — рідко використовується.
Стандартний підхід для Bitrix — Checkout Widget.
Підключення віджету
На сторінці оформлення замовлення:
<script src="https://widget.cloudpayments.ru/bundles/cloudpayments.js"></script>
<script>
var widget = new cp.CloudPayments({language: 'ru-RU'});
widget.pay('auth', // 'auth' — двостадійна, 'charge' — одностадійна
{
publicId: 'pk_XXXXX',
description: 'Оплата замовлення #<?= $orderId ?>',
amount: <?= $amount ?>,
currency: 'RUB',
invoiceId: '<?= $orderId ?>',
accountId: '<?= $userId ?>',
skin: 'mini',
data: {
orderId: '<?= $orderId ?>',
csrfToken: '<?= bitrix_sessid() ?>',
}
},
{
onSuccess: function(options) {
// Платіж пройшов — сповістити сервер
fetch('/bitrix/tools/sale_ps_result.php', {
method: 'POST',
body: JSON.stringify({ orderId: options.invoiceId }),
});
},
onFail: function(reason, options) {
console.error('Payment failed:', reason);
}
}
);
</script>
У Bitrix віджет підключається в шаблоні компонента bitrix:sale.order.checkout або у result_modifier.php.
Серверна обробка: check та pay сповіщення
CloudPayments відправляє два сповіщення на сервер:
Check — перед списанням. Магазин повинен відповісти {"code":0} якщо замовлення існує, або ненульовим кодом для скасування.
Pay — після успішного списання. Підтвердження оплати.
Обробник сповіщень (/local/payment/cloudpayments/callback.php):
$data = json_decode(file_get_contents('php://input'), true);
// Перевірка HMAC підпису
$hmac = base64_encode(hash_hmac('sha256', file_get_contents('php://input'), $apiSecret, true));
if ($hmac !== $_SERVER['HTTP_CONTENT_HMAC']) {
http_response_code(403);
exit;
}
$invoiceId = $data['InvoiceId']; // наш orderId
$status = $data['Status']; // 'Completed', 'Cancelled' тощо
if ($status === 'Completed') {
// Знайти платіж по orderId, підтвердити
$order = \Bitrix\Sale\Order::loadByAccountNumber($invoiceId);
$paymentCollection = $order->getPaymentCollection();
foreach ($paymentCollection as $payment) {
if ($payment->getPaySystem()->getField('CODE') === 'cloudpayments') {
$payment->setPaid('Y');
}
}
$order->save();
}
header('Content-Type: application/json');
echo json_encode(['code' => 0]);
Перевірка підпису обов'язкова. CloudPayments передає HMAC SHA-256 у заголовку Content-HMAC. Без перевірки зловмисник може підтвердити оплату фальшивим POST.
Рекурентні платежі
CloudPayments підтримує підписки: при першому платежі створюється токен карти (Token), подальші списання робляться без участі покупця:
// Перший платіж із збереженням токену — через віджет з параметром createReceipt
// Подальші платежі через API
$response = $this->apiRequest('payments/tokens/charge', [
'Amount' => 999,
'Currency' => 'RUB',
'InvoiceId' => $subscriptionId,
'AccountId' => $userId,
'Token' => $savedToken,
'Description' => 'Підписка за лютий',
]);
Фіскалізація
CloudPayments інтегрується з online-касами через параметри cloudPayments.CustomerReceipt у запиті віджету. Ви передаєте масив позицій замовлення, ставку ПДВ, систему оподаткування. CloudPayments формує чек через підключену касу.
Строки розробки
| Задача | Строк |
|---|---|
| Базова інтеграція: віджет + check/pay callbacks | 2–3 дні |
| Двостадійні платежі (auth + confirm) | +1 день |
| Рекурентні платежі | +2–3 дні |
| Фіскалізація | +1–2 дні |
| Тестування та debugging | 1 день |







