Рекуррентные платежи и токенизация карт: как работает автосписание
Основы3 минРедакция Innovialabs
Коротко
При первой оплате платёжный провайдер сохраняет карту и выдаёт магазину токен; дальше магазин списывает деньги по этому токену по расписанию, а провайдер и банк проверяют, что у клиента есть согласие на такие списания.
Как это работает в двух словах
Рекуррентный платёж — списание с карты клиента без его участия в момент оплаты: раз в месяц за подписку, после каждой доставки коробки, при исчерпании баланса. Чтобы это было возможно, карту нужно «запомнить», но хранить номер карты у себя магазину нельзя — это зона жёстких требований PCI DSS.
Поэтому используется токенизация: данные карты остаются у платёжного провайдера, а магазин получает токен — случайную строку, которая ничего не значит за пределами связки «этот магазин + этот провайдер». Украденный токен бесполезен без ключей доступа магазина к API провайдера.
Жизненный цикл: от первой оплаты до автосписания
- Первая оплата с согласием. Клиент вводит карту в форме провайдера, проходит 3-D Secure или подтверждение по SMS и отмечает согласие на будущие списания.
- Сохранение карты. Провайдер возвращает магазину токен и, как правило, маску карты (последние цифры, срок действия) для показа в личном кабинете.
- Хранение. Магазин сохраняет токен в своей базе рядом с подпиской: тариф, сумма, дата следующего списания.
- Списание по инициативе магазина. В нужный день сервер магазина вызывает API провайдера с токеном и суммой. Такие операции называются MIT (merchant-initiated transaction) — клиент в них не участвует, повторный 3-D Secure обычно не требуется.
- Результат. Провайдер возвращает успех или код ошибки, магазин обновляет статус подписки и уведомляет клиента.
Упрощённо запрос на списание выглядит так:
{
"token": "tok_7f3a9c...",
"amount": 99000,
"currency": "UZS",
"order_id": "sub-1042-2026-11",
"description": "Подписка, ноябрь"
}
Поле order_id должно быть уникальным для каждой попытки — это защищает от двойного списания при повторной отправке запроса.
Что делать, если списание не прошло
Отказ — нормальная часть рекуррентных платежей. Важно различать причины:
| Причина | Что делать |
|---|---|
| Недостаточно средств | Повторить попытку позже по расписанию, предупредить клиента |
| Карта заблокирована или токен отозван | Не повторять, попросить привязать новую карту |
| Срок действия карты истёк | Попросить обновить карту; у части провайдеров есть сервис обновления данных |
| Технический сбой | Повторить через короткое время, проверить статус операции перед повтором |
Хорошая практика — dunning: серия повторных попыток с паузами плюс письма или сообщения клиенту. Подписка не отключается сразу, а переходит в статус «ожидает оплаты» на ограниченный срок. Слишком частые повторы при одном и том же отказе могут привести к санкциям со стороны банка или провайдера, поэтому число попыток стоит ограничить.
Согласие клиента: что обязательно
Автосписание без понятного согласия — прямой путь к чарджбэкам и блокировке. Клиент до первой оплаты должен видеть:
- сумму и периодичность списаний;
- дату первого списания, особенно если есть пробный период;
- как отменить подписку — и это должно быть не сложнее, чем оформить её;
- что произойдёт при изменении цены.
Дополнительно стоит:
- присылать уведомление перед списанием, особенно после бесплатного периода;
- давать в личном кабинете кнопку «отвязать карту»;
- хранить запись о согласии: дату, текст условий, IP или идентификатор сессии.
Примеры: коробки и сервисы
Подписочная коробка (кофе, корм для животных, косметика). Списание привязано к циклу сборки: деньги списываются за несколько дней до отправки, чтобы при отказе успеть приостановить сборку. Клиенту удобно дать возможность пропустить месяц.
Сервис или SaaS. Фиксированная сумма раз в месяц или год. Важны апгрейд и даунгрейд тарифа в середине периода и корректный пересчёт.
Пополнение баланса. Списание срабатывает по событию — например, когда баланс опустился ниже порога. Здесь особенно важен лимит, чтобы ошибка в логике не списала лишнее.
Частые ошибки
- Сохранять номер карты в своей базе вместо токена.
- Не делать запросы идемпотентными и получать двойные списания.
- Повторять списание бесконечно при отказе «карта заблокирована».
- Прятать кнопку отмены подписки.
- Не обрабатывать уведомления (webhook) провайдера и полагаться только на ответ запроса.