Legan Studio
Все статьи
~ 14 мин чтения

Как принимать оплату в Telegram-боте (Stars, ЮKassa, СБП)

Сравниваем способы приёма платежей в Telegram-боте: Stars для цифровых товаров, ЮKassa и СБП для физических. Что выбрать и как интегрировать.

  • Telegram
  • оплата
  • интеграции
  • бизнес

Принять оплату в Telegram-боте можно тремя принципиально разными путями: через Telegram Stars, через российские эквайринги вроде ЮKassa или Тинькофф, или через СБП напрямую. У каждого варианта своя логика, комиссия и юридические ограничения. Выбор сильно влияет на воронку: один лишний клик на оплате убивает 10–20% конверсии.

Способы приёма оплаты в Telegram-боте

Перед сравнением провайдеров — обзор всех принципиально разных каналов оплаты, которые можно встроить в бот в 2026 году:

  1. Telegram Payments через провайдер — нативная встроенная форма оплаты, кнопка «Оплатить» прямо в карточке бота, валюта реальная (RUB/USD/EUR). Платёж проходит через подключённый эквайринг (ЮKassa, Тинькофф, Stripe), Telegram выступает только UI-слоем.
  2. Telegram Stars (с 2024) — внутренняя валюта Telegram (XTR). Подходит только для цифровых товаров и услуг. Деньги собираются Telegram, выплачиваются через Fragment.
  3. Внешний эквайринг через ссылку — бот отдаёт ссылку на платёжную страницу провайдера, пользователь уходит из Telegram в браузер, возвращается через webhook. UX хуже, но обходит ограничения BotFather по списку провайдеров.
  4. СБП через ссылку или QR — отдельный сценарий: либо через провайдера, либо напрямую через банк-партнёр с генерацией QR-кода.
  5. 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-оплаты, простое подключение
PayMaster2.5–3%от 10 ₽дадамалый бизнес, NCOгибкая фискализация
Stripe2.9% + $0.30от $0.50нетданерезиденты РФ, B2B-SaaSдля иностранных карт и валют
Telegram Stars~30% (доля Telegram)1 XTRнетвстроеноцифровые товары, подписки в Mini AppXTR = ~$0.013, выплата через Fragment

Выбор провайдера определяет не столько комиссию, сколько скорость подключения и набор фискальных опций. Для 90% рублёвых проектов оптимален связка ЮKassa + СБП.

Подключение ЮKassa в BotFather пошагово

  1. Регистрация в ЮKassa. Зарегистрироваться как ИП/ООО в yookassa.ru, пройти KYC, получить shopId и секретный ключ в кабинете.
  2. Создание кассы для Telegram. В кабинете ЮKassa: «Кассы» → «Telegram бот» → «Подключить». ЮKassa выдаст два токена: тестовый (TEST:...) и продакшн (LIVE:...).
  3. Тестовая среда. Сначала привязывайте тестовый токен — ЮKassa предоставляет тестовые карты вида 5555 5555 5555 4444 для отладки полного цикла без списаний.
  4. Привязка в BotFather. /mybots → выбрать бота → «Payments» → «Edit Payment Provider» → «YooKassa» → вставить токен. Telegram сразу проверит токен запросом к API провайдера.
  5. Продакшн-переключение. После тестов меняете токен на 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 срабатывает один раз. Подписку реализуют сами:

  1. Сохранение карты. При первом платеже передаёте провайдеру флаг сохранения метода: ЮKassa — save_payment_method: true, Тинькофф — Recurrent: Y. Провайдер возвращает payment_method_id (токен карты).
  2. Списание по 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"
    }
    
  3. Успех. Если статус succeeded — продлеваете подписку в БД, отправляете уведомление в бот.
  4. Неудача. Если 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 и СБП для основного чекаута.

Безопасность и юр.часть

Несколько моментов, которые часто забывают:

  1. Никогда не доверяйте сумме, которую прислал клиент в pre_checkout_query, — сравнивайте с тем, что бот сам выставил.
  2. Идемпотентность: если webhook об успешной оплате прилетит дважды, заказ не должен задвоиться.
  3. Для рекуррентов — обязательная оферта и согласие с обработкой ПДн.
  4. Чеки по 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) для разрешения споров.