Skip to main content

Обзор

Система рекуррентных платежей позволяет автоматически продлевать подписки без участия пользователя. Состоит из двух компонентов:
  1. Автопродление (autopay) — автоматическое списание с баланса при приближении окончания подписки
  2. Сохранённые карты — автоматическое пополнение баланса через YooKassa, если средств на балансе недостаточно
Для полноценной работы необходимо включить оба компонента:
  • ENABLE_AUTOPAY=true — автопродление с баланса
  • YOOKASSA_RECURRENT_ENABLED=true — сохранение и использование карт
Без ENABLE_AUTOPAY сохранённые карты не будут использоваться автоматически. Без YOOKASSA_RECURRENT_ENABLED продление возможно только при достаточном балансе.

Автопродление (с баланса)

Как работает

Мониторинг-сервис ежедневно проверяет подписки с включённым автопродлением:
  1. Находит подписки, где autopay_enabled=true и до окончания осталось ≤ autopay_days_before дней
  2. Рассчитывает стоимость продления (с учётом промо-скидок)
  3. Если баланс достаточен — списывает и продлевает подписку
  4. Если баланс недостаточен — пытается списать с сохранённой карты (при наличии)
  5. Отправляет уведомление о результате
Пробные (trial) и суточные подписки исключены из автопродления. Также обрабатываются подписки, истекшие не более 48 часов назад.

Настройка

Интерфейс пользователя

В боте

Пользователь управляет автопродлением через меню подписки: Отображается текущий статус: включено/выключено и количество дней.

В Cabinet

Запрос:
Автопродление недоступно для суточных тарифов. При попытке включить на суточном тарифе API вернёт ошибку.

Сохранённые карты (YooKassa)

Как сохраняются карты

При оплате через YooKassa карта сохраняется автоматически:
  1. Пользователь создаёт платёж через YooKassa
  2. Если YOOKASSA_RECURRENT_REQUIRED=true — карта сохраняется принудительно
  3. Если YOOKASSA_RECURRENT_REQUIRED=false — YooKassa показывает чекбокс «Сохранить карту»
  4. После успешной оплаты webhook возвращает payment_method.saved=true
  5. Бот сохраняет данные карты в таблицу saved_payment_methods

Что сохраняется

Дедупликация: если карта с таким payment_method_id уже существует, новая запись не создаётся. Если карта была ранее деактивирована — она реактивируется.

Настройка

Управление картами (Cabinet API)

Список карт

Ответ:

Удаление карты

Мягкое удаление — карта помечается как is_active=false. При повторной оплате той же картой она реактивируется автоматически.

Автоматическое списание с карты

Процесс

Если при автопродлении на балансе недостаточно средств и у пользователя есть сохранённые карты:
  1. Рассчитывается сумма для продления подписки
  2. Бот перебирает все активные карты пользователя
  3. Для каждой карты создаётся платёж через YooKassa API (без подтверждения пользователя)
  4. При успехе — баланс пополняется, подписка продлевается
  5. При неудаче — пробуется следующая карта
  6. Если все карты не сработали — отправляется уведомление
Каждый платёж использует ключ идемпотентности, что предотвращает повторные списания при сетевых ошибках.

Защита от дублирования

Сервис рекуррентных платежей выполняется не чаще одного раза в сутки (daily guard). Подписки, уже обработанные за текущий день, пропускаются.

Уведомления

Предупреждения об окончании подписки

Настраиваются через AUTOPAY_WARNING_DAYS (по умолчанию 3,1 — за 3 дня и за 1 день):

Результат автопродления

Уведомление о недостаточном балансе отправляется с cooldown 24 часа — повторное уведомление в течение суток не приходит.

Администрирование

Управление автопродлением пользователя

Просмотр статистики

Сервис рекуррентных платежей возвращает статистику после каждого запуска:

Полная настройка

Минимальная конфигурация

Расширенная конфигурация


Устранение проблем

Автопродление не срабатывает

  1. ENABLE_AUTOPAY=true?
  2. У пользователя включено автопродление? Проверьте autopay_enabled на подписке
  3. Подписка не trial и не суточная?
  4. Баланс достаточен или есть сохранённая карта?
  5. Проверьте логи:

Карты не сохраняются

  1. YOOKASSA_RECURRENT_ENABLED=true?
  2. Пользователь дал согласие на сохранение (или YOOKASSA_RECURRENT_REQUIRED=true)?
  3. Webhook от YooKassa приходит? Проверьте:

Списание с карты не проходит

  1. Срок действия карты не истёк?
  2. На карте достаточно средств?
  3. Банк не блокирует рекуррентные платежи?
  4. Проверьте ответ YooKassa в логах:

Пользователь получает повторные уведомления

Cooldown на уведомления о недостаточном балансе — 24 часа. Если Redis недоступен, cooldown не работает и уведомления могут дублироваться. Проверьте подключение к Redis.