Механика telegram stars payment построена на разделении пользовательского интерфейса и двухэтапной серверной валидации. Бот или Mini App генерирует инвойс с фиксированной ценой в Звездах и передает защищенный идентификатор заказа (payload). Пользователь подтверждает списание внутренней валюты через нативный шлюз Telegram, после чего сервер платформы отправляет боту валидационные события pre_checkout_query и successful_payment. Цифровой товар или услуга активируются строго после успешной обработки второго события на вашем сервере.
Схема платежного потока: разница между UX и backend-логикой
Для обычного пользователя процесс покупки в мессенджере выглядит максимально шовным: нажатие одной кнопки, отображение нативного экрана подтверждения, мгновенное списание и сразу же доступ к услуге. Однако для разработчика и владельца stars bot telegram этот процесс представляет собой асинхронную событийно-ориентированную систему, требующую обеспечения идемпотентности и защиты от сетевых сбоев.
Главная архитектурная ошибка при первой интеграции — попытка выдать цифровой товар или права на стороне клиента в момент закрытия всплывающего окна оплаты. Клиентский интерфейс Telegram Mini App или чата лишь визуализирует шаг оплаты. Окончательным и единственным достоверным подтверждением факта транзакции является получение серверного вебхука от платформ Telegram.

Схема движения данных и событий выглядит следующим образом:
- Инициализация чека (
Invoice Creation): Пользователь запрашивает платную функцию. Сервер бота формирует счет с помощью методаsendInvoice(для стандартных чат-ботов) или передает специальный параметрinvoice_linkв интерфейс Telegram Mini App. - Отображение нативного шлюза: Мессенджер запрашивает баланс пользователя и открывает встроенное окно telegram stars оплата.
- Предварительная валидация (
pre_checkout_query): В момент, когда пользователь нажимает финальную кнопку оплаты, Telegram генерирует событиеpre_checkout_queryи отправляет его на ваш backend. У приложения есть ровно 10 секунд, чтобы подтвердить возможность продажи (например, проверить наличие цифрового ключа на складе или неизменность цены) через откликanswerPreCheckoutQuery(ok=True). - Списание баланса: Мессенджер списывает указанное количество Stars с виртуального счета пользователя.
- Финализация и активация (
successful_payment): Telegram отправляет второе событие —successful_payment. Сервер приложения валидирует полученный обратноpayload, заносит транзакцию в базу данных и предоставляет услугу.
Если на этапе pre_checkout_query ваш сервер вернет ok=False или превысит лимит ожидания в 10 секунд, списание Stars не произойдет, а пользователь получит системное уведомление об отмене операции.
Что упускают разработчики: нюансы комиссии, региональные блокировки и полиси Apple/Google
В большинстве стандартных гайдов интеграцию описывают как простой линейный процесс. Однако на практике возникает ряд пограничных случаев и ограничений, о которых разработчики узнают только после запуска в продакшн:
- Региональные ограничения (
stars_purchase_blocked): В зависимости от юрисдикции пользователя и требований App Store / Google Play, функция покупки Звезд может быть заблокирована на уровне клиента. Если у пользователя флагstars_purchase_blockedравенtrue, шлюз оплаты даже не запустится. - Комиссия магазинов приложений: При покупке Звезд пользователем через in-app покупки Apple и Google взимают стандартную комиссию 30%. При конвертации Звезд обратно в фиат или TON разработчик получает сумму за вычетом этих расходов, что необходимо учитывать в юнит-экономике цифровых товаров.
- Правило /paysupport: Согласно Terms of Service for Telegram Stars, каждый коммерческий бот обязан корректно обрабатывать команду
/paysupport. Если пользователь столкнулся с проблемой при покупке и не получил ответа через/paysupport, он имеет право направить жалобу напрямую в поддержку Telegram. В случае системных нарушений Telegram оставляет за собой право списать Звезды с баланса бота или заблокировать его аккаунт.
Официальные условия использования Telegram Stars четко регламентируют ответственность сторон:
If a bot or mini app fails to deliver your purchase as advertised and within the agreed-upon timeframe, the respective third-party developer has the ability to refund your Stars at no penalty. Bots should be able to provide payment support if you send them the command /paysupport.
Telegram Stars Terms of Service

Пошаговая анатомия интеграции: invoice, payload и обработка событий
Ключевым элементом безопасности при работе с telegram stars bot является параметр payload. Это произвольная строка длиной до 128 байт, которую ваш бот отправляет при создании счета и которую Telegram возвращает в неизменном виде в событиях pre_checkout_query и successful_payment.
Никогда не передавайте в payload открытые данные без внутренней проверки. Опытные разработчики формируют payload как криптографический хеш или защищенный токен, содержащий ID пользователя, внутренний ID заказа в вашей БД и timestamp создания чека. Это защищает систему от подмены товаров и повторных атак.
Официальная документация платформы подчеркивает базовый принцип работы с виртуальной валютой:
Telegram Stars use a streamlined payment flow for digital goods and services. Bots can send invoices with prices specified in Stars, and receive updates when payments are completed successfully.
Telegram Bot API Documentation
Ниже приведен расширенный пример серверной логики на Python для корректного приема, проверки безопасности и подтверждения платежа:
Python
import hmac
import hashlib
import time
SECRET_KEY = b"your_internal_server_secret"
def generate_secure_payload(user_id: int, order_id: str) -> str:
"""Генерация защищенного payload с HMAC-подписью и timestamp"""
ts = int(time.time())
data = f"{user_id}:{order_id}:{ts}"
signature = hmac.new(SECRET_KEY, data.encode(), hashlib.sha256).hexdigest()[:16]
return f"{data}:{signature}"
def verify_payload(payload_str: str, user_id: int) -> bool:
"""Проверка подлинности payload при получении вебхука"""
try:
parts = payload_str.split(":")
if len(parts) != 4:
return False
p_user_id, order_id, ts, signature = parts
if int(p_user_id) != user_id:
return False
# Проверяем, что срок жизни payload не превысил 1 час (3600 сек)
if int(time.time()) - int(ts) > 3600:
return False
data = f"{p_user_id}:{order_id}:{ts}"
expected_sig = hmac.new(SECRET_KEY, data.encode(), hashlib.sha256).hexdigest()[:16]
return hmac.compare_digest(signature, expected_sig)
except Exception:
return False
# 1. Валидация перед списанием средств
@bot.pre_checkout_query_handler(func=lambda query: True)
def process_pre_checkout(pre_checkout_query):
raw_payload = pre_checkout_query.invoice_payload
user_id = pre_checkout_query.from_user.id
# Проверяем целостность payload
if not verify_payload(raw_payload, user_id):
bot.answer_pre_checkout_query(
pre_checkout_query.id,
ok=False,
error_message="Ошибка безопасности: подпись заказа недействительна или чек устарел."
)
return
order_id = raw_payload.split(":")[1]
if is_order_already_paid(order_id) or not check_stock(order_id):
bot.answer_pre_checkout_query(
pre_checkout_query.id,
ok=False,
error_message="Данный товар уже оплачен или недоступен."
)
return
# Одобрение транзакции
bot.answer_pre_checkout_query(pre_checkout_query.id, ok=True)
# 2. Обработка успешного платежа и выдача товара
@bot.message_handler(content_types=['successful_payment'])
def process_successful_payment(message):
pmt = message.successful_payment
charge_id = pmt.telegram_payment_charge_id
raw_payload = pmt.invoice_payload
# Идемпотентная запись транзакции по уникальному charge_id
if register_payment_once(charge_id, raw_payload):
deliver_digital_product(message.from_user.id, raw_payload)
bot.send_message(message.chat.id, "Оплата принята! Ваш цифровой товар доступен.")
Для Mini Apps интеграция на стороне фронтенда выполняется через JavaScript SDK с обязательной асинхронной проверкой состояния на backend:
JavaScript
// Вызов нативного шлюза в Telegram Mini App
Telegram.WebApp.openInvoice(invoiceUrl, (status) => {
if (status === 'paid') {
// Внимание: не выдавайте товар здесь!
// Запускаем опрос сервера для подтверждения обработки successful_payment
checkPaymentStatusOnServer(orderId);
} else if (status === 'cancelled') {
showErrorMessage('Оплата отменена пользователем.');
} else if (status === 'failed') {
showErrorMessage('Произошла ошибка при обработке транзакции.');
}
});

Таблица статусов и жизненный цикл транзакции Stars
Чтобы наглядно представить поведение системы на разных этапах оплаты, рассмотрим жизненный цикл транзакции:
| Статус транзакции | Событие / Триггер | Действие на стороне Telegram | Действие на стороне Вашего Backend | Допустимое время отклика |
| Created | Вызов sendInvoice или createInvoiceLink | Генерирует инвойс с уникальным url/id. | Сохраняет запись о заказе в БД со статусом pending. | Не ограничено |
| Checkout Pending | Пользователь нажал «Оплатить» в UI | Отправляет pre_checkout_query боту. | Проверяет payload, цены и наличие товара в БД. | До 10 секунд |
| Approved / Rejected | Ответ answerPreCheckoutQuery | Списывает Stars при ok=True или отменяет операцию при ok=False. | При ok=False переводит заказ в статус cancelled. | Мгновенно |
| Paid | Списание произошло успешно | Отправляет successful_payment боту. | Записывает telegram_payment_charge_id, выдает товар. | До 30 секунд (рекомендуется) |
| Refunded | Вызов метода refundStarPayment | Возвращает Звезды на баланс пользователя. | Аннулирует подписку / доступ, заносит отметку о возврате в БД. | Не ограничено |
Ошибки при настройке telegram stars payment
При эксплуатации цифрового магазина или сервиса под именем telegram stars shop вы неизбежно столкнетесь со сложными сетевыми условиями, повторными отправками событий и человеческим фактором.
Ниже подробно разобраны типичные точки отказа, их финансовые или логические риски, а также технические способы предотвращения:
| Этап / Событие | Возникающая ошибка / Сбой | Потенциальный риск | Архитектурное решение |
| pre_checkout_query | Превышение лимита в 10 секунд (таймаут backend) | Отмена покупки для пользователя при списании времени на внешние БД. | Кэшировать статусы товаров в Redis; выполнять тяжелые проверки до генерации счета. |
| successful_payment | Повторный вебхук (Race Condition) | Двойная выдача товара, начисление лишнего баланса или подписки. | Установить UNIQUE-индекс в базе данных на поле telegram_payment_charge_id. |
| Client Interface | Закрытие WebView во время анимации | Пользователь считает, что оплата прошла, но статус в UI не обновился. | Реализовать серверный опрос (polling) или WebSocket для синхронизации UI с БД. |
| Payload Handling | Использование статического payload | Возможность подменить цену или переиспользовать прошлый чек. | Генерировать динамический payload с коротким временем жизни и HMAC-подписью. |
| Refund Issue | Ручной запуск возврата без отзыва прав | Пользователь получает Звезды обратно, сохраняя доступ к услуге. | Автоматизировать логику обработки refund с мгновенным аннулированием доступов. |

Подробный разбор критических сценариев отказа
- Гонка условий (Race Condition) и повторные вебхуки:Telegram гарантирует доставку уведомления о платеже, но из-за сетевых задержек между серверами Telegram и вашим хостингом одно и то же сообщение
successful_paymentможет прийти 2 или 3 раза. Если ваш код просто выполняетUPDATE balance = balance + 100, баланс пользователя увеличится несколько раз. Использование уникального идентификатора платежаtelegram_payment_charge_idв качестве первичного ключа транзакции — единственный верный способ избежать этой проблемы. - Товар не открылся после списания:Если в момент получения
successful_paymentваша база данных недоступна или произошла ошибка в стороннем API (например, закончились ключи в базе), пользователь лишается Звезд, но не получает продукт. В таком случае алгоритм должен автоматически помещать транзакцию в очередь сбоев (dead-letter queue) и после восстановления связи повторять попытку выдачи или инициировать автоматическийrefundStarPayment. - Атака повторного использования (Replay Attack):Если параметр
payloadпредставляет собой простой ID товара (например,item_42), злоумышленник может попытаться подделать клиентский запрос или использовать старый перехваченный чек. Добавлениеtimestampи уникального подписывающего ключа на стороне сервера гарантирует, что каждый инвойс может быть оплачен только один раз и строго тем пользователем, которому он был выдан.
Ограничения, возвраты (Refunds) и подписки
Понимание юридических и технических рамок работы со Звездами оберегает проект от блокировки и убытков.
Строгий запрет на продажу физических товаров
Telegram Stars созданы исключительно для цифровых товаров, подписок, онлайн-сервисов и доступа к контенту.
Если попытаться организовать продажу физических предметов (одежда, электроника, еда, доставка) через telegram bot звезды, бот будет заблокирован модерацией за нарушение Условий использования платформы. Для продажи реальных товаров мессенджер требует использовать стандартные эквайринговые системы (YooKassa, Stripe и др.) через традиционный Bot Payments API.
Механика возвратов (Refunds) через API
Если клиент оформил ошибочную покупку или услуга не была предоставлена, вы можете вернуть Звезды через официальный метод API refundStarPayment (в Bot API) или payments.refundStarsCharge (в MTProto API).
Для этого сервер отправляет в Telegram параметры:
user_id: Telegram ID покупателя;telegram_payment_charge_id: уникальный ID платежа, полученный вsuccessful_payment.
После выполнения метода Звезды немедленно возвращаются на баланс пользователя, а в реестре операций вашего бота появляется соответствующая отметка. Повторный вызов метода для того же charge_id вернет ошибку 400 CHARGE_ALREADY_REFUNDED.
Python
# Пример выполнения возврата средств (aiogram 3.x)
try:
await bot.refund_star_payment(
user_id=user_id,
telegram_payment_charge_id=charge_id
)
# Обязательно отзываем доступ к услуге в локальной базе
revoke_user_access(user_id, order_id)
except Exception as e:
logger.error(f"Не удалось выполнить возврат: {e}")
Модель рекуррентных подписок (Star Subscriptions)
Для сервисов с контентной моделью в Telegram поддерживается встроенная механика платных подписок за Звезды. Вы можете задать периодичность списания (по умолчанию 30 дней) и зафиксировать цену.
Основные особенности платных подписок:
- Пользователь может управлять активными подписками прямо в настройках своего Telegram-аккаунта.
- Если на балансе пользователя недостаточно Звезд в момент автопродления, подписка приостанавливается.
- Канал или бот получает обновления о состоянии подписки, что позволяет автоматически добавлять или удалять пользователей из приватных чатов с помощью платных пригласительных ссылок (
starsSubscriptionPricing).

Тестирование, учет и выгрузка средств
Прежде чем запускать telegram stars bot в продакшн, необходимо протестировать всю цепочку списаний в изолированном окружении.
Как тестировать без расходов
- Создайте отдельного тестового бота через
@BotFatherили переключите существующий токен в режим test environment. - Используйте специализированный бот
@EditStarsBotдля пополнения вашего аккаунта бесплатными тестовыми Звездами. - Симулируйте не только успехи, но и ошибки: падение сервера на этапе pre-checkout, сбои базы данных и процедуру
refund.
Вывод средств и конвертация
Все заработанные Звезды поступают на баланс вашего бота. Владелец проекта может просматривать детализацию доходов через панель управления ботом в Telegram или на официальной платформе Fragment.
После прохождения стандартного периода заморозки (обычно 21 день для защиты покупателей от фрода и обеспечения окна для возвратов) накопленные Звезды можно:
- Конвертировать в криптовалюту TON через платформу Fragment;
- Использовать для закупки рекламы и продвижения канала или бота через Telegram Ads.
Практический сценарий 1: Продажа доступа в приватный VIP-клуб
Рассмотрим пошаговую логику бизнес-кейса: продажа ежемесячного доступа к закрытому аналитическому сообществу через Telegram Mini App.
- Клик в Mini App: Пользователь выбирает тариф «VIP-доступ на 30 дней (250 Stars)».
- Формирование чека: Backend приложения проверяет текущие цены и генерирует параметры для счета:
title: «VIP-доступ на 30 дней»description: «Доступ к аналитике и закрытому чату»payload:order_9012_usr_44102_hash_a8fcurrency:XTR(международное обозначение Telegram Stars в API)prices:[LabeledPrice(label="Аналитика", amount=250)]
- Открытие шлюза: Вызывается
Telegram.WebApp.openInvoice. Пользователь видит окно списания 250 Stars. - Pre-checkout: Telegram отправляет
pre_checkout_query. Сервер проверяет HMAC-подписьpayloadи отвечаетok=True. - Списание и финализация: Telegram списывает 250 Stars и отправляет
successful_payment. Сервер записываетtelegram_payment_charge_idв БД, создает одноразовую пригласительную ссылку через методcreateChatInviteLinkи отправляет ее пользователю личным сообщением от бота. - Автоматический контроль: По истечении 30 дней серверная фоновая задача (cron) проверяет наличие продления и, если подписка не оплачена, автоматически исключает пользователя из закрытой группы.
Практический сценарий 2: Попокупка цифрового контента (E-book / Курс) с обработкой ошибок
Рассмотрим другой распространенный кейс: одноразовая покупка электронного обучающего гайда через чат-бота.
- Выбор товара: Пользователь нажимает кнопку «Купить курс по дизайну (100 Stars)».
- Генерация уникального счета: Бот отправляет инвойс с временным
payload. - Имитация сетевого сбоя на Pre-checkout:
- В момент оплаты сервер бота временно недоступен или ответил с задержкой 12 секунд.
- Telegram отменяет транзакцию. Звезды у пользователя не списываются.
- Клиент получает понятное сообщение: «Превышено время ожидания ответа от сервера бота. Попробуйте еще раз».
- Успешная повторная попытка:
- Пользователь нажимает «Оплатить» повторно.
- Сервер мгновенно проходит проверку
pre_checkout_query(ok=True). - После списания Stars сервер получает
successful_payment, сохраняет транзакцию и присылает пользователю PDF-файл курса прямо в диалог.

Выводы
Внедрение telegram stars payment стирает барьеры между пользователем и платной функцией: отсутствие необходимости вводить данные банковской карты повышает конверсию в оплату на десятки процентов. Однако стабильность системы зависит от качества серверной архитектуры: обязательной проверки pre_checkout_query, идемпотентной обработки successful_payment и строгого соблюдения правил мессенджера относительно цифрового характера товаров.
Если вы создаете коммерческого бота, развиваете сервисный Mini App или ищете целевые площадки для тестирования гипотез, используйте возможности CommyX. В наших каталогах тематических Telegram-чатов и каналов вы можете изучить работающие сервисы в вашей нише, найти профильные сообщества разработчиков и подобрать площадки для эффективных первых посевов. Анализируйте решения коллег на CommyX, привлекайте целевую аудиторию и развивайте свой проект, оптимизируя telegram stars payment под реальные потребности пользователей.












