Приём платежей — то, что превращает чат-бота из «говорящей справки» в полноценный канал продаж. В этом лонгриде разобрано, как создать бот оплаты: от выбора платёжной системы и настройки вебхуков до тестирования и защиты ставки конверсии. Всё по шагам — на примере самого популярного стека: Telegram Bot API + провайдер платежей.

91 %
покупок в мессенджерах завершается, если оплата происходит внутри чата, без перехода на сайт
3 шага
от клика на кнопку «Оплатить» до подтверждения — именно так работает Pre-Checkout Invoice Flow
1 день
нужен на настройку платёжного бота на готовом SDK — без юридических лабиринтов

Как устроено оплатное звено бота

Прежде чем писать код, важно понять механику. Пользователь никогда не вводит данные карты в чате — их обрабатывает защищённая страница провайдера. Бот лишь выставляет счёт и получает подтверждение.

1
Пользователь нажимает «Оплатить»

Бот вызывает метод sendInvoice: название товара, описание, сумма, валюта и payload (внутренний идентификатор заказа).

2
Клиент подтверждает стоимость доставки

Если товар физический, платформа присылает shipping_query. Бот отвечает вариантами доставки и итоговой ценой.

3
Pre-Checkout — последний рубеж

Перед списанием бот получает pre_checkout_query и обязан ответить answerPreCheckoutQuery в течение 10 секунд успехом или отказом. Это момент, когда стоит проверить наличие товара и легитимность заказа.

✓
Деньги списаны

Бот получает сообщение successful_payment — фиксируем заказ, выдаём товар или файл, шлём чек.

Выбор платёжного провайдера

У Telegram Bot Payments семь зарегистрированных провайдеров для России и СНГ, каждый со своей комиссией, скоростью вывода средств и требованиями к документам. Сравнение ключевых условий:

Критерий YooKassa Robokassa Crypto Bot
Комиссия за операцию 3,5 % (карты) 3–4 % 1 %
Вывод средств на расчётный счёт 1–2 рабочих дня 1 рабочий день мгновенно
Требуется ИП/ООО и договор да да нет
Фискализация чеков (54-ФЗ) встроенная встроенная не применима
Поддержка возвратов частичные и полные полные ручная

Практическая часть: код бота

Ниже — минимальный рабочий пример на Python с библиотекой aiogram 3. Переключайте вкладки, чтобы посмотреть, что происходит на каждом этапе.

1 · Выставление счёта
2 · Pre-Checkout
3 · Фиксация оплаты
from aiogram import Bot, Dispatcher, F from aiogram.types import Message, LabeledPrice, PreCheckoutQuery TOKEN = "123456:ABC…" PAY_TOKEN = "390540012:LIVE:xxxxx" # токен провайдера из BotFather PRICE = 499000 # сумма в минимальных единицах (4990.00 ₽) @dp.message(F.text == "/buy") async def send_invoice(m: Message): await m.answer_invoice( title="Доступ к курсу", description="3 модуля, 24 видеоурока", payload="course_basic_001", # вернётся в успешном платеже provider_token=PAY_TOKEN, currency="RUB", prices=[LabeledPrice(label="Курс", amount=PRICE)], )
@dp.pre_checkout_query() async def checkout(q: PreCheckoutQuery): # Проверяем: есть ли товар на складе, не фрод ли это if await stock_check(q.invoice_payload): await q.answer(ok=True) else: await q.answer( ok=False, error_message="Товара временно нет. Деньги не будут списаны." ) # ВАЖНО: ответ должен прийти за < 10 секунд, # иначе оплата отменится автоматически
@dp.message(F.successful_payment) async def success(m: Message): sp = m.successful_payment # sp.total_amount, sp.currency, sp.invoice_payload await save_order( user_id=m.from_user.id, payload=sp.invoice_payload, charge_id=sp.provider_payment_charge_id # нужен для возврата ) await m.answer( f"✅ Оплата прошла: {sp.total_amount/100:.2f} {sp.currency}\n" f"Ссылка на доступ пришла ниже 👇" )
Пользователь видит красивую карточку счёта внутри чата. Никаких переходов на внешний сайт — конверсия максимальна.
Pre-Checkout — это «сердце» безопасности: последняя возможность отменить сделку до списания. Проверяйте остатки и подделку payload именно здесь.
provider_payment_charge_id храните обязательно: по этому идентификатору оформляется возврат денег через метод refundStarPayment.

Тестирование без списания денег

У каждого провайдера есть тестовый режим. Для YooKassa BotFather выдаёт ключ 390540012:TEST:…. Проверяйте граничные сценарии заранее:

Успешная оплата

Карта 1111 1111 1111 1026. Проверяем получение successful_payment и выдачу товара.

Отказ провайдера

Карта с отключённой тарификацией. Бот обязан показать понятное сообщение, а не «зависнуть» на спиннере.

Таймаут Pre-Checkout

Искусственно тормозим обработчик на 11+ секунд. Смотрим, отменяется ли сделка и нет ли рассинхрона с базой заказов.

Дубль платежа

Дважды эмулируем successful_payment с одним charge_id. Идемпотентность — заказ не должен создаться дважды.

Чек-лист безопасности

  • ✓payload — только строка-идентификатор. Никаких цен и сумм там: клиент может подменить содержимое.
  • ✓Сверяйте total_amount с суммой заказа в базе перед answerPreCheckoutQuery — защита от оплаты «на рубль».
  • ✓Вебхуки принимайте только с официальных подсетей Telegram (149.154.160.0/20 и 91.108.4.0/22) и проверяйте secret_token в заголовке.
  • ✓Храните charge_id и логи всех транзакций не менее 3 месяцев — при чарджбэках это единственное доказательство.

Три ошибки, которые убивают конверсию на старте

1️⃣ Переход на внешний сайт для оплаты. Каждый редирект теряет до 40 % потребителей — use native Invoice API. 2️⃣ Отсутствие кнопки «Вернуть деньги». Даже если она не нужна каждый день, параноида клиента перед первой оплатой снимается именно ею. 3️⃣ Отказ без объяснения причины. В answerPreCheckoutQuery всегда указывайте внятный error_message — пустой отказ вызывает поддержку и негатив.

Главный принцип

Бот оплаты — не про «приём денег», а про доверие внутри чата. Чем меньше шагов, чем ближе оплата к моменту желания, тем выше выручка. Отладьте Pre-Checkout, покажите чек и кнопку возврата — и платёжный бот станет одним из самых прибыльных каналов в воронке продаж.