SeverPay
SeverPay (severpay.io) — касса с оплатой картой и СБП. Бот создаёт счёт через POST /api/merchant/payin/create и отправляет юзера на страницу оплаты из ответа. Валюта — RUB.
Подпись у SeverPay живёт в теле запроса, а не в заголовке, и считается одинаково в обе стороны: из payload выкидывается поле sign, добавляются mid и случайный salt (на исходящих), ключи сортируются, JSON сжимается в компактный вид (ensure_ascii=False) и берётся HMAC-SHA256 hex с ключом token. В счёт кладётся свой payment_id (order_id).
Что понадобится
Мерчант-аккаунт в SeverPay: токен (ключ HMAC-подписи) и mid — числовой ID мерчанта.
Настройка в кабинете
| Поле | Что это | Обязательное |
|---|---|---|
token | секретный токен — ключ HMAC-SHA256 подписи запросов и вебхуков | да |
mid | числовой ID мерчанта, уходит в каждый запрос | да |
Ключи хранятся в БД в зашифрованном виде. Включите тумблер активности провайдера. Кнопка Тест у этого шлюза проверочного запроса к API не делает — правильность ключей подтвердит первый платёж. Дополнительно настраиваются отображаемое имя, комиссия для статистики и формы оплаты, которые видит юзер (карта / СБП).
Вебхук
https://ваш-домен/api/v1/payments/severpayУкажите этот URL как адрес уведомлений в кабинете SeverPay. Подпись приходит в поле sign JSON-тела и проверяется той же формулой: убрать sign, отсортировать ключи, компактный JSON, HMAC-SHA256 с token. Битая или отсутствующая подпись → HTTP 403.
Маппинг статуса из поля status:
| Статус SeverPay | Что делает бот |
|---|---|
success | зачисляет платёж |
decline, fail, failed, cancelled, canceled | закрывает платёж как отменённый |
| остальные | оставляет в ожидании |
Особенности
- Возвраты по API, рекурренты и сохранённые карты не поддерживаются — возврат делаете в кабинете SeverPay, в боте фиксируете результат: /payments/refunds.
- Опроса статуса у этого шлюза нет — зачисление зависит только от вебхука.
- Сумма из вебхука сверяется со счётом: меньше 90% ожидаемого — платёж бракуется как недоплата.
- Подпись считается по пересобранному JSON, а не по сырым байтам — прокси, переформатирующий тело, вебхуки здесь не ломает.
- Покупателю подставляется синтетический e-mail
<telegram_id>@telegram.orgиclient_id= внутренний ID юзера; возврат после оплаты — наreturn_url(по умолчанию в Telegram). Счёт создаётся сlifetime: 1440.
Платёж прошёл, а подписки нет?
У SeverPay нет API опроса статуса, поэтому реконсилятор этот шлюз не добьёт — единственный канал зачисления здесь вебхук. Если платежи виснут, проверьте URL уведомлений и token/mid. Как устроен пайплайн вебхуков — /payments/webhooks.
