Модуль подписок с Payonline для korzinanadom.ru
korzinanadom.ru
Модуль платежей для товаров по подписке на InSales с биллингом от Payonline. Рекуррентные платежи для доставки продуктов по рецептам korzinanadom.ru.
Задача
korzinanadom.ru доставляет продуктовые наборы, собранные по рецептам: покупатель получает не разовую покупку, а регулярную поставку — каждую неделю или каждый месяц. Такой формат по своей сути подписочный, и заставлять человека каждый раз заново проходить оформление заказа и вводить карту бессмысленно — он должен подписаться один раз, а дальше оплата и доставка идут сами. Значит, деньги нужно списывать по расписанию, без участия покупателя на каждой итерации.
Проблема в том, что InSales — это SaaS-платформа с типовым чекаутом, рассчитанным на одну разовую оплату. Данные карты в ней не хранятся, повторно списать с сохранённой карты штатными средствами нельзя, а понятия «подписка» на уровне магазина просто нет. Payonline на тот момент был одним из немногих российских шлюзов, поддерживавших рекуррентную схему (rebill): первый платёж проходит как обычная оплата на защищённой странице шлюза, но при этом карта привязывается к токену, по которому потом можно списывать деньги повторно. Поэтому решение строилось не внутри InSales, а рядом с ним — отдельным модулем, который связывает витрину, платёжный шлюз и собственное хранилище подписок в единый цикл.
Как устроены рекуррентные списания
Полные данные карты покупатель вводит ровно один раз — на странице Payonline, и до нашего сервера они не доходят. После успешного первого платежа шлюз возвращает токен привязки (rebill-anchor) — по сути ссылку на сохранённую карту. Дальше повторное списание — это запрос к API Payonline с этим токеном и суммой, без номера карты и CVV. Каждый запрос подписывается контрольной суммой на основе секретного ключа магазина, поэтому подделать чужое списание нельзя. Такой подход снимает с нас хранение карточных данных и связанные с этим требования PCI DSS.
Что реализовали
Модуль вынесен во внешний сервис, который общается с InSales и Payonline по API и хранит собственное состояние подписок. Он берёт на себя всё, чего в коробочном магазине нет:
- Подключение к InSales через API — чтение товаров и создание заказов от имени магазина
- Страницы оформления подписки, оплаты и личного управления подпиской
- Интеграцию с Payonline: первичный платёж и последующие рекуррентные списания по токену
- Планировщик, который по расписанию инициирует очередное списание и создаёт заказ
- Хранилище подписок с их статусами, датами следующего списания и историей платежей
- Проверку подписи входящих уведомлений и разграничение доступа к платёжным операциям
Как работает
Весь цикл делится на два этапа: разовое подключение подписки и дальнейшие автоматические итерации. Для покупателя видна только первая часть — ввод карты; всё остальное происходит на стороне модуля.
- Покупатель выбирает подписку на сайте и оформляет первый заказ
- На странице оплаты Payonline вводит данные карты и подтверждает списание
- Шлюз проводит первый платёж и возвращает токен привязки карты
- Модуль сохраняет подписку и токен, фиксирует дату следующего списания
- По наступлении срока планировщик создаёт новый заказ в InSales
- Модуль отправляет в Payonline рекуррентный запрос и списывает оплату по токену
- После подтверждения от шлюза покупатель получает уведомление о новом заказе
Отдельно обрабатывается ситуация, когда списание не прошло — недостаточно средств, истёк срок карты или банк отклонил операцию. В этом случае платёж не теряется молча: подписка помечается как проблемная, попытка повторяется по заданному интервалу, а покупатель получает сигнал о том, что оплату нужно поправить.
Технические детали
Модуль живёт на отдельном сервере и общается с внешними сервисами только по API — так его логика не зависит от ограничений SaaS-витрины, а обновления не затрагивают сам магазин.
- API InSales — чтение каталога и создание заказов при каждой итерации подписки
- API Payonline — первичная оплата, получение токена и рекуррентные списания по нему
- Подписи и колбэки — контрольные суммы на секретном ключе и проверка уведомлений от шлюза
- База данных — подписки, их статусы, расписание и история списаний
- VPS — размещение модуля и планировщика на выделенном сервере
- Тестирование — автоматические тесты на ключевые сценарии оплаты и повторных списаний
Результат
У магазина, который платформа не задумывала подписочным, появился полноценный рекуррентный биллинг. Покупатель проходит оплату один раз, а дальше поставки и списания идут по циклу без ручных действий:
- Автоматические регулярные списания для подписок вместо ручного повторного оформления
- Данные карты покупатель вводит один раз, на защищённой странице шлюза
- Новые заказы создаются в InSales автоматически каждую неделю или месяц
- Неудачные списания не теряются: подписка помечается, попытка повторяется
- Личный кабинет, где клиент видит подписку и управляет ей