Інтеграція 1С-Bitrix з платіжною системою Robokassa
Robokassa — агрегатор платежів: приймає карти, ЮMoney, QIWI, готівку через термінали. Зручна, коли потрібно надати максимум способів оплати. У Bitrix є готовий модуль Robokassa у Маркетплейсі, але часто потрібна користувацька реалізація з контролем параметрів та логікою.
Схема роботи
- Bitrix формує підписаний посилання на форму Robokassa
- Покупець оплачує (карта, гаманець, готівка)
- Robokassa відправляє POST-сповіщення на
ResultURLмагазину - Магазин перевіряє підпис, підтверджує оплату
- Robokassa перенаправляє покупця на
SuccessURLабоFailURL
Параметри та формування підпису
Базові параметри запиту до Robokassa:
| Параметр | Значення | Описання |
|---|---|---|
MerchantLogin |
з ЛК | Логін магазину |
OutSum |
сума | Сума оплати |
InvId |
orderId | Номер замовлення |
Description |
текст | Описання (до 100 символів) |
SignatureValue |
MD5/SHA256 | Підпис |
IsTest |
1 | Тестовий режим |
Encoding |
utf-8 | Кодування |
Підпис формується як MD5 або SHA256 (залежить від налаштувань магазину в ЛК Robokassa):
// MD5 підпис
$signature = md5("{$merchantLogin}:{$outSum}:{$invId}:{$password1}");
// SHA256 (рекомендується)
$signature = hash('sha256', "{$merchantLogin}:{$outSum}:{$invId}:{$password1}");
// URL платіжної форми
$payUrl = 'https://auth.robokassa.ru/Merchant/Index.aspx?'
. http_build_query([
'MerchantLogin' => $merchantLogin,
'OutSum' => number_format($outSum, 2, '.', ''),
'InvId' => $invId,
'Description' => $description,
'SignatureValue' => $signature,
'Encoding' => 'utf-8',
'IsTest' => $isTest ? 1 : 0,
]);
Обробка ResultURL
Robokassa відправляє POST з параметрами на ResultURL. Перевірка підпису обов'язкова — використовується Password2 (відрізняється від Password1):
$outSum = $_POST['OutSum'];
$invId = $_POST['InvId'];
$received = strtolower($_POST['SignatureValue']);
$password2 = $this->getBusinessValue($payment, 'ROBOKASSA_PASSWORD2');
$expected = strtolower(hash('sha256', "{$outSum}:{$invId}:{$password2}"));
if ($received !== $expected) {
echo 'bad sign';
exit;
}
// Підпис правильний — підтверджуємо оплату
$order = \Bitrix\Sale\Order::loadByAccountNumber($invId);
// ... setPaid('Y'), save()
echo "OK{$invId}"; // Robokassa чекає саме цю відповідь
Критично: відповідь на ResultURL має бути строго OK{InvId}. Якщо Robokassa не отримує цю відповідь — вважає сповіщення невідправленим і спробує знову (до 8 разів).
Додаткові параметри (Shp_*)
Robokassa підтримує користувацькі параметри з префіксом Shp_. Вони включаються в підпис і повертаються в ResultURL. Використовуйте для передачі ідентифікатора замовлення в Bitrix, якщо InvId зайнято або потрібні додаткові дані:
$signature = hash('sha256',
"{$merchantLogin}:{$outSum}:{$invId}:{$password1}:Shp_item={$itemId}&Shp_user={$userId}"
);
// Параметри Shp_ у підпис включаються в алфавітному порядку ключів
Фіскалізація
Robokassa підтримує ФЗ-54 через параметр Receipt у base64-encoded JSON:
$receipt = [
'sno' => 'osn', // система оподаткування
'items' => array_map(function($basketItem) {
return [
'name' => $basketItem->getField('NAME'),
'quantity' => $basketItem->getQuantity(),
'sum' => $basketItem->getPrice() * $basketItem->getQuantity(),
'payment_method' => 'full_prepayment',
'payment_object' => 'commodity',
'tax' => 'vat20',
];
}, iterator_to_array($order->getBasket())),
];
$receiptEncoded = base64_encode(json_encode($receipt, JSON_UNESCAPED_UNICODE));
Строки розробки
| Задача | Строк |
|---|---|
| Обробник: формування посилання + ResultURL | 1–2 дні |
| Додаткові параметри Shp_* | 0,5 дня |
| Фіскалізація | +1–2 дні |
| Тестування повного циклу | 0,5 дня |







