WATA
WATA (wata.pro) — платёжные ссылки с оплатой картой, СБП, TPay и SberPay. Бот создаёт одноразовую ссылку (POST /api/h2h/links), юзер уходит на hosted-страницу WATA и после оплаты возвращается в бота. Валюта шлюза — RUB.
В заказ бот кладёт свой payment_id (orderId), поэтому вебхук привязывается к платежу и по нему, и по transactionId от WATA.
Что понадобится
Мерчант-аккаунт в WATA и API-токен H2H-API — он ходит в заголовке Authorization: Bearer. Больше ничего: публичный ключ для проверки подписи вебхуков бот забирает у WATA сам.
Настройка в кабинете
| Поле | Что это | Обязательное |
|---|---|---|
api_token | API-токен H2H из кабинета WATA; хранится в БД в зашифрованном виде | да |
Включите тумблер активности провайдера и нажмите Тест — бот запросит GET /api/h2h/public-key с вашим токеном: ответ 200 значит, что токен принят. Дополнительно у провайдера настраиваются отображаемое имя, комиссия для статистики и формы оплаты, которые видит юзер (карта / СБП / TPay / SberPay).
Вебхук
https://ваш-домен/api/v1/payments/wataУкажите этот URL как адрес уведомлений в кабинете WATA. Каждый вебхук WATA подписывает RSA-SHA512 по сырому телу запроса; base64-подпись приходит в заголовке X-Signature. Бот проверяет её публичным ключом, который сам получает с GET /api/h2h/public-key и кэширует до перезапуска процесса. Битая или отсутствующая подпись → HTTP 403.
Маппинг статуса из поля transactionStatus:
| Статус WATA | Что делает бот |
|---|---|
paid | зачисляет платёж |
declined | закрывает платёж как отменённый |
| остальные | оставляет в ожидании |
Прокси, переписывающий тело, ломает подпись
Подпись считается строго по сырым байтам тела — фолбэка с пересериализацией у этого шлюза нет. Если между WATA и ботом стоит прокси/CDN, который переформатирует JSON, каждый вебхук будет падать с 403. В этом случае платежи всё равно зачислит реконсилятор, но лучше пустить вебхуки мимо такого прокси.
Особенности
- Возвраты по API, рекурренты и сохранённые карты не поддерживаются — возврат делаете в кабинете WATA, в боте фиксируете результат: /payments/refunds.
- Шлюз умеет опрос статуса (
GET /api/h2h/transactions/{id}) — реконсилятор сам добивает платежи с потерянным вебхуком. - Ссылка создаётся с
type: OneTime, описание обрезается до 100 символов; success/fail редиректы ведут наreturn_url, по умолчанию — в Telegram.
Платёж прошёл, а подписки нет?
Реконсилятор опрашивает WATA каждые 5 минут и сам зачисляет зависшие оплаты. Как это работает — /payments/webhooks.
