Тема
Выплаты
Выплата — движение денег в обратную сторону: мерчант отправляет средства со своего счёта получателю. Технически это такая же транзакция, как платёж, с тем же путём через каскад гейтов и драйверы, но с двумя принципиальными отличиями: деньги наши собственные, и проверять их достаточность нужно до обращения к банку.
Чем отличается от платежа
| Платёж | Выплата | |
|---|---|---|
| Направление денег | К мерчанту | От мерчанта |
| Что проверяем перед банком | Лимиты и антифрод | Прежде всего наличие средств на счёте |
| Чьи реквизиты нужны | Плательщика | Получателя |
| Аутентификация держателя | 3DS | Не применяется |
| Риск ошибки | Не приняли деньги | Отправили деньги не туда |
Отсутствие 3DS — важное следствие: в выплате нет шага, на котором операцию подтверждает человек. Значит, нет и естественной паузы, во время которой можно одуматься, а неверные реквизиты приводят к реальной потере денег.
Как это выглядит целиком
Как это происходит
Мерчант инициирует выплату через публичный API — Create withdrawal transaction, указав сумму, валюту и реквизиты получателя. Если реквизит — карта, запрос обязан прийти в PCI-контур, как и любой другой запрос с карточными данными. Есть и вариант, когда реквизиты вводит не сервер мерчанта, а человек: тогда используется отдельная форма токенизации, и карта попадает к нам оттуда.
Ядро создаёт транзакцию типа «выплата» и сразу проверяет счёт. Если доступных средств не хватает, операция отклоняется, не дойдя до банка. При создании выплаты сумма помещается в удержание — это защита от того, чтобы одни и те же деньги ушли дважды, пока первая выплата в обработке.
Дальше путь знакомый: выбор гейта в каскаде, обращение к драйверу, ответ банка, при необходимости переспрос статуса, финализация и уведомление мерчанта. Мерчант может и сам спросить результат — Check transaction status работает одинаково для платежей и выплат. Не все гейты умеют выплаты — каскад для них обычно настроен отдельно от приёма платежей.
Разделённые выплаты
Крупную выплату иногда невозможно провести одной операцией: у банка есть лимит на разовый перевод. В этом случае система разбивает её на части, каждая из которых проводится самостоятельно, а родительская транзакция отражает общий результат. При разборе такой операции всегда нужно смотреть и на родителя, и на части: успех одной части не означает успеха выплаты целиком.
Блокировки
Выплаты можно приостановить — как для конкретного мерчанта, так и в целом. Это операционный инструмент, которым пользуются, когда есть подозрения или когда идёт разбирательство. Для разработчика это означает, что отказ выплаты не всегда техническая ошибка: сначала стоит проверить, не действует ли блокировка.
Где ломается чаще всего
| Симптом | Обычная причина |
|---|---|
| Отказ сразу после запроса | Недостаточно доступных средств: сумма есть, но она в удержании |
| Отказ без обращения к банку | Действует блокировка выплат или в каскаде нет гейта, умеющего выплаты |
| Выплата зависла | Банк не ответил окончательно, работает переспрос статуса |
| Часть суммы ушла, часть нет | Разделённая выплата, часть операций не прошла |
| Сумма отличается от запрошенной | Округление до шага, поддерживаемого банком |
Куда дальше
- Платёж картой server-to-server — общая часть пути.
- Баланс, комиссии, финализация — откуда берётся «доступно» и почему оно меньше баланса.
- Как выбирается банк — почему для выплат свой каскад.