CryptoBot
CryptoBot — приём криптовалюты (USDT, TON, BTC) через Crypto Pay API (pay.crypt.bot). Бот выставляет фиатный инвойс в рублях (currency_type: fiat): CryptoBot сам считает крипто-эквивалент по своему курсу, юзер платит ровно рублёвую цену тарифа — никакого пересчёта курса на вашей стороне. Юзеру уходит ссылка на инвойс прямо в Telegram (bot_invoice_url / mini_app_invoice_url).
Валюта шлюза — RUB; в payload инвойса бот кладёт свой payment_id, по нему вебхук привязывается к платежу.
Что понадобится
Приложение Crypto Pay в боте @CryptoBot и его API-токен — он ходит в заголовке Crypto-Pay-API-Token. Там же, в настройках приложения Crypto Pay, задаётся URL вебхука.
Настройка в кабинете
| Поле | Что это | Обязательное |
|---|---|---|
api_token | токен приложения Crypto Pay; хранится в БД в зашифрованном виде | да |
Включите тумблер активности провайдера и нажмите Тест — бот дёрнет getMe и getBalance и покажет имя приложения и доступный баланс USDT. Дополнительно у провайдера настраиваются отображаемое имя и комиссия для статистики.
Вебхук
https://ваш-домен/api/v1/payments/cryptobotУкажите этот URL в настройках приложения Crypto Pay. Подпись приходит в заголовке crypto-pay-api-signature: HMAC-SHA256 по телу запроса с ключом SHA256(api_token). Бот сначала проверяет подпись по сырому телу, а если прокси по дороге переформатировал JSON — повторяет проверку по компактной пересериализации тела (оба варианта экранирования юникода). Схема обкатана на реальном поведении прокси, так что CDN перед ботом вебхуки не ломает. Несошедшаяся подпись → HTTP 403.
Зачисляет платёж только событие update_type: invoice_paid. Остальные обновления проходят проверку подписи и игнорируются — статус платежа не меняется.
Особенности
- Инвойс живёт 1 час (
expires_in: 3600) — потом CryptoBot его закрывает, и реконсилятор помечает платёж отменённым. - Возвраты по API, рекурренты и сохранённые карты не поддерживаются — возврат делаете переводом в CryptoBot руками, в боте фиксируете результат: /payments/refunds.
- Шлюз умеет опрос статуса (
getInvoices):paid→ зачисление,expired→ отмена, активный инвойс не трогается. - Описание платежа обрезается до 1024 символов.
Платёж прошёл, а подписки нет?
Реконсилятор опрашивает CryptoBot каждые 5 минут и сам зачисляет зависшие оплаты. Как это работает — /payments/webhooks.
