Тема
Платёжная система за десять минут
Если вы только пришли в команду, прочитайте сначала эту страницу и словарь. Остального пока не нужно.
Что мы делаем
Интернет-магазин не может сам списать деньги с карты покупателя. Между ним и банками стоит цепочка посредников, и мы — одно из её звеньев. Магазин (мы называем его мерчантом) передаёт нам запрос на списание, мы находим подходящий банк, проводим через него операцию, разбираемся с подтверждением от держателя карты и сообщаем магазину результат. За это берём комиссию.
Банк-эмитент выпустил карту плательщика. Банк-эквайер умеет принимать платежи и имеет договор с платёжной системой. Мы не храним деньги мерчанта в банковском смысле, но ведём его счёт у себя: сколько принято, сколько удержано, сколько можно вывести.
Почему это сложнее, чем кажется
Три обстоятельства определяют почти всю архитектуру продукта.
Платёж не мгновенный. Банк редко отвечает сразу: чаще всего он требует, чтобы плательщик подтвердил операцию на своей странице (это и есть 3DS). Значит, между запросом и результатом проходит время, в течение которого мы не управляем процессом, а плательщик может просто закрыть вкладку. Поэтому система устроена вокруг ожидания: отложенные проверки статуса, таймауты, повторные опросы банка.
Банков много, и все разные. У каждого свой формат запросов, свои коды ошибок, свои причуды. Мы прячем это за единым внутренним интерфейсом: код, который говорит с конкретным банком, называется драйвером, и их больше сотни. Всё остальное ядро не знает, с кем именно работает.
Карточные данные — радиоактивный материал. Номер карты и CVV нельзя просто так передавать между сервисами и класть в логи: это регулируется стандартом PCI DSS. Поэтому у нас есть отдельный изолированный контур, куда карта попадает, и отдельный сервис, который меняет её на токен. Дальше по системе ходит токен.
Как выглядит типичный платёж
Мерчант присылает запрос с картой. Мы заводим у себя транзакцию, меняем карту на токен, проверяем платёж антифродом, выбираем банк и отправляем операцию туда. Банк возвращает ссылку на страницу подтверждения — мы отдаём её мерчанту, а он перенаправляет плательщика. Пока тот подтверждает операцию, мы периодически спрашиваем банк, чем всё кончилось. Получив окончательный ответ, пересчитываем баланс мерчанта и отправляем ему уведомление о результате.
Это и есть базовый платёжный флоу — подробно расписанный по шагам. Остальные сценарии продукта (оплата через нашу форму, выплаты, крипта, региональные способы) — надстройки над ним.
Что читать дальше
Следом — словарь и базовый платёжный флоу, затем статусы и стадии и карточки сервисов критического пути. Полный маршрут — на главной странице.