Перестаньте возвращать платежи, которые не должны были списывать
Многие разработчики внедряют процесс оплаты, при котором деньги списываются с карты мгновенно. Затем они запускают проверку заказа, например, проверку наличия товара на складе или проверку на мошенничество.
Если проверка не проходит, код инициирует возврат (refund).
Это создает проблемы для ваших клиентов. Они видят списание, а через несколько дней — возврат. Они начинают думать, что вашей компании нельзя доверять, или что их деньги «зависли».
Возвраты несут реальные издержки:
- Клиенты теряют доверие, когда видят две отдельные транзакции.
- Возврат средств отображается в банковской выписке в течение 5–10 дней.
- Вы можете терять деньги на комиссиях за транзакции или на курсах обмена валют.
- Платежные системы помечают частые паттерны «списание и возврат» как высокорисковые.
Решение заключается в использовании модели «авторизация и подтверждение» (authorize and capture).
В большинстве обучающих материалов учат списывать (capture) деньги мгновенно. Вместо этого сначала следует заблокировать (hold) средства. Блокировка удерживает сумму на карте, не перемещая деньги. Если проверка не проходит, вы просто отменяете холд. В выписке клиента списание так и не появится.
В Stripe это делается путем установки capture_method в значение manual.
Новый процесс выглядит так:
- Создайте
PaymentIntentс ручным подтверждением (manual capture). - Средства авторизуются, но не перемещаются.
- Выполните проверку заказа.
- Если заказ валиден, подтвердите платеж (capture).
- Если заказ не прошел проверку, отмените
intent.
Этот подход дает несколько преимуществ:
- Вам не придется делать возвраты.
- Отмененная авторизация просто исчезает из выписки клиента.
- Вы можете выполнять частичное подтверждение (partial capture). Если клиент покупает три товара, но один из них отсутствует на складе, вы подтверждаете оплату только за два товара.
- Вы создаете чистый аудиторский след в своих логах.
Большинство крупных платежных провайдеров используют ту же логику:
- Stripe использует
capture_method: manual. - Adyen использует задержки ручного подтверждения (manual capture delays).
- Braintree использует
submitForSettlement: false. - PayPal использует
intent: AUTHORIZE.
Используйте этот метод, если какая-либо часть вашей бизнес-логики может дать сбой после того, как клиент нажмет кнопку оплаты. Перенесите рискованные проверки в промежуток между авторизацией и подтверждением. Это обеспечит чистоту денежных операций и лояльность ваших клиентов.
Source: https://dev.to/jguillaumesio/stop-refunding-payments-you-should-never-have-charged-4d7m