Обзор
Система рекуррентных платежей позволяет автоматически продлевать подписки без участия пользователя. В боте есть три модели автопродления:- Автопродление (autopay) — автоматическое списание с баланса при приближении окончания подписки
- Сохранённые карты — автоматическое пополнение баланса через YooKassa, если средств на балансе недостаточно
- Провайдерские подписки — СБП-подписки Platega (
v3.66.0) и подписки Lava (v3.67.0): деньги списывает сам провайдер, баланс бота не участвует
Автопродление (с баланса)
Как работает
Мониторинг-сервис ежедневно проверяет подписки с включённым автопродлением:- Находит подписки, где
autopay_enabled=trueи до окончания осталось ≤autopay_days_beforeдней - Рассчитывает стоимость продления (с учётом промо-скидок)
- Если баланс достаточен — списывает и продлевает подписку
- Если баланс недостаточен — пытается списать с сохранённой карты (при наличии)
- Отправляет уведомление о результате
Пробные (trial) и суточные подписки исключены из автопродления. Также обрабатываются подписки, истекшие не более 48 часов назад.
Настройка
Интерфейс пользователя
В боте
Пользователь управляет автопродлением через меню подписки:
Отображается текущий статус: включено/выключено и количество дней.
В Cabinet
Автопродление недоступно для суточных тарифов. При попытке включить на суточном тарифе API вернёт ошибку.
Сохранённые карты (YooKassa)
Как сохраняются карты
При оплате через YooKassa карта сохраняется автоматически:- Пользователь создаёт платёж через YooKassa
- Если
YOOKASSA_RECURRENT_REQUIRED=true— карта сохраняется принудительно - Если
YOOKASSA_RECURRENT_REQUIRED=false— YooKassa показывает чекбокс «Сохранить карту» - После успешной оплаты webhook возвращает
payment_method.saved=true - Бот сохраняет данные карты в таблицу
saved_payment_methods
Что сохраняется
Дедупликация: если карта с таким
payment_method_id уже существует, новая запись не создаётся. Если карта была ранее деактивирована — она реактивируется.Настройка
Управление картами (Cabinet API)
Список карт
Удаление карты
is_active=false. При повторной оплате той же картой она реактивируется автоматически.
Автоматическое списание с карты
Процесс
Если при автопродлении на балансе недостаточно средств и у пользователя есть сохранённые карты:- Рассчитывается сумма для продления подписки
- Бот перебирает все активные карты пользователя
- Для каждой карты создаётся платёж через YooKassa API (без подтверждения пользователя)
- При успехе — баланс пополняется, подписка продлевается
- При неудаче — пробуется следующая карта
- Если все карты не сработали — отправляется уведомление
Каждый платёж использует ключ идемпотентности, что предотвращает повторные списания при сетевых ошибках.
Защита от дублирования
Сервис рекуррентных платежей выполняется не чаще одного раза в сутки (daily guard). Подписки, уже обработанные за текущий день, пропускаются.СБП-подписки Platega
Появились вv3.66.0. Пользователь один раз подтверждает подписку в приложении банка, дальше Platega сама списывает деньги по расписанию и присылает боту коллбек. Баланс бота в цепочке не участвует.
Включение
PLATEGA_RECURRENT_ENABLED — глобальный выключатель. Пока он false, ни бот, ни кабинет не показывают оформление СБП-автооплаты, даже если сам Platega подключён.Где оформляется
- в боте — при покупке и продлении, как альтернатива оплате с баланса;
- на экране «недостаточно средств» при продлении (
v3.67.0); - в кабинете —
POST /subscription/platega-recurrent/enableи/purchase.
Каденс списаний
Platega умеет только интервалы day / week / month / year с шагом 1, поэтому период тарифа приводится к ближайшему:Статусы подписки
Управление и сверка
- Пользователь —
GET /subscription/platega-recurrent(статус) иPOST /subscription/platega-recurrent/cancel. - Администратор — статус и отмена СБП-автооплаты в карточке пользователя в кабинете.
- События — кабинет получает
sbp_recurring.*по вебсокету. - Реконсилятор — в цикле мониторинга сверяет локальные записи со статусом у Platega. Это страховка от потерянных коллбеков: пропавшая у провайдера подписка хоронится, а недоступность Platega откладывает решение до следующего цикла, а не помечает подписку неудачной.
Автооплата отменяется автоматически при удалении или отзыве подписки — «осиротевших» списаний не остаётся. Каждый коллбек идемпотентен по идентификатору списания, поэтому повтор от провайдера не продлевает подписку дважды.
Подписки Lava
Появились вv3.67.0 и устроены по образцу Platega, но с одним принципиальным отличием.
При ручном продлении подписки дата следующего списания сдвигается — двойной оплаты за один и тот же период не будет.Цена автопродления учитывает докупленные устройства и трафик, а не только базовую стоимость тарифа (
v3.67.0).Уведомления
Предупреждения об окончании подписки
Настраиваются черезAUTOPAY_WARNING_DAYS (по умолчанию 3,1 — за 3 дня и за 1 день):
Результат автопродления
Уведомление о недостаточном балансе отправляется с cooldown 24 часа — повторное уведомление в течение суток не приходит.
Администрирование
Управление автопродлением пользователя
Просмотр статистики
Сервис рекуррентных платежей возвращает статистику после каждого запуска:Полная настройка
Минимальная конфигурация
Расширенная конфигурация
Устранение проблем
Автопродление не срабатывает
ENABLE_AUTOPAY=true?- У пользователя включено автопродление? Проверьте
autopay_enabledна подписке - Подписка не trial и не суточная?
- Баланс достаточен или есть сохранённая карта?
- Проверьте логи:
Карты не сохраняются
YOOKASSA_RECURRENT_ENABLED=true?- Пользователь дал согласие на сохранение (или
YOOKASSA_RECURRENT_REQUIRED=true)? - Webhook от YooKassa приходит? Проверьте:
Списание с карты не проходит
- Срок действия карты не истёк?
- На карте достаточно средств?
- Банк не блокирует рекуррентные платежи?
- Проверьте ответ YooKassa в логах:
