ProtoPays · API
кабинет

идемпотентность

В API одновременно существуют три разных понятия с похожими названиями. Путать их нельзя: от этого зависит, повторит ли сервер тот же платёж или создаст новый объект.

сводка: что с чем не смешивать

МеханизмГде задаётсяУчаствует в дедупликации на сервере?
Бизнес-идемпотентность платежейТело POST /api/v1/payments: поле orderId + канал оплаты (method / rubCollect.method)Да — это основной механизм
Идемпотентность депозитовТело POST /api/v1/deposits: поле idempotencyKey (UUID) в рамках одной кассыДа — только для этого метода
HTTP-заголовок Idempotency-KeyЗаголовок запроса (любой непустой идентификатор по вашему выбору)Нет — сервер не сопоставляет его с созданием сущностей и не отменяет повторные запросы по этому ключу

1. платежи: бизнес-идемпотентность по orderId

Для POST /api/v1/payments сервер сопоставляет повторные запросы по связке: ваш мерчант + строка orderId (после trim) + канал оплаты. Повтор с тем же orderId и тем же каналом возвращает тот же платёж и согласованные данные, а не вторую оплату.

Заголовок Idempotency-Key на это поведение не влияет — даже если вы каждый раз отправляете новый UUID в заголовке, роль «ключа идемпотентности» для платежа играет только orderId в теле (и канал).

2. депозиты: поле idempotencyKey в теле

Для POST /api/v1/deposits дедупликация завязана на поле idempotencyKey в JSON-теле и на продуктовой кассе. Это другой объект и другой контракт, не путайте с orderId у платежей и с HTTP-заголовком Idempotency-Key.

Повтор с тем же idempotencyKey и той же кассой возвращает ту же заявку; тот же ключ при другой кассе — ответ с конфликтом (HTTP 409, код idempotency_key_conflict).

3. заголовок Idempotency-Key

Вы можете передавать заголовок Idempotency-Key для собственных логов и корреляции у себя. На стороне API он не используется как ключ идемпотентности: повтор с другим телом или другим orderId не будет «отменён» или слился только из-за заголовка.

см. также