Платёжный бэкенд для интернет-магазина: как подключить сразу несколько платёжных систем
Одна платёжная система - точка отказа: упала она, упали все продажи. Разбираю, как устроена связка из нескольких платёжек с автоматической выдачей товара и что учесть, чтобы это не превратилось в хаос дублей и потерянных заказов.
Несколько платёжных систем в одном магазине снижают риск простоя, но требуют общего слоя, который приводит разные форматы уведомлений об оплате к единому событию «заказ оплачен» - без этого слоя легко получить дубли заказов или пропущенные оплаты. Автоматическая выдача товара должна срабатывать только после надёжного подтверждения от платёжной системы (вебхук + сверка), а не по факту перехода пользователя на страницу «спасибо».
Одна платёжка - это точка отказа
Магазин с одной платёжной системой полностью зависит от её доступности: если сервис лёг на час в разгар распродажи, все продажи встают вместе с ним. Вторая и третья платёжная система - это не только про разные способы оплаты для покупателя, но и про устойчивость самого бизнеса. Проблема в том, что у каждой платёжки свой формат уведомлений и своя логика подтверждения - без общего слоя над ними легко получить путаницу вместо надёжности.
Три блока архитектуры
Адаптеры платёжек
Каждая платёжная система подключается через свой адаптер, который приводит её формат уведомления к единому внутреннему событию «заказ оплачен» - остальная система не знает и не должна знать, через какую платёжку прошла оплата.
Сверка и подтверждение
Выдача товара запускается только после надёжного подтверждения оплаты (вебхук от платёжки, при необходимости - сверка суммы), а не по факту перехода пользователя на страницу «спасибо за заказ», которую легко открыть напрямую без оплаты.
Автоматическая выдача
После подтверждения система сама открывает доступ или отправляет товар - без ручного участия, но с логом каждой выдачи, чтобы можно было проверить любой заказ постфактум.
Самая частая ошибка - доверять только редиректу
Частая уязвимость самодельных интеграций - запускать выдачу товара сразу, как только браузер пользователя вернулся на страницу успеха после оплаты. Проблема в том, что на эту страницу можно перейти напрямую, минуя саму оплату - вручную набрав адрес или откатив платёж после получения товара. Надёжная схема требует подтверждения именно со стороны платёжной системы (серверный вебхук), а переход пользователя на страницу успеха - это просто пользовательский опыт, не источник истины.
Одна платёжка или несколько
Таблица прокручивается вбок на телефоне →
Параметр
Одна платёжная система
Несколько платёжных систем
Риск простоя при сбое
Останавливаются все продажи
Продажи продолжаются через резервную
Сложность интеграции
Ниже - один формат уведомлений
Выше - нужен общий слой адаптеров
Охват способов оплаты
Ограничен одним провайдером
Шире - разные карты, кошельки, СБП
Стоит начинать с
Простого магазина с небольшим оборотом
Магазина, где простой ощутимо стоит денег
Чек-лист перед подключением
Сохраните себе
Приводите уведомления всех платёжек к единому внутреннему событию, не завязывайтесь на формат конкретной системы напрямую.
Запускайте выдачу товара только по серверному подтверждению от платёжки, не по редиректу пользователя.
Логируйте каждую выдачу с привязкой к конкретному платежу - пригодится при споре или возврате.
Проверьте обработку повторного уведомления от платёжки - оно не должно выдавать товар дважды.
Протестируйте сценарий сбоя одной платёжки - заказы должны продолжать проходить через оставшиеся.
Частые вопросы
С какого оборота имеет смысл подключать вторую платёжную систему?
Как только простой платёжной системы становится ощутимой потерей денег - для небольшого магазина одной системы часто достаточно на старте.
Можно ли выдавать товар сразу после редиректа на страницу успеха оплаты?
Не рекомендуется - на такую страницу можно попасть без реальной оплаты. Выдача должна запускаться по серверному подтверждению.
Как избежать двойной выдачи товара при повторном уведомлении от платёжки?
Проверять по идентификатору платежа, была ли уже выдача для него, прежде чем выполнять её повторно.