- PHP · Symfony / Laravel
- PostgreSQL
- Redis
- Docker / Podman
- GitLab CI/CD
Задача
Международный приём платежей упирается в зависимость от одного провайдера: его авария, дневной лимит или отказ в регионе останавливают приём денег целиком. Подключение нового PSP при этом обычно означает правку платёжной логики — изменение там, где цена ошибки равна сумме непрошедших операций.
Сравнить каналы между собой тоже не на чем: статистика остаётся в кабинетах провайдеров, каждая в своём формате.
Решение
Провайдеры скрыты за общим слоем маршрутизации: операция уходит в канал по правилам — регион, способ оплаты, валюта, доступность провайдера, — а при отказе или срабатывании лимита повторяется в резервном. Ответы провайдеров приводятся к одной модели статусов, поэтому продукт работает с одним платёжным интерфейсом, а не с пятью.
Подключение нового PSP — это его адаптер и правило маршрутизации, а не изменение платёжной логики. Статистика по каналам собирается в одном месте: доля успешных операций, стоимость эквайринга и время подтверждения по каждому провайдеру и в сравнении.
Результат
Приём денег перестал зависеть от состояния одного провайдера: отказ канала переводит трафик на резервный, а не останавливает продажи. Новый PSP подключается настройкой, платёжная логика при этом не меняется. Выбор канала стал управляемым решением — по доле успешных операций и стоимости, а не по тому, с кем однажды заключили договор.