Skip to main content

Обзор

Система рекуррентных платежей позволяет автоматически продлевать подписки без участия пользователя. В боте есть три модели автопродления:
  1. Автопродление (autopay) — автоматическое списание с баланса при приближении окончания подписки
  2. Сохранённые карты — автоматическое пополнение баланса через YooKassa, если средств на балансе недостаточно
  3. Провайдерские подпискиСБП-подписки Platega (v3.66.0) и подписки Lava (v3.67.0): деньги списывает сам провайдер, баланс бота не участвует
Провайдерские подписки и автооплата с баланса взаимоисключающи для одной подписки: включение одной модели выключает другую. Platega и Lava также исключают друг друга.
Для полноценной работы необходимо включить оба компонента:
  • 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). Подписки, уже обработанные за текущий день, пропускаются.

СБП-подписки 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, но с одним принципиальным отличием.
Подписка Lava оформляется на продукт из личного кабинета Lava, а не на произвольную сумму: цена и период заданы на стороне Lava. Поэтому тарифу в боте нужно проставить lava_product_id — без него рекуррент по этому тарифу не предлагается.
Эндпоинты кабинета зеркалят платеговские:
При ручном продлении подписки дата следующего списания сдвигается — двойной оплаты за один и тот же период не будет.Цена автопродления учитывает докупленные устройства и трафик, а не только базовую стоимость тарифа (v3.67.0).

Уведомления

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

Настраиваются через 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.