Когда нужны Stars, а когда обычная оплата
- Stars обязательны для цифровых товаров и услуг, которые потребляются внутри Telegram: доступ к материалам, курсы, подписка на закрытый канал, функции бота, цифровые файлы. Так требуют правила Telegram для разработчиков ботов.
- Обычная оплата (карты, ЮKassa) — для физических товаров и офлайн-услуг: доставка, запись в салон, консультация вживую. Подробнее: ЮKassa в Telegram-боте.
Сравнение всех способов: приём оплат в Telegram-боте.
Как проходит платёж
- Бот выставляет счёт методом
sendInvoice(или создаёт ссылкуcreateInvoiceLink): валютаXTR,provider_tokenпустой, цена — одна позиция в звёздах. - Telegram присылает pre_checkout_query. Бот должен ответить
answerPreCheckoutQueryв течение 10 секунд: подтвердить, что товар доступен. - После оплаты приходит successful_payment с идентификатором платежа
telegram_payment_charge_id. Только после этого бот выдаёт товар. - Сохраните идентификатор платежа — без него не сделать возврат.
Пример на aiogram 3
from aiogram import F
from aiogram.types import LabeledPrice, Message, PreCheckoutQuery
@router.message(F.text == "/buy")
async def buy(message: Message):
await message.answer_invoice(
title="Доступ к урокам",
description="Месяц доступа к закрытому разделу",
payload="lessons_30d",
currency="XTR",
prices=[LabeledPrice(label="Доступ", amount=250)],
)
@router.pre_checkout_query()
async def pre_checkout(query: PreCheckoutQuery):
await query.answer(ok=True)
@router.message(F.successful_payment)
async def paid(message: Message):
charge_id = message.successful_payment.telegram_payment_charge_id
await save_payment(message.from_user.id, charge_id)
await grant_access(message.from_user.id)
В aiogram 3 параметр provider_token для звёзд можно не передавать. Сумма указывается в целых звёздах.
Возвраты
Возврат делается методом refundStarPayment с ID пользователя и telegram_payment_charge_id. Правила Telegram требуют, чтобы у бота была поддержка покупателей: команда /paysupport и понятный способ решить спор. Если покупатель не получил товар, а вы не отвечаете, Telegram может вмешаться сам.
Подписки
Telegram поддерживает подписки за звёзды: при создании ссылки на оплату через createInvoiceLink указывается период подписки, и звёзды списываются автоматически каждый период, пока пользователь не отменит подписку. Бот получает уведомления об очередных платежах и должен продлевать или закрывать доступ по ним. Для доступа в закрытый канал есть и встроенный способ — платная пригласительная ссылка канала.
Как вывести звёзды
- Звёзды, полученные ботом, становятся доступны для вывода через 21 день после получения.
- Минимальная сумма вывода — 1 000 Stars.
- Вывод — через платформу Fragment, в криптовалюте TON. Дальше TON нужно продать, и это отдельный вопрос налогов и законодательства в вашей стране.
- Звёздами на балансе бота можно также оплачивать рекламу в Telegram.
Частые ошибки
- Выдавать товар после
pre_checkout_query, а не послеsuccessful_payment. - Не сохранять
telegram_payment_charge_id— потом нельзя сделать возврат. - Не обрабатывать повторную доставку обновлений: бот должен понимать, что этот платёж уже обработан.
- Продавать цифровой контент через сторонний эквайринг без варианта Stars — это может нарушать правила платформы.
Частые вопросы
Как подключить оплату звёздами к боту?
Ничего подключать в BotFather не нужно: бот выставляет счёт методом sendInvoice с валютой XTR и пустым provider_token, отвечает на pre_checkout_query и выдаёт товар после successful_payment.
Как вывести Telegram Stars?
Через Fragment в TON, не раньше чем через 21 день после получения, от 1 000 звёзд.
Можно ли вернуть оплату звёздами?
Да, методом refundStarPayment. Для этого нужен ID пользователя и идентификатор платежа telegram_payment_charge_id.
Можно ли принимать рубли за цифровой товар в Telegram?
Для цифровых товаров и услуг внутри Telegram правила платформы требуют Stars. Рубли через эквайринг — для физических товаров и офлайн-услуг.