Skip to content

Robokassa

Классический redirect-чекаут: карта, СБП, кошельки. Валюта — RUB. Юзер уходит по подписанной ссылке на auth.robokassa.ru, подтверждение приходит POST'ом на ResultURL. Подписи — MD5, как того требует протокол Robokassa.

Что понадобится

Магазин в кабинете Robokassa. Оттуда три вещи:

  • Merchant Login — идентификатор магазина;
  • Пароль #1 — подписывает ссылку на оплату;
  • Пароль #2 — проверяет подпись уведомления на ResultURL.

Для песочницы у Robokassa отдельные тестовые пароли — их вписываете в те же поля вместе с включённым тестовым режимом.

Настройка в кабинете

ПолеЧто этоОбязательное
merchant_loginMerchant Login магазинаДа
password1Пароль #1 — подпись платёжной ссылки (шифруется Fernet)Да
password2Пароль #2 — проверка подписи ResultURL (шифруется Fernet)Да
is_test1 — тестовый режим: к ссылке добавляется IsTest=1 (песочница)Нет

Включение — переключатель активности в карточке; после этого способ появляется у юзеров в боте и мини-аппе. Кнопка «Тест» проверяет только заполненность трёх полей: проверочного API у Robokassa нет, креды сверятся первым платежом.

Вебхук

ResultURL: https://ваш-домен/api/v1/payments/robokassa, метод POST — укажите в технических настройках магазина Robokassa.

Уведомление приходит form-encoded. Подпись проверяется как md5(OutSum:InvId:Пароль#2:Shp_pid=...), сравнение constant-time; несовпадение — 403.

Два протокольных момента шлюз закрывает сам:

  • Robokassa требует ответить на ResultURL точной plain-text строкой OK<InvId> — шлюз отдаёт её автоматически, ничего настраивать не нужно.
  • InvId всегда 0: внутренний UUID платежа едет в кастомном параметре Shp_pid, который по правилам Robokassa входит и в подпись ссылки, и в подпись уведомления. Якорем платежа служит именно он.

Особенности

  • Ссылка на оплату подписывается как md5(login:OutSum:0:Пароль#1:Shp_pid=<uuid>) — если поменяли Пароль #1 в кабинете Robokassa, обновите его и здесь, иначе форма перестанет открываться.
  • Сумма OutSum из уведомления сверяется пайплайном с ценой счёта: меньше 90% — платёж помечается FAILED, недоплата не фулфиллится.
  • Возвратов по API нет — возврат из кабинета фиксируется только записью, деньги возвращаете через кабинет Robokassa вручную.
  • Поллинга статуса нет: подтверждение приходит только на ResultURL. Проверяйте, что URL в кабинете Robokassa указан именно с /api/v1/payments/robokassa и метод POST.

Платёж не пришёл?

Как устроен пайплайн подтверждения и реконсилятор зависших платежей (запускается каждые 5 минут) — см. /payments/webhooks. У Robokassa нет API-поллинга, поэтому доходимость ResultURL — единственный канал подтверждения.

MIT License · сделано для тех, кто продаёт VPN, а не настраивает ботов