Skip to main content
Бот поддерживает 23 платёжных провайдера одновременно (плюс Apple In-App Purchase). Каждый провайдер включается отдельно, все работают параллельно через единый веб-сервер на порту 8080.

Общая архитектура

Все платежи проходят через баланс: пользователь пополняет баланс любым доступным способом, затем покупает подписку с баланса. Единственное исключение —Telegram Stars и простая подписка (SIMPLE_SUBSCRIPTION_ENABLED), которые могут проводить оплату напрямую, минуя баланс.

Приоритет отображения

Способы оплаты отображаются в фиксированном порядке:
  1. Telegram Stars
  2. YooKassa СБП (если YOOKASSA_SBP_ENABLED=true)
  3. YooKassa карты
  4. Tribute
  5. MulenPay
  6. WATA
  7. PayPalych (Pal24)
  8. CryptoBot
  9. Heleket
  10. Platega
  11. CloudPayments
  12. Freekassa
  13. Kassa AI
  14. RioPay
  15. SeverPay
  16. PayPear
  17. RollyPay
  18. AuraPay
  19. Overpay
  20. Etoplatezhi
  21. Antilopay
  22. Jupiter
  23. Donut
  24. Lava
  25. Apple In-App Purchase (только iOS, отображается в Mini App)
  26. Через поддержку (всегда последний)

Поддерживаемые провайдеры

Все webhook URL доступны на едином сервере бота (порт 8080). Укажите полный путь: https://hooks.domain.com/webhook-path. Для CloudPayments дополнительно доступны суб-роуты /check, /pay, /fail.

Общие настройки платежей

Эти переменные влияют на все платёжные системы.

Описания и шаблоны платежей

Управление интерфейсом

Автопроверка платежей

Автопокупка после пополнения

Подробнее — см. Автопокупка и корзина.

Автооплата (автопродление)

Подробнее — см. Рекуррентные платежи.

Telegram Stars

Встроенная платёжная система Telegram. Не требует webhook — платежи обрабатываются через Telegram Bot API.

Настройки

Telegram Stars — единственный провайдер, включённый по умолчанию. Курс 1.3 означает: 1 звезда = 1.30 руб. Количество звёзд рассчитывается автоматически на основе суммы в рублях.

Округление и нормализация суммы

Количество звёзд рассчитывается из суммы в рублях с помощью стандартного округления (round()):
Например, при курсе 1.79 за звезду и сумме 500₽: round(500 / 1.79) = 279 звёзд. При зачислении сумма нормализуется: на баланс попадает не исходная сумма, а точный эквивалент оплаченных звёзд: звёзды × курс. В примере выше: 279 × 1.79 = 499.41₽, а не 500₽.
Это означает, что пользователь получает ровно столько, сколько стоят оплаченные звёзды. Небольшая разница между запрошенной и зачисленной суммой — следствие округления при конвертации.

Особенности

  • Работает без внешних webhook и API-ключей
  • Поддерживает как пополнение баланса, так и прямую оплату простых подписок
  • Валюта: XTR (Telegram Stars)
  • Минимум: 1 звезда

YooKassa

Самый популярный провайдер для российского рынка. Поддерживает банковские карты, СБП, и фискализацию через НалоGo.

Обязательные настройки

Все переменные

Webhook

Укажите в кабинете YooKassa: https://hooks.domain.com/yookassa-webhook
Бот проверяет IP-адреса YooKassa и отклоняет запросы с неизвестных адресов. При использовании reverse proxy укажите сети прокси в YOOKASSA_TRUSTED_PROXY_NETWORKS.

Рекуррентные платежи (сохранённые карты)

YooKassa поддерживает сохранение банковских карт для автоматического пополнения баланса при продлении подписки. Подробнее — см. Рекуррентные платежи. При включённом YOOKASSA_RECURRENT_ENABLED:
  • При успешной оплате карта автоматически сохраняется (если пользователь дал согласие или RECURRENT_REQUIRED=true)
  • Сохранённые карты используются для автоматического пополнения баланса при продлении подписки
  • Работает совместно с системой автооплаты (ENABLE_AUTOPAY=true): если у пользователя недостаточно баланса для продления, бот автоматически списывает нужную сумму с сохранённой карты
  • Пользователь может управлять сохранёнными картами (удалять ненужные)
Для работы рекуррентных платежей необходимо одновременно включить YOOKASSA_RECURRENT_ENABLED=true и ENABLE_AUTOPAY=true. Без автооплаты сохранённые карты не будут использоваться автоматически.

Фискализация (НалоGo)

YooKassa поддерживает автоматическую отправку чеков через НалоGo (для самозанятых):
Настройки очереди чеков:

CryptoBot

Криптовалютные платежи через CryptoBot.

Обязательные настройки

Все переменные

Тестовый режим

При CRYPTOBOT_TESTNET=true все запросы идут на testnet-pay.crypt.bot. Используйте для тестирования без реальных средств.

Webhook

Укажите в @CryptoBot -> My Apps -> Webhook: https://hooks.domain.com/cryptobot-webhook

CloudPayments

Платежи через виджет CloudPayments с поддержкой 3D-Secure.

Обязательные настройки

Все переменные

Webhook

CloudPayments использует несколько суб-роутов: В кабинете CloudPayments укажите: https://hooks.domain.com/cloudpayments-webhook

Freekassa

Обязательные настройки

Все переменные

Режимы создания платежей

  • FREEKASSA_USE_API=false — редирект на платёжную форму Freekassa (по умолчанию)
  • FREEKASSA_USE_API=true — создание заказа через API (рекомендуется для NSPK СБП)

Webhook

В кабинете Freekassa укажите: https://hooks.domain.com/freekassa-webhook

Kassa AI

Отдельная платёжная система (api.fk.life), работает параллельно с Freekassa.

Обязательные настройки

Все переменные

Webhook

В кабинете Kassa AI укажите: https://hooks.domain.com/kassa-ai-webhook

PayPalych (Pal24)

Платежи через PayPalych (СБП и банковские карты).

Обязательные настройки

Все переменные

Webhook

В кабинете Pal24 укажите Result URL: https://hooks.domain.com/pal24-webhook

Platega

Поддерживает несколько методов оплаты: СБП, карты, международные карты и криптовалюту.

Обязательные настройки

Все переменные

Методы оплаты

Коды для PLATEGA_ACTIVE_METHODS:

Inline-отображение

Если у Platega настроено несколько активных методов (PLATEGA_ACTIVE_METHODS), каждый метод отображается как отдельная кнопка на главном экране бота. Пользователь сразу видит доступные варианты (СБП, карты, крипто) без дополнительных переходов.

Webhook

В кабинете Platega укажите: https://hooks.domain.com/platega-webhook

WATA

Платежи картами через WATA.

Обязательные настройки

Все переменные

Webhook

В кабинете WATA укажите: https://hooks.domain.com/wata-webhook

Heleket

Криптовалютный провайдер с поддержкой USDT и других валют.

Обязательные настройки

Все переменные

Webhook

В кабинете Heleket укажите Callback URL: https://hooks.domain.com/heleket-webhook

MulenPay

Обязательные настройки

Все переменные

Webhook

В кабинете MulenPay укажите: https://hooks.domain.com/mulenpay-webhook Поддерживается проверка подписи через несколько форматов: HMAC-SHA256 (hex, base64), Bearer-токен, кастомные заголовки.

Tribute

Платежи через Telegram-платформу Tribute. Поддерживает как разовые, так и рекуррентные донаты.

Обязательные настройки

Все переменные

Особенности

  • Обрабатывает события new_donation и recurrent_donation
  • Поддерживает возврат средств (refund) через API

Webhook

В кабинете Tribute укажите: https://hooks.domain.com/tribute-webhook

RioPay

Платежи картами через RioPay (api.riopay.online).

Обязательные настройки

Все переменные

Webhook

В кабинете RioPay укажите: https://hooks.domain.com/riopay-webhook Подпись webhook проверяется через HMAC-SHA512 (заголовок X-Signature). Если RIOPAY_WEBHOOK_SECRET не указан, используется значение RIOPAY_API_TOKEN.

SeverPay

Платежи через SeverPay (СБП и банковские карты) с HMAC-SHA256 подписью webhook.

Обязательные настройки

Все переменные

Webhook

В кабинете SeverPay укажите: https://hooks.domain.com/severpay-webhook Подпись webhook проверяется через HMAC-SHA256. Webhook всегда возвращает HTTP 200 для предотвращения повторных запросов от SeverPay.

PayPear

Платежи через PayPear (api.paypear.ru) с поддержкой банковских карт, СБП, SberPay и T-Pay. Аутентификация через HTTP Basic Auth, идемпотентность через UUID.

Обязательные настройки

Все переменные

Методы оплаты

PayPear поддерживает 4 метода оплаты, доступных как sub-options в кабинете:
  • bank_card — банковские карты (Visa, Mastercard, Мир)
  • sbp — Система быстрых платежей
  • sberpay — SberPay (через приложение СберБанк Онлайн)
  • tpay — T-Pay (через приложение Т-Банка)

Webhook

В личном кабинете PayPear укажите: https://hooks.domain.com/paypear-webhook Webhook содержит поле signature в теле запроса (HMAC-SHA256). Поддерживаемые события: payment.confirmed, payment.canceled. PayPear повторяет отправку в течение 24 часов при получении не-200 ответа.

Статусы платежей


RollyPay

Платежи через RollyPay (rollypay.io) — платёжный шлюз с приёмом рублей и автоматической конвертацией в USDT. Поддержка СБП, карт и криптовалюты.

Обязательные настройки

Все переменные

Методы оплаты

RollyPay поддерживает 3 метода, доступных как sub-options:
  • sbp — Система быстрых платежей
  • card — Банковские карты
  • crypto — Криптовалюта
Если метод не указан, платёжная форма RollyPay покажет все доступные варианты.

Webhook

Webhook URL настраивается при создании кассы (terminal) в RollyPay. Укажите: https://hooks.domain.com/rollypay-webhook Подпись передаётся в header X-Signature (HMAC-SHA256 от timestamp.body), timestamp — в X-Timestamp. Повторные попытки: экспоненциальный backoff 30с×2^(n-1), максимум 8 попыток (~2 часа).

Особенности

  • Все платежи конвертируются в USDT по текущему курсу
  • Баланс кассы хранится в USDT
  • Каждый запрос требует уникальный X-Nonce (UUID), повторное использование в течение 10 минут запрещено
  • Поддерживаемые события: payment.paid, payment.canceled, payment.chargeback

Статусы платежей


AuraPay

Платежи через AuraPay (app.aurapay.tech) с поддержкой банковских карт и СБП. Аутентификация через API-ключ и ID кассы в заголовках.

Обязательные настройки

Все переменные

Методы оплаты

AuraPay поддерживает 2 метода оплаты, доступных как sub-options в кабинете:
  • card — банковские карты
  • sbp — Система быстрых платежей (СБП)
Если метод не указан, пользователь выбирает способ оплаты на платёжной форме AuraPay.

Webhook

Webhook URL указывается при создании инвойса (параметр callback_url) или в настройках кассы. Укажите: https://hooks.domain.com/aurapay-webhook Подпись передаётся в header X-SIGNATURE. Алгоритм: отсортировать ключи JSON по алфавиту, склеить все значения в одну строку, HMAC-SHA256 с секретным ключом #2. Повторные попытки: максимум 5 раз, до получения HTTP 200.

Статусы инвойсов


Overpay

Платежи через Overpay (api.overpay.io) с двойной аутентификацией: mTLS (клиентский P12 сертификат) + HTTP Basic Auth. Поддерживает банковские карты и СБП.

Обязательные настройки

Все переменные

Методы оплаты

Аутентификация

Overpay использует двойную аутентификацию:
  1. mTLS — клиентский P12 сертификат прикрепляется к каждому запросу к API. Файл сертификата должен быть доступен контейнеру по пути OVERPAY_P12_PATH
  2. HTTP Basic Auth — логин и пароль передаются в заголовке Authorization
При использовании Docker убедитесь, что файл P12 сертификата смонтирован в контейнер. Пример: volumes: - ./certs/client.p12:/app/certs/client.p12:ro

Webhook

В кабинете Overpay укажите: https://hooks.domain.com/overpay-webhook

Etoplatezhi

Etoplatezhi — российский платёжный шлюз paymentpage.etoplatezhi.ru с поддержкой карт и СБП. HMAC-SHA256 подпись запросов и webhook’ов.

Обязательные настройки

Все переменные

Webhook

URL: https://hooks.domain.com/etoplatezhi-webhook
Подпись: HMAC-SHA256, sticky terminal-status guard защищает от replay-атак.

Antilopay

Antilopay — российский эквайринг lk.antilopay.com через API v2. Использует RSA подпись (SHA256WithRSA, PKCS#1 v1.5) — отличается от большинства провайдеров. Поддерживает 3 sub-метода: Карта, СБП, SberPay.

Обязательные настройки

Все переменные

Webhook

URL: https://hooks.domain.com/antilopay-webhook
Подпись: SHA256WithRSA (PKCS#1 v1.5), проверяется публичным ключом. Заголовок: X-Apay-Callback.
Antilopay требует RSA-ключевую пару. Сгенерируйте 2048-битный ключ через openssl genrsa и base64-кодируйте оба ключа. Публичный ключ загрузите в кабинет Antilopay.

Jupiter (FPGate P2P)

Jupiter — платёжный шлюз app.juppiter.tech по спеке FPGate P2P v2.1. Эквайринг СБП через QR-код банковского приложения. HMAC-SHA256 подпись. Bedolaga — официальный партнёр Jupiter (подключение по кодовому слову БЕДОЛАГА).

Обязательные настройки

Все переменные

API Endpoints

  • POST /api/v2.1/p2p_payin — создание инвойса
  • POST /api/v2.1/p2p_status — статус инвойса
  • POST /api/v2.1/p2p_balance — баланс мерчанта

Webhook

URL: https://hooks.domain.com/jupiter-webhook
Подпись: HMAC-SHA256 от raw JSON body, поле signature в payload.
Sticky terminal-status guard — повторный success после cancelled/error логируется как ERROR.
📩 Менеджер: @k_juppiter

Donut (Donut P2P)

Donut — платёжная система gw.donut.business по спеке Donut P2P. P2P-оплата картой, СБП по номеру телефона и СБП QR. HMAC-SHA256 подпись. Bedolaga — официальный партнёр Donut.

Обязательные настройки

Все переменные

API Endpoints

  • POST /p2p_payin — создание инвойса
  • POST /p2p_status — статус инвойса
  • POST /p2p_balance — баланс мерчанта

Webhook

URL: https://hooks.domain.com/donut-webhook
Подпись: HMAC-SHA256 от raw JSON body, поле signature в payload.
Sticky terminal-status guard защищает от replay-атак.
📩 Менеджер: @donut_payment

Lava Business

Lava — российский эквайринг gate.lava.ru (Lava Business API). Поддержка карт и СБП через includeService фильтрацию. HMAC-SHA256 подпись. Раздельные ключи для запросов и webhook’ов.

Обязательные настройки

Все переменные

API Endpoints

  • POST /api/v2/invoice/create — создание инвойса
  • POST /api/v2/invoice/status — статус инвойса
  • POST /api/v2/invoice/services — доступные методы оплаты для shopId

Webhook

URL: https://hooks.domain.com/lava-webhook
Подпись: HMAC-SHA256 от raw bytes (не decoded string!), заголовок Authorization.
В отличие от других провайдеров, Lava имеет два секретных ключа: secret_key для подписи запросов и secret_key_2 для проверки webhook. Оба генерируются в личном кабинете Lava.
Lava ретраит webhook до 5 раз каждые 150 секунд при HTTP не-200. Бот всегда отдаёт 200 после успешной верификации подписи.

Apple In-App Purchase

Apple IAP — нативные consumable-покупки (пополнения баланса) через iOS App Store Mini App. Используется App Store Server API с JWT-аутентификацией (ES256, .p8 ключ) и App Store Server Notifications V2 для real-time событий (purchase, refund, revoke). Поддерживает Sandbox + Production окружения, refund handling с защитой от double-deduction, idempotency на уровне web_order_line_item_id, self-healing через reconciliation service.

Минимальная конфигурация

Все переменные

Ключевые (App Store Connect)

Приватный ключ (.p8)

Нужна одна из двух опций:

Окружение и webhook

Проверка подписей и сертификаты

Маппинг продуктов

Пример с топапами 100 / 300 / 500 / 1000 ₽:

Защита от abuse

Refund и revocation handling

При получении Apple Server Notification (REFUND, REVOKE, REFUND_REVERSED):
  1. Notification сохраняется в apple_notifications со статусом received (для дедупликации по payload_hash)
  2. Транзакция блокируется через SELECT FOR UPDATE на apple_transactions row
  3. Списание / возврат списания применяется к балансу пользователя
  4. Транзакция помечается revoked / refund_reversed с датой
  5. Idempotency: повторный webhook с тем же payload_hash игнорируется
  6. Если бэкенд был offline и webhook потерян — reconciliation service в фоне сверит состояние с App Store Server API и применит изменение

Reconciliation service

Фоновая таска проходит по apple_notifications со статусом failed (сетевые ошибки, race с user-запросом), запрашивает текущий статус через getTransactionInfo, выравнивает локальное состояние с Apple. Self-healing для пропущенных webhook’ов.

Idempotency

  • web_order_line_item_id — уникальный per billing-cycle идентификатор от Apple, UNIQUE constraint в БД (миграция 0076). Защищает от повторного зачисления одной и той же покупки
  • payload_hash нотификаций — SHA256 от signed payload, тоже UNIQUE. Дедуп Apple webhook’ов
  • app_account_token — UUID, который мы передаём Apple через appAccountToken параметр при инициации покупки в iOS-приложении. Apple возвращает его в transaction, мы матчим purchase к нашему юзеру без передачи telegram_id / email на сторону Apple

Создание App Store Connect API ключа

  1. App Store Connect → Users and Access → Integrations → App Store Connect API
  2. Выберите вкладку In-App Purchase (не General!)
  3. Нажмите + → Name → Generate
  4. Скачайте .p8 файл (доступен только один раз, потом — генерация заново)
  5. Скопируйте Issuer ID (сверху страницы) и Key ID (рядом с ключом)
  6. Положите .p8 файл в безопасное место и пропишите путь в APPLE_IAP_PRIVATE_KEY_PATH

Регистрация webhook в App Store Connect

  1. App Store Connect → ваше приложение → App Information → App Store Server Notifications
  2. Production URL: https://your-domain.example + APPLE_IAP_WEBHOOK_PATH
  3. Sandbox URL: тот же путь, но на тестовом доменe (если есть отдельный)
  4. Version: Version 2 Notifications (Version 1 не поддерживается)
Apple IAP отображается только в Mini App на iOS. На Android и веб-кабинете кнопка не появляется, потому что Apple Review Guidelines 3.1.1 запрещают принимать платежи за digital goods вне IAP только в iOS-приложениях.
  • Bundle ID в APPLE_IAP_BUNDLE_ID должен точно совпадать с реальным iOS-приложением — иначе все signed transactions будут отклонены проверкой bundleId
  • Никогда не зачисляйте цену, переданную клиентом — только из APPLE_IAP_PRODUCTS. Клиент можно подменить
  • Сертификаты Apple Root CA из APPLE_IAP_ROOT_CERTS_PATHS — это основа security. Без них JWS-подписи не проверяются и backend будет принимать любые поддельные транзакции
Для тестов используйте Sandbox-окружение с sandbox Apple ID. TestFlight-покупки тоже идут через Sandbox даже если приложение в проде.

Безопасность webhook

Все платёжные webhook проходят проверку подлинности:
Если для провайдера настроен секретный ключ, webhook без подписи будут отклонены. Убедитесь, что секретные ключи в .env совпадают с настройками в кабинете провайдера.

Тестовые платежи

CloudPayments и YooKassa проверяют флаг test_mode в webhook. В production-окружении тестовые платежи автоматически отклоняются, если соответствующий *_TEST_MODE не включён явно.

Активация провайдера

Каждый провайдер считается включённым только при выполнении двух условий:
  1. Флаг *_ENABLED=true
  2. Заполнены все обязательные поля (ключи, токены, ID)
Если включить флаг, но не заполнить обязательные поля, провайдер не активируется и не появится в списке способов оплаты.

Health-check

Для проверки состояния webhook доступен эндпоинт:
Возвращает JSON со статусом каждого провайдера:

Настройка webhook через reverse proxy

Все webhook обрабатываются единым FastAPI-сервером на порту 8080. Рекомендуемая настройка через Caddy/Nginx:
В .env укажите:
Этот URL используется для формирования callback URL (Heleket, Platega) и return URL (YooKassa, CloudPayments).