Сценарий.
1. Пользователь вводит данные карты в форму Stripe на сайте.
2. Бэкенд его "биллит" и вносит данные в базу, что оплата прошла.
Псевдокод
$result = Stripe::charge($customerId, $amount);
if ($result->paid) {
Billing::create($customerId, $amount);
}
Варианты ошибок.
1. charge произошел, но оборвалось сетевое соединение в процессе доставки, и мы не получили информацию о нем
2. charge произошел, мы получили информацию, но в этот момент база решила упасть/отключили свет/кончился заряд аккумулятора ИБП
В обоих случаях денег у пользователя уже нет, а у нас информации об этом тоже нет.
Вариант решения: скрипт, который раз в N минут получает список последних успешных транзакций из Stripe и сверяет с теми, которых у нас еще нет.
Не велосипед ли я пытаюсь изобрести? Есть ли best practice для таких случаев? Речь не только о Stripe, а о любой платежной системе, где информация о факте платежа доставляется единожды и синхронно, а не в виде коллбэков, которые обычно пытаются доставить несколько раз.