Кейс: автоматизация подписки на приватный 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).Авто-удаление — когда подписка просрочена и ретраи исчерпаны, бот удаляет участника, отправляет в ЛС уведомление и кнопку «Продлить».
