Перестаньте повертати кошти за платежі, які не варто було списувати
Багато розробників впроваджують процес оформлення замовлення, який миттєво списує кошти з картки. Потім вони запускають перевірку замовлення, наприклад, перевірку наявності товару на складі або перевірку на шахрайство.
Якщо перевірка не проходить, код ініціює повернення коштів (refund).
Це створює проблеми для ваших клієнтів. Вони бачать списання, а через кілька днів — повернення. Вони починають вважати вашу компанію ненадійною або думати, що їхні гроші заблоковані.
Повернення коштів мають реальні витрати:
- Клієнти втрачають довіру, коли бачать дві окремі транзакції.
- Повернення коштів відображається у банківській виписці протягом 5–10 днів.
- Ви можете втрачати гроші на комісіях за транзакції або на курсах обміну валют.
- Платіжні системи позначають часті цикли «списання-повернення» як високий ризик.
Рішенням є використання моделі authorize and capture (авторизація та захоплення коштів).
Більшість навчальних посібників вчать миттєво захоплювати (capture) гроші. Натомість спочатку варто зробити резервування (hold) коштів. Резервування блокує суму на картці, не переміщуючи гроші. Якщо перевірка не проходить, ви просто скасовуєте резервування. У такому разі списання взагалі не з'явиться у виписці клієнта.
У Stripe це робиться шляхом встановлення capture_method у значення manual.
Новий процес працює так:
- Створіть
PaymentIntentіз ручним захопленням (manual capture). - Кошти авторизовані, але не переміщені.
- Запустіть перевірку замовлення.
- Якщо замовлення коректне, виконайте захоплення платежу (
capture). - Якщо замовлення не проходить перевірку, скасуйте
intent.
Цей підхід має кілька переваг:
- Ви уникаєте необхідності робити повернення коштів.
- Скасована авторизація просто зникає з виписки клієнта.
- Ви можете виконувати часткове захоплення (partial captures). Якщо клієнт купує три товари, але один із них закінчився на складі, ви захоплюєте суму лише за два товари.
- Ви створюєте чистий аудиторський слід у своїх логах.
Більшість великих платіжних провайдерів використовують ту саму логіку:
- 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