Правильная обработка ошибок в финансовых транзакциях?

Сценарий.

1. Пользователь вводит данные карты в форму Stripe на сайте.
2. Бэкенд его "биллит" и вносит данные в базу, что оплата прошла.

Псевдокод
$result = Stripe::charge($customerId, $amount);
if ($result->paid) {
    Billing::create($customerId, $amount);
}


Варианты ошибок.
1. charge произошел, но оборвалось сетевое соединение в процессе доставки, и мы не получили информацию о нем
2. charge произошел, мы получили информацию, но в этот момент база решила упасть/отключили свет/кончился заряд аккумулятора ИБП

В обоих случаях денег у пользователя уже нет, а у нас информации об этом тоже нет.

Вариант решения: скрипт, который раз в N минут получает список последних успешных транзакций из Stripe и сверяет с теми, которых у нас еще нет.

Не велосипед ли я пытаюсь изобрести? Есть ли best practice для таких случаев? Речь не только о Stripe, а о любой платежной системе, где информация о факте платежа доставляется единожды и синхронно, а не в виде коллбэков, которые обычно пытаются доставить несколько раз.
  • Вопрос задан
  • 296 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Doc44
Предусмотрено:
https://stripe.com/docs/webhooks
Ответ написан
Комментировать
@dmtrrr
Backend developer
Вариант решения: скрипт, который раз в N минут получает список последних успешных транзакций из Stripe и сверяет с теми, которых у нас еще нет.


Нормальный вариант.
Ответ написан
@boss_lexa
на каждую новую транзакцию устанавливаете таймаут ожидания оплаты например 20 минут,
и потом каждые N минут посылаете запрос на платежный сервер о статусе транзакций, у которых еще не истек таймаут
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы