Обзор
Система рекуррентных платежей позволяет автоматически продлевать подписки без участия пользователя. Состоит из двух компонентов:- Автопродление (autopay) — автоматическое списание с баланса при приближении окончания подписки
- Сохранённые карты — автоматическое пополнение баланса через YooKassa, если средств на балансе недостаточно
Автопродление (с баланса)
Как работает
Мониторинг-сервис ежедневно проверяет подписки с включённым автопродлением:- Находит подписки, где
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). Подписки, уже обработанные за текущий день, пропускаются.Уведомления
Предупреждения об окончании подписки
Настраиваются через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 в логах:
