8080.
Общая архитектура
Все платежи проходят через баланс: пользователь пополняет баланс любым доступным способом, затем покупает подписку с баланса. Единственное исключение —Telegram Stars и простая подписка (SIMPLE_SUBSCRIPTION_ENABLED), которые могут проводить оплату напрямую, минуя баланс.
Приоритет отображения
Способы оплаты отображаются в фиксированном порядке:- Telegram Stars
- YooKassa СБП (если
YOOKASSA_SBP_ENABLED=true) - YooKassa карты
- Tribute
- MulenPay
- WATA
- PayPalych (Pal24)
- CryptoBot
- Heleket
- Platega
- CloudPayments
- Freekassa
- Kassa AI
- RioPay
- SeverPay
- PayPear
- RollyPay
- AuraPay
- Overpay
- Etoplatezhi
- Antilopay
- Jupiter
- Donut
- Lava
- Apple In-App Purchase (только iOS, отображается в Mini App)
- Через поддержку (всегда последний)
Поддерживаемые провайдеры
Все 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): если у пользователя недостаточно баланса для продления, бот автоматически списывает нужную сумму с сохранённой карты - Пользователь может управлять сохранёнными картами (удалять ненужные)
Фискализация (Нало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 — Криптовалюта
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 — Система быстрых платежей (СБП)
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 использует двойную аутентификацию:- mTLS — клиентский P12 сертификат прикрепляется к каждому запросу к API. Файл сертификата должен быть доступен контейнеру по пути
OVERPAY_P12_PATH - HTTP Basic Auth — логин и пароль передаются в заголовке
Authorization
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.
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.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):
- Notification сохраняется в
apple_notificationsсо статусомreceived(для дедупликации поpayload_hash) - Транзакция блокируется через
SELECT FOR UPDATEнаapple_transactionsrow - Списание / возврат списания применяется к балансу пользователя
- Транзакция помечается
revoked/refund_reversedс датой - Idempotency: повторный webhook с тем же
payload_hashигнорируется - Если бэкенд был 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,UNIQUEconstraint в БД (миграция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 ключа
- App Store Connect → Users and Access → Integrations → App Store Connect API
- Выберите вкладку In-App Purchase (не General!)
- Нажмите + → Name → Generate
- Скачайте
.p8файл (доступен только один раз, потом — генерация заново) - Скопируйте Issuer ID (сверху страницы) и Key ID (рядом с ключом)
- Положите
.p8файл в безопасное место и пропишите путь вAPPLE_IAP_PRIVATE_KEY_PATH
Регистрация webhook в App Store Connect
- App Store Connect → ваше приложение → App Information → App Store Server Notifications
- Production URL:
https://your-domain.example+APPLE_IAP_WEBHOOK_PATH - Sandbox URL: тот же путь, но на тестовом доменe (если есть отдельный)
- Version: Version 2 Notifications (Version 1 не поддерживается)
Apple IAP отображается только в Mini App на iOS. На Android и веб-кабинете кнопка не появляется, потому что Apple Review Guidelines 3.1.1 запрещают принимать платежи за digital goods вне IAP только в iOS-приложениях.
Безопасность webhook
Все платёжные webhook проходят проверку подлинности:Тестовые платежи
CloudPayments и YooKassa проверяют флагtest_mode в webhook. В production-окружении тестовые платежи автоматически отклоняются, если соответствующий *_TEST_MODE не включён явно.
Активация провайдера
Каждый провайдер считается включённым только при выполнении двух условий:- Флаг
*_ENABLED=true - Заполнены все обязательные поля (ключи, токены, ID)
Health-check
Для проверки состояния webhook доступен эндпоинт:Настройка webhook через reverse proxy
Все webhook обрабатываются единым FastAPI-сервером на порту8080. Рекомендуемая настройка через Caddy/Nginx:
.env укажите:
