Обычный подход - это экспоненциальный откат - если вы потерпите неудачу, повторите попытку через одну секунду, затем через две, затем четыре и т. Д. С некоторым разумным ограничением (несколько часов), чтобы не тратить часы на ожидание. Это не должно происходить синхронно .Вы можете использовать какой-либо сервер очереди задач (RabbitMQ, Celery и т. Д.), Например, для запуска такой задачи в фоновом режиме.Вероятно, вы все равно должны выполнять платежные операции асинхронно, хотя, возможно, что они могут занять много времени.
Однако из моего прочтения API гибких платежей Amazon это не так.Это очень критичная по времени операция - если оставить маркер отправителя без ответа, у вас есть опция для инициирования платежа, но это не происходит автоматически.Таким образом, более простой подход может работать.Например, попробуйте отменить его сразу после получения нового токена.Если это не помогло, попробуйте еще раз в часовом задании cron.
Обратите внимание, конечно, что важно отслеживать, какой токен оплаты использовать.Предполагая, что вы используете ACID-совместимую базу данных (а вы действительно, ДЕЙСТВИТЕЛЬНО должны быть при работе с деньгами), это достаточно просто сделать - сохранить самый последний платежный токен у самого пользователя, а затем создать отдельную таблицу для хранения списка.токенов, срок действия которых истекаетЗатем просто обновите токен пользователя и добавьте старый токен в таблицу очистки за одну транзакцию.