Robokassa
Классический redirect-чекаут: карта, СБП, кошельки. Валюта — RUB. Юзер уходит по подписанной ссылке на auth.robokassa.ru, подтверждение приходит POST'ом на ResultURL. Подписи — MD5, как того требует протокол Robokassa.
Что понадобится
Магазин в кабинете Robokassa. Оттуда три вещи:
- Merchant Login — идентификатор магазина;
- Пароль #1 — подписывает ссылку на оплату;
- Пароль #2 — проверяет подпись уведомления на ResultURL.
Для песочницы у Robokassa отдельные тестовые пароли — их вписываете в те же поля вместе с включённым тестовым режимом.
Настройка в кабинете
| Поле | Что это | Обязательное |
|---|---|---|
merchant_login | Merchant Login магазина | Да |
password1 | Пароль #1 — подпись платёжной ссылки (шифруется Fernet) | Да |
password2 | Пароль #2 — проверка подписи ResultURL (шифруется Fernet) | Да |
is_test | 1 — тестовый режим: к ссылке добавляется 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 — единственный канал подтверждения.
