Кейс: автоматизация подписки на приватный Telegram-канал и рекуррентных платежей через CloudPayments
Ситуация и цель
Нужно было настроить платный доступ к закрытому каналу: пользователь оплачивает подписку банковской картой, получает приглашение в канал и остаётся участником при успешных продлениях. Вся логика — в Telegram-боте: оформление, изменение платёжных реквизитов, отмена подписки, повторные списания и автоматическое управление доступом.

Бизнес-логика подписки
-
Оформление
Пользователь выбирает «Оплатить картой РФ» (CloudPayments) или «Оплатить картой не РФ» (альтернативный маршрут).
В CloudPayments запускаем charge + токенизация (Payment + Token). При успехе:-
сохраняем
subscription_id,account_id,token(токен CloudPayments), дату следующего списания (+30 дней); -
формируем одноразовую инвайт-ссылку на канал (lifetime 24 часа, 1 use) и отправляем её пользователю.
-
-
Доступ в приватный канал
Бот является администратором канала и управляет инвайт-ссылками. Пользователь сам заходит по ссылке; бот валидацией черезgetChatMemberубеждается, что подписчик действительно внутри. -
Рекуррентные списания
За 24 часа до плановой даты бот отправляет напоминание о продлении (необязательно, но снижает неожиданные отписки).
В дату продления бек-процесс вызывает recurring by token в CloudPayments. При успехе дата продления сдвигается ещё на 30 дней. -
Обновление реквизитов (смена карты)
По нажатию «Сменить реквизиты» пользователь оплачивает ещё один месяц новой картой. Новый оплаченный период начинает действовать следом за текущим, а активный токен заменяется на новый. Ограничение «раз в месяц» контролируем на уровне БД и UI. -
Отмена подписки
По нажатию «Отменить подписку» бот деактивирует рекуррентные списания (отмена в CloudPayments) и показывает дату окончания уже оплаченного периода. Доступ в канал сохраняется до конца оплаченного срока. -
Непройденное продление
При отказе банка / истечении 3-D Secure / недостатке средств включается стратегия ретраев (например: +6ч, +24ч, +72ч). Если все попытки неудачны — статус «Просрочено», пользователь получает уведомление, а доступ в канал отзывается (см. ниже).

Управление доступом в канал
-
Выдача — разовая, через персональную инвайт-ссылку (ограничена по времени и количеству приглашений).
-
Проверка членства — при каждом критичном событии и планово раз в сутки (
getChatMember). -
Авто-удаление — когда подписка просрочена и ретраи исчерпаны, бот удаляет участника, отправляет в ЛС уведомление и кнопку «Продлить».