Телеграм бот с приёмом платежей CryptoBot закрывает задачу, которая раньше требовала эквайринга и юрлица: продавать цифровые товары, подписки или доступ к контенту за криптовалюту прямо в чате, без кассы и расчётного счёта. Я подключал эту связку в нескольких проектах на aiogram - ниже весь путь от регистрации приложения до обработки вебхука, с реальными граблями, на которые натыкался.
Как работает приём платежей CryptoBot в Telegram-боте
CryptoBot - официальный сервис Telegram для p2p-платежей и эскроу, у него есть открытое API CryptoPay для сторонних ботов. Логика простая: ваш бот через API создаёт инвойс (счёт на оплату), пользователь получает ссылку вида t.me/CryptoBot?start=invoice_XXXX, оплачивает в USDT, TON, BTC, ETH или ещё десятке активов, а CryptoBot присылает вашему серверу уведомление об оплате.
Важный нюанс: деньги идут не на ваш телеграм-аккаунт напрямую, а в приложение CryptoPay, привязанное к вашему боту в @CryptoBot. Оттуда их можно вывести на биржу или другой кошелёк. Комиссию за сам факт приёма CryptoBot не берёт - платите только сетевую комиссию при выводе, она зависит от актива и в среднем ощутимо ниже, чем 3-5% у классического эквайринга.
Получаем API-токен CryptoPay и настраиваем приложение
Токен выдаётся не в BotFather, а в отдельном боте @CryptoBot (или @CryptoTestnetBot для тестовой сети):
- Открываете @CryptoBot → Crypto Pay → Create App
- Привязываете приложение к вашему боту (нужен токен вашего бота из BotFather)
- Получаете API Token - его нужно хранить так же, как токен самого бота, никогда не коммитить в репозиторий
Для отладки обязательно заводите отдельное приложение в @CryptoTestnetBot - там выдают тестовые USDT и TON, и можно гонять весь сценарий оплаты без реальных денег. Я всегда начинаю разработку именно с testnet-токена и переключаю на боевой только перед релизом.
Создание счёта на оплату через CryptoPay API
Для Python есть неофициальная, но рабочая обёртка над API - aiocryptopay, она хорошо ложится на aiogram-ботов, которые я обычно и собираю под такие интеграции.
pip install aiogram aiocryptopay python-dotenv
Создание инвойса на 5 USDT с коротким описанием и ссылкой для возврата в бота после оплаты:
from aiocryptopay import AioCryptoPay, Networks
crypto = AioCryptoPay(token=CRYPTO_PAY_TOKEN, network=Networks.MAIN_NET)
async def create_invoice(amount: float, asset: str, payload: str):
invoice = await crypto.create_invoice(
asset=asset,
amount=amount,
description="Оплата подписки на 30 дней",
payload=payload,
paid_btn_name="callback",
paid_btn_url="https://t.me/your_bot",
)
return invoice.bot_invoice_url, invoice.invoice_id
Полученную ссылку bot_invoice_url отдаёте пользователю инлайн-кнопкой. В payload кладите ID пользователя и ID заказа в вашей базе - по нему потом сопоставляете оплату с конкретной покупкой. Это тот же принцип, что и в интеграциях WooCommerce с Т‑Bank: платёжный шлюз ничего не знает про вашу бизнес-логику, всю привязку заказа к оплате делаете сами через технический идентификатор.
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Обработка webhook и проверка статуса платежа
Есть два варианта узнать, что счёт оплачен: webhook от CryptoPay или периодический опрос статуса. Webhook быстрее и правильнее для продакшена - CryptoPay шлёт POST-запрос на ваш эндпоинт сразу после оплаты.
from aiohttp import web
import hmac, hashlib, json
async def cryptopay_webhook(request: web.Request):
body = await request.read()
signature = request.headers.get("crypto-pay-api-signature")
secret = hashlib.sha256(CRYPTO_PAY_TOKEN.encode()).digest()
check = hmac.new(secret, body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(check, signature):
return web.Response(status=403)
data = json.loads(body)
if data["update_type"] == "invoice_paid":
payload = data["payload"]["payload"]
# тут отмечаем заказ оплаченным в своей БД и выдаём доступ пользователю
return web.Response(status=200)
Проверка подписи - не формальность, а обязательный шаг: без неё любой человек, узнавший URL вашего эндпоинта, может подделать запрос об оплате и получить доступ бесплатно. Я на первом проекте эту проверку пропустил на этапе MVP и потом полдня разбирался, почему в логах появляются оплаты, которых не было в CryptoPay.
Если поднимать полноценный HTTPS-сервер под вебхук пока не хочется, можно опрашивать crypto.get_invoices(invoice_ids=[invoice_id]) раз в 5-10 секунд после создания счёта - рабочий вариант для MVP, но при десятках одновременных оплат он упирается в лимиты API и создаёт лишнюю нагрузку.
Тестирование в testnet и типичные ошибки
Прежде чем переключаться на боевой токен, я прогоняю три сценария: успешная оплата, отменённый счёт (invoice истёк - по умолчанию через час) и повторная оплата уже закрытого инвойса. Частые проблемы, с которыми сталкивался:
- Забытый expires_in - по умолчанию счёт живёт час, для разовых покупок стоит явно сократить до 15-20 минут, иначе в базе копятся зависшие неоплаченные заказы
- Несовпадение сети - тестовый и боевой токены нельзя перепутывать, invoice из testnet не отображается в боевом CryptoBot и наоборот
- Вебхук на localhost - CryptoPay не достучится до вашего компьютера, для локальной отладки нужен ngrok или деплой на сервер с публичным IP
- Отсутствие идемпотентности - если webhook придёт дважды (а он может), нужно проверять, не выдан ли доступ по этому payload уже раньше
CryptoBot vs классический эквайринг: что выбрать
| Критерий | CryptoBot | Эквайринг (Т‑Bank, ЮKassa) |
|---|---|---|
| Юрлицо/ИП | не требуется | обязательно |
| Валюта | крипто (USDT, TON, BTC и др.) | рубли |
| Комиссия | 0% на приём, сетевая на вывод | обычно 2-4% на рынке |
| Скорость подключения | 10-15 минут | от 1 до нескольких дней на модерацию |
| Чеки 54-ФЗ | не формирует | формирует автоматически |
| Аудитория | только пользователи с криптокошельком | любая банковская карта |
Выбор в пользу CryptoBot логичен для цифровых продуктов, подписок, доступа к закрытым каналам и аудитории, которая уже привычна к крипте - например, IT- и трейдинг-сообщества. Для интернет-магазина с физическим товаром и обычной аудиторией я бы всё равно советовал классический эквайринг или связку с СДЭК для доставки - там 54-ФЗ и привычная оплата картой закрывают вопрос доверия покупателя.
Сколько стоит внедрение и когда звать разработчика
Сама интеграция CryptoPay API технически несложная, но требует аккуратной работы с состояниями заказов, вебхуком на отдельном эндпоинте и обработкой ошибок сети - без этого бот рано или поздно выдаст доступ без оплаты или, наоборот, потеряет оплаченный заказ. Если нужен бот с нуля под приём криптоплатежей, разработка обходится от 30 000 ₽ - сюда входит логика заказов, интеграция CryptoPay, вебхук и деплой на сервер.
Если бот уже есть и нужно только добавить приём платежей в существующую логику - это ближе к точечной доработке, а не разработке с нуля, стоимость оценивается отдельно после разбора текущего кода. Готовые шаблоны ботов с оплатой через CryptoBot и другими способами можно посмотреть в библиотеке готовых скриптов - иногда быстрее адаптировать рабочий каркас, чем писать интеграцию с нуля.
Отдельно у меня был кейс, где оплату через CryptoBot завязывали на n8n: вебхук CryptoPay падал в n8n, оттуда данные уходили в Google Таблицу и уведомление менеджеру в отдельный чат - без единой строчки кода на стороне клиента, только цепочка нод. Такой вариант оправдан, если нужно быстро связать оплату с CRM или таблицей учёта, а полноценный бэкенд разворачивать пока рано.
Автоматизация в мессенджере
Telegram-бот / Mini App
от 30 000 ₽
Подробнее →Частые вопросы
Нужно ли открывать ИП для приёма платежей через CryptoBot?
Нет, регистрация приложения в CryptoPay не требует юрлица или ИП - это одно из главных отличий от банковского эквайринга. Но учитывайте, что вопросы налогообложения дохода от такой деятельности CryptoBot за вас не решает, это остаётся на стороне владельца бота.
Можно ли принимать оплату в рублях, а не в криптовалюте?
CryptoPay работает только с криптоактивами - USDT, TON, BTC, ETH, LTC и ещё несколькими. Если нужна оплата в рублях, придётся отдельно подключать классический эквайринг или платёжный агрегатор, CryptoBot эту задачу не закрывает.
Что будет, если пользователь оплатит просроченный счёт?
CryptoPay не даст оплатить invoice после истечения срока действия - по умолчанию это час с момента создания, но значение настраивается через параметр expires_in при создании счёта. Пользователю нужно будет запросить новый счёт заново.
Как быстро деньги доходят до кошелька после оплаты?
Внутри CryptoPay зачисление на баланс приложения происходит почти мгновенно, в пределах нескольких секунд после подтверждения транзакции в блокчейне. Вывод на внешний кошелёк или биржу зависит от скорости выбранной сети - TON и BSC обычно быстрее, чем BTC.