Skip to content

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.

MIT License · сделано для тех, кто продаёт VPN, а не настраивает ботов