Платежная система

Модуль платежей для товаров по подписке на 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: первичный платёж и последующие рекуррентные списания по токену
  • Планировщик, который по расписанию инициирует очередное списание и создаёт заказ
  • Хранилище подписок с их статусами, датами следующего списания и историей платежей
  • Проверку подписи входящих уведомлений и разграничение доступа к платёжным операциям

Как работает

Весь цикл делится на два этапа: разовое подключение подписки и дальнейшие автоматические итерации. Для покупателя видна только первая часть — ввод карты; всё остальное происходит на стороне модуля.

  1. Покупатель выбирает подписку на сайте и оформляет первый заказ
  2. На странице оплаты Payonline вводит данные карты и подтверждает списание
  3. Шлюз проводит первый платёж и возвращает токен привязки карты
  4. Модуль сохраняет подписку и токен, фиксирует дату следующего списания
  5. По наступлении срока планировщик создаёт новый заказ в InSales
  6. Модуль отправляет в Payonline рекуррентный запрос и списывает оплату по токену
  7. После подтверждения от шлюза покупатель получает уведомление о новом заказе

Отдельно обрабатывается ситуация, когда списание не прошло — недостаточно средств, истёк срок карты или банк отклонил операцию. В этом случае платёж не теряется молча: подписка помечается как проблемная, попытка повторяется по заданному интервалу, а покупатель получает сигнал о том, что оплату нужно поправить.

Технические детали

Модуль живёт на отдельном сервере и общается с внешними сервисами только по API — так его логика не зависит от ограничений SaaS-витрины, а обновления не затрагивают сам магазин.

  • API InSales — чтение каталога и создание заказов при каждой итерации подписки
  • API Payonline — первичная оплата, получение токена и рекуррентные списания по нему
  • Подписи и колбэки — контрольные суммы на секретном ключе и проверка уведомлений от шлюза
  • База данных — подписки, их статусы, расписание и история списаний
  • VPS — размещение модуля и планировщика на выделенном сервере
  • Тестирование — автоматические тесты на ключевые сценарии оплаты и повторных списаний

Результат

У магазина, который платформа не задумывала подписочным, появился полноценный рекуррентный биллинг. Покупатель проходит оплату один раз, а дальше поставки и списания идут по циклу без ручных действий:

  • Автоматические регулярные списания для подписок вместо ручного повторного оформления
  • Данные карты покупатель вводит один раз, на защищённой странице шлюза
  • Новые заказы создаются в InSales автоматически каждую неделю или месяц
  • Неудачные списания не теряются: подписка помечается, попытка повторяется
  • Личный кабинет, где клиент видит подписку и управляет ей

Технологии

InSales Payonline API интеграция Рекуррентные платежи Подписки База данных E-commerce