Интеграция 1С-Битрикс с платёжной системой Robokassa
Robokassa — агрегатор платежей: принимает карты, ЮMoney, QIWI, наличные через терминалы. Удобен когда нужно предоставить максимум способов оплаты. У Битрикс есть готовый модуль Robokassa в Маркетплейсе, но нередко нужна кастомная реализация с контролем параметров и логикой.
Схема работы
- Битрикс формирует подписанную ссылку на форму 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. Используйте для передачи идентификатора заказа в Битрикс, если 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 дня |







