Перестаньте повертати кошти за платежі, які не варто було списувати

Багато розробників впроваджують процес оформлення замовлення, який миттєво списує кошти з картки. Потім вони запускають перевірку замовлення, наприклад, перевірку наявності товару на складі або перевірку на шахрайство.

Якщо перевірка не проходить, код ініціює повернення коштів (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