Платежи и Telegram Stars
Монетизация — ключевой вопрос для любого приложения, и Telegram предоставляет два мощных механизма: TON-платежи для крипто-транзакций и Telegram Stars для покупок внутри приложения. Понимание обоих механизмов позволяет выбрать оптимальную стратегию монетизации для вашего продукта.
С 2024 года Telegram Stars (XTR) — обязательная виртуальная валюта для продажи цифровых товаров внутри Telegram. В этом уроке разберём архитектуру платёжного потока, отличие Stars от TON и паттерны интеграции.
Telegram Stars: концепция
Stars — это внутренняя валюта Telegram, обозначаемая XTR. Ключевые свойства:
| Свойство | Описание |
|---|---|
| Обязательность | Все цифровые товары в Telegram продаются только за Stars |
| Покупка Stars | Пользователи покупают Stars через App Store / Google Play |
| Вывод | Разработчики выводят заработанные Stars через Fragment |
| Применение | Подписки, контент, игровые предметы, премиум-функции |
Stars — для цифровых товаров
Stars обязательны только для цифровых товаров внутри Telegram. Для физических товаров разрешено использовать стандартных платёжных провайдеров (Stripe, ЮKassa и др.).
Архитектура платёжного потока
Платёж через Stars — это 7-шаговый процесс между ботом, Telegram и пользователем:
Шаг 1: Создание инвойса (sendInvoice)
Бот отправляет инвойс с описанием товара:
// Pseudocode -- структура запроса sendInvoice
bot.sendInvoice({
chat_id: userId,
title: 'Премиум-подписка на 30 дней',
description: 'Доступ к эксклюзивным материалам',
payload: 'premium_30d_user123', // ваш внутренний ID
currency: 'XTR', // Stars
prices: [{ label: 'Подписка', amount: 100 }],
});
Шаг 2-3: Инвойс и оплата
Telegram показывает нативный UI инвойса — вы не контролируете его внешний вид. Пользователь видит название, описание и сумму в Stars.
Шаг 4-5: Pre-checkout
Перед списанием Stars Telegram отправляет боту pre_checkout_query — последний шанс проверить заказ:
// Обработка pre_checkout_query
bot.on('pre_checkout_query', (query) => {
const { id, invoice_payload, total_amount } = query;
// Проверка: товар существует? цена корректна?
const isValid = validateOrder(invoice_payload, total_amount);
bot.answerPreCheckoutQuery(id, isValid, {
error_message: isValid ? undefined : 'Товар больше не доступен',
});
});
Всегда обрабатывайте pre_checkout_query
Если бот не ответит на pre_checkout_query в течение 10 секунд, платёж будет отменён. Это ваша точка валидации — проверяйте payload, наличие товара и корректность суммы.
Шаг 6-7: Успешный платёж и доставка
// Обработка successful_payment
bot.on('message', (msg) => {
if (msg.successful_payment) {
const {
telegram_payment_charge_id, // ID транзакции Telegram
invoice_payload, // ваш payload из sendInvoice
total_amount, // сумма в Stars
} = msg.successful_payment;
// Доставить цифровой товар
deliverProduct(msg.from.id, invoice_payload);
}
});
Stars vs TON: две валюты, два сценария
Важно понимать разницу между Stars и TON в контексте Mini App:
| Параметр | Telegram Stars (XTR) | TON (blockchain) |
|---|---|---|
| Назначение | Цифровые товары в Telegram | On-chain операции |
| Обязательность | Обязательны для digital goods | Опциональны |
| Транзакция | Через Telegram Bot API | Через TON Connect |
| Подтверждение | Мгновенное (серверы Telegram) | 5-10 секунд (блокчейн) |
| Комиссия | Telegram забирает долю | Network fee (~0.01 TON) |
| Вывод средств | Через Fragment | На любой TON-кошелёк |
Типичный паттерн Mini App:
- Stars — для покупки внутренних товаров (подписки, контент, стикеры)
- TON — для blockchain-операций (минтинг NFT, swap токенов, staking)
Эти два метода оплаты не конкурируют — они решают разные задачи. Mini App может использовать оба одновременно.
Возврат средств
Stars поддерживают возврат в течение определённого окна:
// Получение транзакций
const transactions = await bot.getStarTransactions({
offset: 0,
limit: 100,
});
// Возврат средств
await bot.refundStarPayment(
userId,
telegramPaymentChargeId
);
Не хардкодьте курсы и проценты
Конверсионные курсы Stars, доля Telegram и окно возврата меняются периодически. Проектируйте систему так, чтобы эти параметры были конфигурируемыми, а не вшитыми в код.
Star Subscriptions: подписочная модель
С Bot API 8.0 (конец 2024) Telegram добавил подписки за Stars — регулярные списания с баланса пользователя по фиксированному периоду. Это даёт ботам и Mini App нативный recurring billing без необходимости поднимать собственную систему рекуррентных платежей.
Параметры подписки
Ключевое поле инвойса для подписки — subscription_period:
// createInvoiceLink с подпиской
const link = await bot.createInvoiceLink({
title: 'Premium ежемесячно',
description: 'Доступ к закрытым каналам и фичам',
payload: 'sub_premium_user123',
currency: 'XTR',
prices: [{ label: 'Месяц', amount: 350 }],
subscription_period: 2592000, // 30 дней в секундах
});
| Параметр | Значение | Описание |
|---|---|---|
subscription_period | 2592000 (30 дней) | Пока разрешён только период в 30 дней |
currency | XTR | Подписки доступны только в Stars |
prices | один элемент | Подписка не поддерживает мульти-айтем инвойсы |
После первой оплаты Telegram автоматически списывает указанную сумму каждые 30 дней и отправляет боту обновление о продлении.
Recurring billing flow
Шаг 1 (день 0):
Бот -> createInvoiceLink(subscription_period=2592000)
Пользователь оплачивает первый период.
Бот получает successful_payment с subscription_expiration_date.
Шаг 2 (день 30):
Telegram автоматически списывает 350 XTR.
Бот получает обновление о продлении -- доступ продлевается.
Шаг 3 (отмена):
Пользователь нажимает "Отменить" в меню Telegram.
Бот получает обновление is_canceled=true.
После окончания текущего периода доступ отзывается.
Сервер бота должен хранить subscription_expiration_date и is_canceled для каждого пользователя и проверять их при каждом запросе доступа — Telegram не присылает явного событие “доступ закончился”, это вычисляется сравнением дат.
App Store / Play Store policy
Apple и Google трактуют Stars как in-app currency — покупки Stars пользователем уже прошли через их платёжные системы и облагаются комиссией платформы. На стороне бота нельзя обходить Stars через ссылки на внешний платёжный шлюз для цифровых товаров: это нарушение правил Telegram и сторов одновременно. Subscription через Stars — единственный нативный способ продать подписку на digital goods из Mini App, опубликованного в каталоге.
PaidMedia: платный контент через Stars
Paid Media — механика, при которой бот публикует фото или видео, видимое только после оплаты Stars. Это не подписка, а разовая покупка конкретного поста, типичный кейс — gated-контент в каналах, генерация изображений по запросу, платные ответы AI-ассистента.
Отправка платного медиа
// Отправить платное фото в канал или личный чат
await bot.sendPaidMedia({
chat_id: channelId,
star_count: 50, // цена в Stars
media: [{
type: 'photo',
media: 'https://cdn.example.com/exclusive.jpg',
}],
caption: 'Эксклюзивное фото из закрытого архива',
});
Подписчики видят размытое превью с кнопкой “Разблокировать за 50 XTR”; после оплаты медиа становится видимым только этому пользователю. Ни сервер бота, ни TON Connect не нужны — весь поток происходит внутри Telegram, бот получает событие об успешной оплате через стандартный successful_payment с полем paid_media.
Pre-checkout для PaidMedia
pre_checkout_query для PaidMedia работает как и для обычных Stars-инвойсов: у бота есть 10 секунд, чтобы подтвердить или отклонить покупку. Типичная валидация — проверить, что медиа всё ещё доступно (например, не было удалено модерацией) и цена не изменилась с момента публикации.
bot.on('pre_checkout_query', (query) => {
if (query.invoice_payload.startsWith('paid_media:')) {
const mediaId = query.invoice_payload.split(':')[1];
const ok = paidMediaStore.exists(mediaId);
bot.answerPreCheckoutQuery(query.id, ok, {
error_message: ok ? undefined : 'Контент удалён',
});
}
});
Типичные применения
- Платные посты в каналах (фото/видео из эксклюзивного контента).
- AI-сервисы: image generation, video upscale, voice clone — бот возвращает результат как PaidMedia, оплата идёт за конкретный результат.
- Pay-per-view трансляции и записи событий.
Подписка vs PaidMedia
subscription_period — регулярная плата за продолжающийся доступ (премиум-роль, закрытый канал, безлимитный AI-чат). PaidMedia — единичная плата за конкретную единицу контента. Часто оба подхода сосуществуют: подписка за регулярный контент + PaidMedia за топ-контент сверх подписки.
Паттерн Stars в Mini App
В Mini App платёж обычно инициируется через бэкенд:
WebApp.openInvoice(url, callback) открывает нативный UI оплаты прямо внутри Mini App и возвращает результат в колбэк.
Итоги
| Этап | Метод Bot API | Ответственность |
|---|---|---|
| Создание инвойса | sendInvoice / createInvoiceLink | Бот формирует заказ |
| Pre-checkout | answerPreCheckoutQuery | Бот валидирует заказ |
| Оплата | — | Telegram обрабатывает |
| Доставка | — | Бот доставляет товар |
| Возврат | refundStarPayment | Бот инициирует возврат |
В следующем уроке разберём TON Connect внутри Mini App — как интегрировать блокчейн-кошелёк с Telegram-платформой.
Частые ошибки
- Путают TON-платежи и Telegram Stars: TON требует кошелёк и работает через блокчейн, Stars покупаются за фиат через App Store/Google Play.
- Не обрабатывают webhook подтверждения для Stars-платежей: без серверной верификации злоумышленник может получить товар без оплаты.
- Забывают о комиссии платформы: Apple и Google берут до 30% от Stars-платежей, и это нужно учитывать в ценообразовании.
- Не предусматривают механизм возврата (refund): пользователи имеют право на возврат средств, и ваш бэкенд должен это поддерживать.