Принять оплату в Telegram-боте можно тремя принципиально разными путями: через Telegram Stars, через российские эквайринги вроде ЮKassa или Тинькофф, или через СБП напрямую. У каждого варианта своя логика, комиссия и юридические ограничения. Выбор сильно влияет на воронку: один лишний клик на оплате убивает 10–20% конверсии.
Способы приёма оплаты в Telegram-боте
Перед сравнением провайдеров — обзор всех принципиально разных каналов оплаты, которые можно встроить в бот в 2026 году:
- Telegram Payments через провайдер — нативная встроенная форма оплаты, кнопка «Оплатить» прямо в карточке бота, валюта реальная (RUB/USD/EUR). Платёж проходит через подключённый эквайринг (ЮKassa, Тинькофф, Stripe), Telegram выступает только UI-слоем.
- Telegram Stars (с 2024) — внутренняя валюта Telegram (XTR). Подходит только для цифровых товаров и услуг. Деньги собираются Telegram, выплачиваются через Fragment.
- Внешний эквайринг через ссылку — бот отдаёт ссылку на платёжную страницу провайдера, пользователь уходит из Telegram в браузер, возвращается через webhook. UX хуже, но обходит ограничения BotFather по списку провайдеров.
- СБП через ссылку или QR — отдельный сценарий: либо через провайдера, либо напрямую через банк-партнёр с генерацией QR-кода.
- Mini App с собственной формой оплаты — внутри Mini App открывается чекаут, который вы полностью контролируете: можно сочетать карту, СБП, СберПэй, рассрочку, промокоды.
Сравнительная таблица провайдеров для РФ в 2026
| Провайдер | Комиссия | Мин. платёж | СБП | В BotFather | Подходит для | Особенности |
|---|---|---|---|---|---|---|
| ЮKassa (Сбер) | 2.8–3.5% | от 1 ₽ | да | да | универсально | рекуррент через карты, фискализация из коробки |
| Тинькофф Касса | 2.5–3.2% | от 1 ₽ | да | да | средний и крупный бизнес | удобный кабинет, выплата T+1 |
| СберПэй | 1.0% СБП / 2.5% карты | от 1 ₽ | да | нет (только ссылка) | низкая комиссия, СБП-фокус | требует расчётный счёт в Сбере |
| Робокасса | 3–5% | от 1 ₽ | да | да | микро-бизнес, ИП | поддержка SMS-оплаты, простое подключение |
| PayMaster | 2.5–3% | от 10 ₽ | да | да | малый бизнес, NCO | гибкая фискализация |
| Stripe | 2.9% + $0.30 | от $0.50 | нет | да | нерезиденты РФ, B2B-SaaS | для иностранных карт и валют |
| Telegram Stars | ~30% (доля Telegram) | 1 XTR | нет | встроено | цифровые товары, подписки в Mini App | XTR = ~$0.013, выплата через Fragment |
Выбор провайдера определяет не столько комиссию, сколько скорость подключения и набор фискальных опций. Для 90% рублёвых проектов оптимален связка ЮKassa + СБП.
Подключение ЮKassa в BotFather пошагово
- Регистрация в ЮKassa. Зарегистрироваться как ИП/ООО в
yookassa.ru, пройти KYC, получитьshopIdи секретный ключ в кабинете. - Создание кассы для Telegram. В кабинете ЮKassa: «Кассы» → «Telegram бот» → «Подключить». ЮKassa выдаст два токена: тестовый (
TEST:...) и продакшн (LIVE:...). - Тестовая среда. Сначала привязывайте тестовый токен — ЮKassa предоставляет тестовые карты вида
5555 5555 5555 4444для отладки полного цикла без списаний. - Привязка в BotFather.
/mybots→ выбрать бота → «Payments» → «Edit Payment Provider» → «YooKassa» → вставить токен. Telegram сразу проверит токен запросом к API провайдера. - Продакшн-переключение. После тестов меняете токен на
LIVE:.... Перезапускать бота не нужно —provider_tokenпередаётся в каждомsendInvoiceотдельно.
Код: отправка инвойса (sendInvoice)
Полный пример на Python с aiogram 3:
from aiogram.types import LabeledPrice
await bot.send_invoice(
chat_id=user_id,
title="Подписка Pro на месяц",
description="Доступ ко всем функциям бота на 30 дней",
payload="sub_pro_30d:user_12345", # своя строка для идентификации заказа на стороне сервера
provider_token=YUKASSA_TOKEN,
currency="RUB",
prices=[LabeledPrice(label="Подписка Pro", amount=49900)], # копейки!
need_email=True,
send_email_to_provider=True, # для чека ЮKassa по 54-ФЗ
provider_data='{"receipt": {...}}', # фискализация (см. ниже)
)
Ключевые моменты:
amountвсегда в минимальных единицах валюты (копейки для RUB, центы для USD). 49900 = 499 рублей.payload— ваш внутренний идентификатор заказа. По нему позже найдёте платёж в БД приsuccessful_payment. Не передавайте сюда чувствительные данные — payload видит пользователь через DevTools в Web-клиенте.need_email=True+send_email_to_provider=True— обязательно для онлайн-чека: ЮKassa отправит чек на почту покупателя.
Обработка pre_checkout_query
Перед списанием Telegram спрашивает у бота: «можно проводить платёж?» Бот должен ответить за 10 секунд, иначе Telegram автоматически отклонит платёж.
@dp.pre_checkout_query()
async def process_pre_checkout(query: PreCheckoutQuery):
# Здесь проверки: товар ещё доступен, цена не изменилась, лимиты пользователя
order_id = query.invoice_payload
if not is_order_valid(order_id):
await query.answer(ok=False, error_message="Заказ устарел, оформите снова")
return
if query.total_amount != expected_amount(order_id):
await query.answer(ok=False, error_message="Цена изменилась")
return
await query.answer(ok=True)
Это последняя точка, где вы можете отказать в списании без ошибки. После ok=True Telegram проводит платёж через провайдера и присылает successful_payment.
Обработка successful_payment
После успешной оплаты Telegram присылает сообщение с типом successful_payment — это сигнал для активации услуги:
@dp.message(F.successful_payment)
async def process_payment(message: Message):
sp = message.successful_payment
order_id = sp.invoice_payload
total = sp.total_amount # в копейках
charge_id = sp.telegram_payment_charge_id # уникален для дедупликации
provider_charge_id = sp.provider_payment_charge_id # ID на стороне ЮKassa
# Дедуп: если этот charge_id уже обработан — выходим
if await payment_already_processed(charge_id):
return
await activate_subscription(order_id, charge_id, provider_charge_id)
await message.answer(f"Оплата прошла. Подписка активна до {expire_date}.")
Активацию услуги делайте после записи факта платежа в БД, не до. Иначе при падении сервера между активацией и записью получите услугу без оплаты в учёте.
Фискализация по 54-ФЗ
Для всех платежей физлицам в РФ обязателен онлайн-чек через ОФД. ЮKassa, Тинькофф и большинство российских провайдеров формируют чек автоматически, если в provider_data передать секцию receipt:
{
"receipt": {
"items": [{
"description": "Подписка Pro",
"quantity": "1.00",
"amount": {"value": "499.00", "currency": "RUB"},
"vat_code": 1,
"payment_subject": "service",
"payment_mode": "full_prepayment"
}],
"tax_system_code": 2
}
}
Что значат поля:
vat_code— НДС:1без НДС,2НДС 0%,3НДС 10%,4НДС 20%.payment_subject— предмет расчёта:commodity,service,payment,intellectual_activity.payment_mode— способ:full_prepayment(полная предоплата),full_payment(полный расчёт).tax_system_code— система налогообложения (1=ОСН, 2=УСН доходы, 3=УСН доходы-расходы, 5=ЕСХН, 6=ПСН).
Если работаете через свою кассу (Атол.Онлайн, Бизнес.Ру, ferma.ofd.ru) — отдельная интеграция с фискальным накопителем по протоколу ФФД 1.2.
СБП в боте: 2 сценария
Через провайдер. ЮKassa или Тинькофф формируют СБП-ссылку вида bank100000000111 или QR-код. Пользователь нажимает «Оплатить» — открывается Mini App с QR, либо прямой переход в его банковское приложение.
# В sendInvoice достаточно передать prices в RUB —
# выбор СБП vs карта произойдёт на стороне формы провайдера
await bot.send_invoice(..., currency="RUB", prices=[...])
Прямой СБП без провайдера. Для самозанятых и микро-бизнеса можно использовать сервисы типа qr.nspk.ru или собственный СБП-агрегатор (Точка, СберБизнес). Бот генерирует ссылку или картинку с QR, отправляет в чат. Минусы: нет автоматического подтверждения оплаты в Telegram — нужен отдельный webhook от банка и логика сверки сумм.
Telegram Stars: внутренняя валюта
Stars (XTR) появились в 2024 году и обязательны для оплаты цифровых товаров в Mini App по правилам Apple/Google. Курс плавающий, ориентир: 1 XTR ≈ $0.013, 100 XTR ≈ 1 USD. Telegram забирает ~30% (доля платформы и сторов).
Подключение проще некуда — провайдер не нужен:
await bot.send_invoice(
chat_id=user_id,
title="Премиум-доступ на месяц",
description="Расширенный функционал бота",
payload="premium_30d:user_12345",
provider_token="", # пустой для Stars!
currency="XTR", # XTR = Stars
prices=[LabeledPrice(label="Премиум", amount=100)], # 100 звёзд
)
Что нельзя через Stars: физические товары, услуги с офлайн-поставкой (доставка, такси, ремонт), вывод в фиат напрямую (только через Fragment с задержкой). Telegram банит ботов за нарушения.
Рекуррентные платежи и подписки
Telegram не имеет нативного механизма подписок — successful_payment срабатывает один раз. Подписку реализуют сами:
- Сохранение карты. При первом платеже передаёте провайдеру флаг сохранения метода: ЮKassa —
save_payment_method: true, Тинькофф —Recurrent: Y. Провайдер возвращаетpayment_method_id(токен карты). - Списание по cron. Каждый месяц/год по расписанию создаёте платёж через API провайдера:
POST https://api.yookassa.ru/v3/payments Authorization: Basic <shopId:secret> Idempotence-Key: <uuid> { "amount": {"value": "499.00", "currency": "RUB"}, "payment_method_id": "2c85b4d3-000f-5000-9000-145f6df21d6f", "capture": true, "description": "Продление подписки Pro" } - Успех. Если статус
succeeded— продлеваете подписку в БД, отправляете уведомление в бот. - Неудача. Если
canceled(недостаточно средств, истёк срок карты) — даёте grace-period 3 дня, отправляете напоминание с кнопкой обновить карту через новыйsendInvoiceсsave_payment_method.
Отдельно нужны оферта на рекуррент и явное согласие пользователя (галочка перед первой оплатой).
Возвраты через API провайдера
Возврат — через API провайдера, не через Telegram. Пример полного возврата ЮKassa:
import requests
from uuid import uuid4
resp = requests.post(
"https://api.yookassa.ru/v3/refunds",
auth=(SHOP_ID, SECRET_KEY),
headers={"Idempotence-Key": str(uuid4())},
json={
"amount": {"value": "499.00", "currency": "RUB"},
"payment_id": payment_id,
},
)
Частичный возврат — указываете меньшую сумму. Чарджбеки (claim'ы от банка) разбираются через переписку с банком и провайдером, обычно 30–45 дней. Срок добровольного возврата по 26-ФЗ «О защите прав потребителей» — 10 дней на банковский счёт после заявления покупателя.
При возврате провайдер автоматически выбьет чек коррекции в ОФД (если был передан receipt при платеже).
Идемпотентность и защита от двойных списаний
Три уровня защиты от дублей:
Idempotence-Keyв API. ЮKassa и Тинькофф требуют уникальный UUID в заголовке для всех POST. Повторный запрос с тем же ключом вернёт исходный результат, не создаст второй платёж.- Уникальный
payloadинвойса. Включайте в payload идентификатор заказа + временной слот:sub_pro_30d:user_12345:2026-04-02T10:00. Если придёт второйsuccessful_paymentс тем же payload — отбрасывайте. - Дедуп по
telegram_payment_charge_id. Это глобально уникальный ID платежа в Telegram. Перед активацией услуги:
Если есть — повтор, выходим. Иначе записываем и активируем в одной транзакции.SELECT 1 FROM payments WHERE telegram_charge_id = $1;
Юр. оформление: оферта и согласие на оплату
Минимальный пакет документов для приёма платежей в боте:
- Публичная оферта на оказание услуг — отдельная страница на сайте, ссылка обязательна перед
sendInvoice. - Политика обработки персональных данных по 152-ФЗ.
- Согласие на рекуррентные списания — отдельное согласие, если есть подписка, с явным упоминанием суммы и периодичности.
- Хранение факта акцепта в БД:
user_id,offer_version,accepted_at,ip, чтобы при споре доказать согласие.
Акцепт оферты в боте оформляется нажатием кнопки «Оплатить» — это засчитывается как конклюдентное действие по ст. 438 ГК РФ. Перед инвойсом отправьте сообщение с inline-кнопкой и ссылкой на оферту.
Безопасность платежей
Базовые правила, которые часто нарушают новички:
- Не храните данные карт у себя. PCI DSS — отдельная сертификация, дешевле и безопаснее всегда работать через токены провайдера (
payment_method_id). - Проверяйте подписи webhook'ов. ЮKassa подписывает уведомления HMAC-SHA1, Тинькофф — SHA-256. Без проверки злоумышленник присылает поддельный «успешный платёж» и получает услугу бесплатно.
- Защита
pre_checkout_query. Никогда не доверяйтеtotal_amountот Telegram буквально — сверяйте с ценой, которую сами выставили на сервере поpayload. Иначе подмена через self-hosted клиент даёт халявную скидку. - TLS на webhook-эндпоинте. Telegram и провайдеры работают только через HTTPS с валидным сертификатом.
- Логирование без чувствительных полей. В логи можно
payload,total_amount,charge_id. Нельзя —provider_token, тело webhook'а целиком, e-mail клиента в открытом виде.
Подписки и автосписания
Для подписок есть два пути:
- Telegram Stars — для цифровых подписок, доступ к каналам/контенту. Telegram сам ведёт биллинг.
- Рекуррент через эквайринг — нужно подключать рекуррентные платежи у провайдера (ЮKassa, например), хранить токен карты, выставлять списания по расписанию. Юридически — это уже обработка платёжных данных, нужны 152-ФЗ и оферта.
Что выбрать
Грубый ориентир:
- Цифровой продукт, глобальная аудитория → Stars.
- Физический товар, услуги, B2B в РФ → ЮKassa/Тинькофф + опционально СБП как альтернатива.
- Высокие обороты по СБП → прямая интеграция с банком-партнёром.
- Подписки на канал/контент → Stars или встроенный механизм Telegram для платных каналов.
Часто оптимально — несколько способов в одном боте: Stars для микротранзакций, ЮKassa и СБП для основного чекаута.
Безопасность и юр.часть
Несколько моментов, которые часто забывают:
- Никогда не доверяйте сумме, которую прислал клиент в
pre_checkout_query, — сравнивайте с тем, что бот сам выставил. - Идемпотентность: если webhook об успешной оплате прилетит дважды, заказ не должен задвоиться.
- Для рекуррентов — обязательная оферта и согласие с обработкой ПДн.
- Чеки по 54-ФЗ — через провайдера или отдельную ОФД-интеграцию.
Итого
Telegram Stars подходят только для цифровых товаров, но дают самый бесшовный UX. ЮKassa и аналоги закрывают весь спектр физических товаров и услуг с фискализацией. СБП экономит на комиссиях при больших оборотах. На практике в крупных проектах сосуществуют 2–3 способа сразу — это снижает падение конверсии при отказах банков и даёт выбор пользователю.
Частые вопросы
Как принимать оплату в Telegram-боте в 2026 году?
Тремя путями. Telegram Stars — внутренняя валюта Telegram только для цифровых товаров и услуг (подписки, доступ к контенту, бонусы в Mini Apps); технически — sendInvoice с currency XTR. Российские эквайринги (ЮKassa, Тинькофф Касса, Альфа-эквайринг) — через провайдер-токен из BotFather, sendInvoice со встроенной формой оплаты, апдейт successful_payment. СБП напрямую через банк-партнёра или агрегатор — генерация QR/ссылки, webhook об оплате, отдельная фискализация.
Какая комиссия у разных способов оплаты в Telegram?
ЮKassa и эквайринги — обычно 2–3% за карты. СБП — 0,4–0,7%, в 4–7 раз дешевле эквайринга при большом обороте. Telegram Stars — комиссия Telegram плюс комиссия сторов (App Store или Google Play на iOS/Android), итоговая ставка обычно выше карточной. На больших оборотах прямая интеграция СБП окупает доработки за счёт экономии на комиссии — это десятки и сотни тысяч ₽ в месяц.
Можно ли продавать через Telegram Stars физические товары?
Нет, нельзя. Stars предназначены только для цифровых товаров и услуг — подписки, доступ к контенту, виртуальные бонусы, цифровые подарки. Физические товары и услуги с офлайн-поставкой через Stars запрещены правилами платформы. Для физических товаров, ресторанов, услуг с выездом, B2B в РФ нужны российские эквайринги (ЮKassa, Тинькофф) с фискализацией по 54-ФЗ через тот же провайдер.
Как сделать подписку в Telegram-боте с автосписаниями?
Два пути. Telegram Stars — для цифровых подписок, доступа к платным каналам или контенту; Telegram сам ведёт биллинг и списания. Рекуррент через эквайринг (ЮKassa, например) — подключаются рекуррентные платежи, хранится токен карты, бот выставляет списания по расписанию. Второй вариант юридически сложнее: нужны оферта на рекуррент, отдельное согласие на обработку платёжных данных, политика по 152-ФЗ. Зато работает с физическими товарами и не зависит от правил Telegram.
Как подключить ЮKassa к Telegram-боту?
Четыре шага. 1) В BotFather: /mybots → выбрать бота → Payments → подключить ЮKassa, получить провайдер-токен. 2) В коде бота: sendInvoice с провайдер-токеном, описанием товара, ценой, валютой. 3) Telegram открывает встроенную форму оплаты, пользователь вводит карту или платит через сохранённую. 4) Бот получает апдейт successful_payment с подтверждением. ЮKassa автоматически выбивает фискальный чек по 54-ФЗ в нужную ОФД, бот передаёт состав корзины и НДС. Срок интеграции — обычно неделя.
Что обязательно проверить в платежах Telegram-бота?
Четыре момента: 1) Никогда не доверяйте сумме, которую клиент прислал в pre_checkout_query — всегда сравнивайте с тем, что бот сам выставил, иначе можно подменить цену. 2) Идемпотентность: если webhook об успешной оплате прилетит дважды (а Telegram ретраит), заказ не должен задвоиться — дедуп по payment_charge_id. 3) Для рекуррентных списаний — обязательная оферта и явное согласие на обработку платёжных данных. 4) Чеки по 54-ФЗ через провайдера или отдельную интеграцию с ОФД, иначе штрафы по налоговой.
Как пошагово подключить ЮKassa и протестировать платежи в боте?
Регистрация в ЮKassa с прохождением KYC как ИП или ООО, получение shopId и секретного ключа в кабинете. В кабинете создать кассу типа «Telegram бот», получить тестовый (TEST:...) и продакшн (LIVE:...) токены. Привязать тестовый токен в BotFather: /mybots → бот → Payments → Edit Payment Provider → YooKassa → вставить токен. Прогнать полный цикл sendInvoice → pre_checkout_query → successful_payment с тестовой картой 5555 5555 5555 4444 от ЮKassa. Убедиться, что приходит webhook успешного платежа, активируется услуга, формируется чек. После тестов сменить токен на LIVE без перезапуска бота — provider_token передаётся в каждом sendInvoice отдельно. Срок боевого подключения — около недели с учётом проверок банка.
Как фискализировать платежи в Telegram-боте по 54-ФЗ?
Для всех платежей физлицам в РФ обязателен онлайн-чек через ОФД. ЮKassa, Тинькофф и большинство российских провайдеров формируют чек автоматически — нужно передать секцию receipt в provider_data при sendInvoice. В receipt указываются позиции (description, quantity, amount), код НДС (vat_code: 1 без НДС, 3 НДС 10%, 4 НДС 20%), предмет расчёта (payment_subject: service для услуг, commodity для товаров), способ (payment_mode: full_prepayment для предоплаты), система налогообложения (tax_system_code: 2 для УСН доходы). Если работаете через свою кассу (Атол.Онлайн, ferma.ofd.ru) — отдельная интеграция с фискальным накопителем по ФФД 1.2. При возврате провайдер автоматически выбьет чек коррекции, если был передан receipt при первом платеже.
Как реализовать подписку с автосписаниями через ЮKassa в боте?
Telegram не имеет нативного механизма подписок, реализация на стороне бота. При первом платеже передаёте провайдеру флаг сохранения метода (ЮKassa — save_payment_method: true), получаете payment_method_id (токен карты). По cron каждый месяц/год создаёте платёж через POST https://api.yookassa.ru/v3/payments с payment_method_id и Idempotence-Key в заголовке. При статусе succeeded продлеваете подписку в БД, отправляете уведомление. При canceled (недостаточно средств, истёк срок) даёте grace-period 3 дня и шлёте напоминание обновить карту через новый sendInvoice с save_payment_method. Юридически нужны оферта на рекуррент с явным упоминанием суммы и периодичности, отдельное согласие пользователя галочкой перед первой оплатой, хранение факта акцепта в БД (user_id, offer_version, accepted_at, ip) для разрешения споров.