Skip to content

Продажи с сайта

Подписку можно продавать людям, у которых нет Telegram — или которые не хотят покупать в боте. На том же домене, где живут бот и кабинет, поднимается публичный лендинг (/) с тарифами и веб-кабинет (/web/): регистрация по email или через ВКонтакте / Яндекс / Google, оплата теми же кассами, гостевая покупка вообще без регистрации. Ссылка-подписка после оплаты приходит письмом. Веб-аккаунт и Telegram-аккаунт связываются в один — подписка и баланс видны и на сайте, и в боте.

Всё выключено по умолчанию и включается одним тумблером — WEB_CABINET_ENABLED. Пока он выключен, ни регистрация, ни публичный список тарифов, ни гостевая покупка снаружи не доступны.

Три способа купить без Telegram

Регистрация по email. Email + пароль (от 8 символов). При включённой проверке CABINET_EMAIL_VERIFICATION (по умолчанию — включена) на почту уходит письмо со ссылкой подтверждения, действует 24 часа; без подтверждения войти нельзя. Выключите проверку — аккаунт активен сразу, без письма.

Вход через ВКонтакте, Яндекс или Google. OAuth-кнопки появляются после заполнения client id/secret провайдера. Redirect URI при регистрации приложения у провайдера — адрес из CABINET_URL. Яндекс и Google создают аккаунт по подтверждённому email из профиля. ВКонтакте работает через VK ID (id.vk.com, OAuth 2.1 с PKCE — приложение регистрируется в кабинете VK ID): у VK-аккаунта email может отсутствовать вовсе, поэтому вход привязан к стабильному id пользователя VK, а email подхватывается бонусом, если ВК его отдал. Повторный вход тем же VK/Яндекс/Google-аккаунтом всегда открывает тот же аккаунт.

Гостевая покупка. Покупатель вводит только email, выбирает тариф и онлайн-кассу — и уходит на оплату. Аккаунт создаётся автоматически под капотом; после оплаты страница успеха сразу логинит покупателя в кабинет (одноразовый токен на 72 часа), а ссылка-подписка дублируется письмом. Оплата с баланса и Telegram Stars для гостей недоступны — только онлайн-методы.

После входа веб-пользователю доступно то же API, что и мини-аппе: тарифы, покупка, продление, устройства. Кассы — общие с ботом, отдельных настроек не нужно (Платежи).

Вход через Telegram. Кнопка на сайте выдаёт одноразовую deep-link-ссылку в бота (живёт 5 минут); в боте появляется вопрос «Кто-то входит на сайт под этим аккаунтом — подтвердить?» с кнопками «Да, это я» / «Отмена». После подтверждения сайт сам открывает кабинет этого Telegram-аккаунта. Дополнительной настройки не требуется — работает через самого бота, без BotFather-доменов; пересланная кому-то ссылка без нажатия «Да, это я» входа не даёт.

Связка аккаунтов

Один человек — один аккаунт, сколько бы способов входа у него ни было. В кабинете на сайте есть раздел «Аккаунт и входы»:

  • Привязать Telegram. Кнопка выдаёт одноразовую deep-link-ссылку в бота (живёт 15 минут). Открыл бота по ссылке — аккаунты слились: подписка, баланс, история платежей, рефералка и промокоды с веб-аккаунта переезжают в Telegram-аккаунт, на сайте открывается он же. Деньги не теряются (балансы складываются), триал остаётся одним на человека, конфликтные связки (у обоих аккаунтов разные почты, чужой Telegram) вежливо отклоняются.
  • Привязать ВК / Яндекс / Google. Из того же раздела OAuth-аккаунт привязывается к текущему аккаунту (в том числе к Telegram-аккаунту после связки). Отвязка защищена: последний оставшийся способ входа отвязать нельзя.
  • Привязать почту из бота. В мини-аппе (вкладка «Кабинет» → «Вход на сайте») Telegram-пользователь указывает email и пароль, подтверждает почту 6-значным кодом из письма — и может заходить на сайт по email даже когда Telegram недоступен.

Письма

Письма (подтверждение регистрации, ссылка-подписка после оплаты) уходят через ваш SMTP. Без заполненных хоста и отправителя почта молча не работает — заполните минимум SMTP_HOST и SMTP_FROM. Отправка best-effort: недоступный SMTP не ломает регистрацию и оплату.

Письмо после успешной оплаты приходит, только если у покупателя нет Telegram-аккаунта (веб- и гостевые покупатели): тема «VPN — подписка активна», внутри ссылка-подписка и подсказка вставить её в Happ/v2RayTun/Hiddify.

Настройки

Всё в категории «Интерфейс» настроек кабинета, применяется без перезапуска:

ПараметрПо умолчаниюЧто это
WEB_CABINET_ENABLEDвыклГлавный тумблер: регистрация, логин, публичные тарифы, гостевая покупка
CABINET_URLURL веб-кабинета; используется в ссылке подтверждения email и как redirect URI для OAuth
CABINET_EMAIL_VERIFICATIONвклПодтверждать email письмом при регистрации
SMTP_HOST / SMTP_PORT— / 587SMTP-сервер для писем
SMTP_USER / SMTP_PASSWORDЛогин и пароль SMTP (пароль шифруется)
SMTP_FROMАдрес отправителя
OAUTH_GOOGLE_CLIENT_ID / OAUTH_GOOGLE_CLIENT_SECRETGoogle OAuth (secret шифруется)
OAUTH_YANDEX_CLIENT_ID / OAUTH_YANDEX_CLIENT_SECRETYandex OAuth (secret шифруется)
OAUTH_VK_CLIENT_ID / OAUTH_VK_CLIENT_SECRETVK ID: id приложения и защищённый ключ из кабинета id.vk.com (ключ шифруется)

Что уже защищено из коробки

  • Сессии: короткоживущий access-токен (15 минут) + ротируемый refresh-токен (7 дней, в базе хранится только хэш). Повторное использование потраченного refresh-токена отклоняется.
  • Rate-limit на регистрацию, логин и гостевую покупку — от перебора паролей и спама аккаунтами. Лимитер fail-open: сбой Redis не запрёт реальных пользователей.
  • Логин отвечает за одинаковое время для существующего и несуществующего email — по времени ответа нельзя проверить, зарегистрирован ли адрес.
  • Заблокированный пользователь не получит веб-сессию ни по паролю, ни через OAuth, ни по refresh-токену.
  • Чужой неподтверждённый email нельзя перехватить ни через OAuth, ни гостевой покупкой.

Лендинг настраивается из кабинета

Заголовок, подзаголовок, фичи и FAQ лендинга редактируются в разделе «Мини-аппа» (блок landing) — тема и акцентный цвет наследуются от мини-аппы. Кнопка «Личный кабинет» ведёт в веб-кабинет, а при выключенном WEB_CABINET_ENABLED — в бота.

MIT License · сделано для тех, кто продаёт VPN, а не настраивает ботов