Перейти к содержимому
ZEVSLAB

Платежи и подписки

Платёжный контур, в котором технические отказы видны, отделены от банковских и не остаются без обработки

Интеграции платёжных провайдеров и доступных интерфейсов Kaspi, повторяющиеся списания, привязка карт, вебхуки, возвраты и сверка. Разбираем, где именно ломается оплата, и приводим денежный контур в состояние, за которое не страшно отвечать.

  • PHP
  • Laravel
  • PostgreSQL
  • MySQL
  • Redis
  • Очереди и планировщики
  • Вебхуки
  • REST API
  • Apple Pay
  • Google Pay
  • Kaspi API

01Симптомы

С чем обычно приходят

Ниже — типичные ситуации, с которых начинается предметный разговор.

  • Часть регулярных списаний не проходит, и никто не может объяснить, почему именно
  • Вебхуки провайдера обрабатываются повторно и создают дубликаты заказов или начислений
  • Платёж прошёл на стороне банка, но в системе не отразился — расхождения ищут вручную
  • Подписка продлевается после отмены или, наоборот, обрывается у платящего клиента
  • Возвраты и частичные возвраты делаются руками через личный кабинет провайдера
  • Нет единого места, где видно состояние платежа и историю его переходов
  • Подключение нового провайдера требует переписать половину кода оплаты
  • Статус оплаты или заказа Kaspi расходится с состоянием в CRM и учётной системе

02Охват

Когда это полезно

  • Вы запускаете подписочную модель и хотите заложить жизненный цикл корректно с первого раза
  • Доля неуспешных продлений выросла, и нужна диагностика, а не догадки
  • Нужно подключить второго провайдера или сменить текущего без простоя приёма оплат
  • Бухгалтерия не сходится с выгрузкой провайдера
  • Перед аудитом или сделкой нужно понять реальное состояние платёжного контура

Примеры задач

  • Интеграция платёжного провайдера с приёмом карт, Apple Pay и Google Pay
  • Обмен статусами заказов и оплат через доступные клиенту интерфейсы Kaspi
  • Рекуррентные списания: расписание, ретраи с экспоненциальной задержкой, лимит попыток
  • Привязка карты и повторные списания по сохранённому токену
  • Идемпотентная обработка вебхуков с защитой от повторов и гонок
  • Машина состояний платежа и подписки с полным журналом переходов
  • Возвраты, частичные возвраты и отмены, инициируемые из системы
  • Сверка внутренних записей с реестром провайдера и отчёт о расхождениях
  • Разделение провайдеров за общим интерфейсом, чтобы смена не ломала бизнес-логику
  • Аналитика платежей: причины отказов, конверсия попыток, поведение ретраев

03Результат

Что может войти в результат

Состав зависит от задачи. Ниже — типичные результаты, которые можно проверить, передать команде и использовать без постоянной зависимости от подрядчика.

Схема денежного контура

Диаграмма состояний платежа и подписки, перечень внешних событий и правил перехода. Документ, по которому команда понимает поведение системы без чтения кода.

Реализация в вашей кодовой базе

Код в вашем репозитории, в вашем стиле, с покрытием тестами критичных ветвей — ретраев, идемпотентности и обработки повторных вебхуков.

Инструменты диагностики

Журнал переходов, читаемые причины отказов и отчёт сверки, чтобы поддержка могла разобраться в конкретном платеже без обращения к разработчику.

Разбор рисков

Список сценариев, которые остались не покрыты, и что произойдёт, если они случатся. Честно — включая то, что мы не рекомендуем чинить прямо сейчас.

04Ход работы

Что происходит внутри проекта

  1. 01

    Диагностика

    Читаем код оплаты, логи и выгрузки провайдера. Ищем расхождения между тем, что система думает о платеже, и тем, что произошло на самом деле.

  2. 02

    Модель состояний

    Фиксируем, в каких состояниях бывает платёж и подписка, какие события их меняют и что считается недопустимым переходом.

  3. 03

    Идемпотентность и ретраи

    Повторная доставка события провайдера не приводит к повторному начислению или заказу. Неуспешное списание повторяется по заданным правилам и с ограничением числа попыток, а не по случайности.

  4. 04

    Сверка

    Ежедневное сопоставление с реестром провайдера. Расхождение становится видимым событием, а не находкой бухгалтера в конце месяца.

  5. 05

    Передача

    Документация, разбор с командой и поддержка на период стабилизации.

Схема 1Последовательность работ по направлению «Платежи и подписки»: каждый шаг заканчивается результатом, который можно проверить до перехода к следующему.

05Разборы

Как это выглядит на практике

Ход рассуждения, архитектурные решения и нештатные ситуации по этому направлению.

  • Обобщённый сценарийПодписочный сервис

    Как проектировать надёжные рекуррентные списания

    Обобщённый сценарий подписочного сервиса, который теряет продления на технических отказах. Разбираем машину состояний, идемпотентные вебхуки, управляемые ретраи и ежедневную сверку с провайдером.

    • PHP
    • Laravel
    • PostgreSQL
    • Redis
    • +3

06Форматы

Как можно начать

Конкретный объём и стоимость определяем после знакомства с системой. Первый этап можно заказать отдельно и использовать без продолжения работы с нами.

Аудит платёжного контура

Короткий формат для входа. Разбираем текущую реализацию, находим места потери денег и приоритизируем исправления. На выходе — отчёт и план, которым можно пользоваться без нашего дальнейшего участия.

Реализация платёжной подсистемы

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

Усиление команды

Работаем внутри вашего процесса над конкретной подсистемой. Подходит, когда команда есть, но платёжной экспертизы не хватает.

07Вопросы

Что обычно спрашивают

С какими платёжными провайдерами вы работаете?

Принцип работы у большинства провайдеров общий: создание платежа, редирект или виджет, вебхук о результате, токен для повторных списаний. Различия в деталях API изучаются по документации на старте проекта. Если провайдер новый для нас, мы говорим об этом прямо и закладываем время на изучение.

Можно ли подключить второго провайдера как резервный?

Да, и это одна из типовых задач. Провайдеры прячутся за общим интерфейсом, бизнес-логика не знает, кто именно проводит платёж. Переключение становится настройкой, а не переписыванием кода. Важно учесть, что токены карт не переносятся между провайдерами — это ограничение платёжной индустрии, а не архитектуры.

Как вы работаете с боевой системой, где идут реальные деньги?

Сначала тестовая среда провайдера, затем поэтапный вывод с возможностью отката. Изменения в денежном контуре не выкатываются целиком. Отдельно проговариваем, какие операции необратимы и как мы их страхуем.

Вы гарантируете, что неуспешных списаний не будет?

Нет, и никто не может. Часть отказов приходит от банка-эмитента: недостаточно средств, лимиты, блокировки. Инженерная задача — не потерять те платежи, которые могли пройти, и корректно обработать те, которые пройти не могли. Разницу между этими группами можно измерить, и именно с ней мы работаем.

Нужен ли доступ к боевой системе?

Для диагностики достаточно кода и обезличенных логов. Доступ к боевой среде обсуждается отдельно и оформляется по вашим правилам безопасности.

Обсудить задачу

Опишите текущее состояние системы и желаемый результат. Определим, относится ли задача к направлению «Платежи и подписки» и с какого шага разумно начать.