@AndreyBLG

Как обеспечить идемпотентность запросов к API?

Приветствую.
Подскажите как правильно реализовать идемпотентность для запросов к сервисам API?
Сайт на WP, выполняет запросы к платежному шлюзу.
В параметрах нужно передавать ключ идемпотентности.
Что в таком случае нужно использовать?
Или точнее где хранить ключ, если потребуется повторить запрос?
К примеру клиент приходит на стр. оплаты, заполняет форму и нажимает "Оплатить".
Нужно сгенерить уникальный ключ идемпотентности и отправить запрос на создание платежа.
Такой запрос содержит приватные данные, поэтому отправляться будет с сервера.
Вместе с запросом умрут и все его данные, когда он будет завершен.
При этом, допустим, возникнет необходимость отправить запрос повторно.
Где все это время хранить созданный для этого Idempotence-Key?
Записать в куки, или работать с сессией, или писать в бд?
Как это делается правильно? Поделитесь пожалуйста опытом.
Как этот ключ обновлять, в случае успешной оплаты? Вдруг клиенту нужно будет сделать второй платеж.
После того, как платеж прошел, клиент возвращается на сайт по указанной ссылке (confirmation->return_url), можно, например, здесь проверить наличие куки (если хранить в ней) и удалить ее.

Что делать, чтобы не изобретать костылей?
  • Вопрос задан
  • 551 просмотр
Решения вопроса 1
neuotq
@neuotq
Прокрастинация
С кукисами и прочим оставьте это на стандарты что уже вам даёт WP(и/или плагины что вы там используете).
После нажатия купить, у вас создаётся запись о покупке в БД, со статусом не оплачен. У покупки во всех системах для создания инет магазинов и тп уникальный айди, вот на основе его и можно генерировать уникальный (допустим
с помощью crypt) ключ идемпотентности.
После успешной оплаты в БД статус меняется на оплчен и этот заказ и его айди больше никогда не используется. Даже при повторной покупке это будет уже клон этой, но с новым айди.
Таким образом и себя защитите и в целом простое и относительно надёжное решение.
Могут быть нюансы только когда оплата прошла, а ваш сервис это узнать через обратный webhook не смогла(допустим был лаг и тп) и запись в БД не стала - оплачен. Но обычно платёжные шлюзы даёт проверять статусы оплаты и по запросу, поэтому если не приходит ответ там в течении какого-то времени, можно запрашивать в ручную. Ну и затем в любом случае устаревает запрос на оплату(почти во всех платёжках есть тайм аут на то, в какое время можно оплатить уже после создания инвойса на их стороне), так что и тут в целом все норм.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы