Перестаньте возвращать платежи, которые не должны были списывать

Многие разработчики внедряют процесс оплаты, при котором деньги списываются с карты мгновенно. Затем они запускают проверку заказа, например, проверку наличия товара на складе или проверку на мошенничество.

Если проверка не проходит, код инициирует возврат (refund).

Это создает проблемы для ваших клиентов. Они видят списание, а через несколько дней — возврат. Они начинают думать, что вашей компании нельзя доверять, или что их деньги «зависли».

Возвраты несут реальные издержки:

Решение заключается в использовании модели «авторизация и подтверждение» (authorize and capture).

В большинстве обучающих материалов учат списывать (capture) деньги мгновенно. Вместо этого сначала следует заблокировать (hold) средства. Блокировка удерживает сумму на карте, не перемещая деньги. Если проверка не проходит, вы просто отменяете холд. В выписке клиента списание так и не появится.

В Stripe это делается путем установки capture_method в значение manual.

Новый процесс выглядит так:

  1. Создайте PaymentIntent с ручным подтверждением (manual capture).
  2. Средства авторизуются, но не перемещаются.
  3. Выполните проверку заказа.
  4. Если заказ валиден, подтвердите платеж (capture).
  5. Если заказ не прошел проверку, отмените intent.

Этот подход дает несколько преимуществ:

Большинство крупных платежных провайдеров используют ту же логику:

Используйте этот метод, если какая-либо часть вашей бизнес-логики может дать сбой после того, как клиент нажмет кнопку оплаты. Перенесите рискованные проверки в промежуток между авторизацией и подтверждением. Это обеспечит чистоту денежных операций и лояльность ваших клиентов.

Source: https://dev.to/jguillaumesio/stop-refunding-payments-you-should-never-have-charged-4d7m