Чтобы создать бота подписки в Telegram, сначала выберите, что именно продаётся: доступ к функциям самого бота или вход в приватный канал. Затем настройте оплату в Telegram Stars, храните состояние подписки на своём сервере и выдавайте доступ только после подтверждённого платежа. Эта инструкция рассчитана на цифровой контент и сервисы внутри Telegram, а не на физические товары.
Какой тип подписки выбрать
У подписки в Telegram есть два разных рабочих контура. Для приватного канала бот создаёт платную пригласительную ссылку. Для функций внутри бота он выставляет счёт и сам решает, какие команды доступны активному подписчику. Смешивать эти контуры в первом прототипе не нужно.
- Приватный канал: выбирайте, если результатом оплаты должен быть вход к публикациям. Бот обязан быть администратором канала с правом приглашать пользователей.
- Функции бота: выбирайте, если после оплаты открываются команды, лимиты, файлы или персональный сценарий. Состояние доступа хранит ваша база.
- Физический товар или очная услуга: это другой платёжный сценарий. Подписка Stars для цифрового доступа не заменяет учёт доставки, возвратов и чеков.
Официальный Bot API разрешает создавать подписную ссылку методом [createChatSubscriptionInviteLink](https://core.telegram.org/bots/api#createchatsubscriptioninvitelink). В производственной среде период сейчас фиксирован на 2 592 000 секунд, то есть 30 дней, а цена ссылки задаётся в диапазоне от 1 до 10 000 Stars. Эти ограничения нельзя менять в коде.
Правило выбора: если Telegram сам должен управлять входом в канал, используйте подписную ссылку. Если платёж открывает возможности вашего бота, храните отдельное состояние доступа в базе.
Счёт в боте работает только вместе с серверной логикой доступа. На вебинаре можно собрать такой сценарий с ИИ и проверить его по шагам.
Занять местоЧто подготовить до первой оплаты
Сначала зарегистрируйте бота через BotFather и настройте серверный обработчик. Токен бота храните только в секрете окружения. Если этот этап ещё не пройден, используйте инструкцию по BotFather, а затем вернитесь к подписке.
- Описание продукта: что открывается, на какой срок, как отменить продление и куда обратиться за поддержкой.
- База данных: идентификатор пользователя, тип плана, состояние, дата окончания, идентификатор операции и последний обработанный update.
- Сервер с HTTPS: webhook должен принимать события Telegram и отвечать без долгой работы внутри запроса.
- Тестовый пользователь и отдельный тестовый канал, чтобы не проверять оплату и исключение на живой аудитории.
Для цифровых товаров и услуг внутри приложений Telegram оплата должна идти в Stars с кодом валюты XTR. Официальная инструкция Payments API также требует дождаться события successful_payment: ответ на pre_checkout_query сам по себе ещё не подтверждает оплату.
По теме: Голосовой бот: как сделать в Telegram в 2026 году
Какие состояния хранить в базе
Не пытайтесь вычислять доступ только по наличию старого чека. У подписки есть жизненный цикл, и его удобнее представить конечным автоматом. Названия ниже являются внутренней схемой проекта, а не полями Telegram.
pending: счёт создан, но подтверждённой оплаты ещё нет. Доступ закрыт.active: получен подтверждённый платёж, известна дата окончания. Доступ открыт.cancel_at_period_end: продление отключено, но оплаченный период ещё идёт. Доступ открыт до даты окончания.expired: период закончился без продления. Доступ закрыт.refunded: платёж возвращён. Событие и принятое решение остаются в журнале.
Официальное описание подписок Stars подтверждает автоматическое продление за Stars и отдельные состояния отмены и нехватки баланса. В своей базе храните не только текущий статус, но и основание перехода: первое списание, продление, отмена, истечение или возврат.
Подписка требует больше, чем кнопка оплаты: нужны состояния, повторяемые обработчики и безопасное отключение доступа. На вебинаре вы разберёте, как превратить схему в рабочего бота.
Записаться на вебинарКак собрать обработку без повторной выдачи
Главный технический риск не в неуспешной оплате, а в повторной доставке одного события. Сеть может повторить запрос, а Telegram может прислать update после того, как сервер уже выполнил действие. Поэтому обработчик должен быть идемпотентным.
- Создайте продукт и стабильный
invoice_payload, который однозначно связывает счёт с планом и пользователем. - Для функций бота создайте ссылку на подписной счёт через
createInvoiceLink: задайтеXTRиsubscription_period=2592000. Для канала создайте подписную пригласительную ссылку и заранее выдайте боту правоcan_invite_users. - На
pre_checkout_queryпроверьте, что план существует и доступен, затем своевременно подтвердите возможность оплаты. - После
successful_paymentначните транзакцию базы и проверьте, не обработан ли уже идентификатор операции или update. - Запишите платёж и новое состояние, затем выдайте доступ ровно один раз. Повтор того же события должен вернуть прежний результат без новой выдачи.
- На событии продления сдвиньте дату окончания. При отмене вызовите
editUserStarSubscriptionсis_canceled=true, сохраните окончание периода и не отключайте уже оплаченный доступ раньше срока. - Отдельная периодическая задача закрывает доступ, если срок истёк и подтверждённого продления нет.
Подробная схема проверки обычного платежа есть в статье как сделать оплату в боте. Для подписки добавьте к ней срок действия, переходы статуса и повторяемую задачу сверки.
По теме: Как сделать, чтобы бот пересылал сообщения в Telegram
Как проверить бота до запуска
Проверяйте не экран оплаты, а наблюдаемое состояние системы. Для каждого теста сохраняйте время, update, запись подписки и фактически доступную команду или канал.
- Успешная первая оплата: одна запись платежа, состояние
active, доступ выдан один раз. - Повтор того же update: число выдач не меняется, срок не прибавляется повторно.
- Отмена продления: доступ остаётся до конца оплаченного периода, затем закрывается.
- Недостаток Stars при продлении: старое окончание не переносится без подтверждённого списания.
- Сбой после записи платежа: повтор обработчика завершает недостающий шаг, но не создаёт второй доступ.
- Подменённый
invoice_payload: платёжный сценарий останавливается и попадает в журнал.
Перед запуском добавьте понятные команды условий и поддержки. Telegram возлагает обработку споров на владельца цифрового сервиса и требует доступный канал поддержки, включая команду /paysupport, это указано в официальном руководстве по Stars.
Частые сбои и безопасный выход
Если createChatSubscriptionInviteLink отвечает ошибкой прав, проверьте, что бот добавлен именно в канал и получил право приглашать пользователей. Если счёт не создаётся, сначала проверьте XTR и период 30 дней, затем структуру payload.
Если оплата видна пользователю, но доступ закрыт, найдите цепочку по одному идентификатору: входящий update, запись платежа, переход состояния, операция выдачи. Не выдавайте доступ вручную до сверки, иначе повторный webhook создаст расхождение.
Если база недоступна, отвечайте временной ошибкой и не подтверждайте выдачу по данным из памяти процесса. После восстановления повторите необработанные события. Для сложного бота продаж полезно заранее описать весь сценарий от выбора до оплаты.
По теме: Как сделать приветствие в боте Telegram в 2026
Ограничения метода
Подписка Stars подходит для цифрового доступа внутри Telegram. Она не даёт произвольный период списаний, не решает налоговый и бухгалтерский учёт и не заменяет правила возврата. Доступ к внешнему сайту можно связать с Telegram, но тогда понадобится отдельная авторизация и синхронизация состояний.
Метод не подходит, если продукт является физическим товаром, если нужна оплата вне Telegram в другой валюте или если команда не готова поддерживать отмены, возвраты и спорные операции. В этих случаях сначала проектируют платёжный и юридический контур, затем интерфейс бота.
Частые вопросы
Можно ли сделать подписку без сервера?
Для простого канала часть доступа управляется подписной ссылкой Telegram, но условия, поддержка и контроль всё равно нужны. Для платных функций бота сервер и база обязательны.
Можно ли назначить подписку на неделю?
Нет для описанного производственного механизма Stars: официальный Bot API сейчас требует период 30 дней.
Когда открывать доступ?
Только после подтверждённого successful_payment и успешной записи операции в базе. Экран оплаты и pre_checkout_query недостаточны.
Что делать при отмене?
Отключить будущее продление, сохранить дату окончания и закрыть доступ после оплаченного периода. Пользователь должен видеть этот срок.
Хотите собрать бота с оплатой и состояниями доступа без хаотичных правок? На бесплатном вебинаре по вайбкодингу покажем, как превратить описание процесса в работающий проект и проверить его по шагам.
Записаться на вебинар