Ошибки
Форма ответа об ошибке, коды отказов и что показывать клиенту
Отказ банка — это успешный HTTP-ответ с failureCode внутри. Ошибка
запроса — это HTTP-код.
Два разных вида ошибок
Ошибка запроса — вы отправили что-то не то или сейчас нельзя: приходит
HTTP-код 4xx или 5xx и объект error всегда одной формы: type — род ошибки,
code — машинный код, message — объяснение для человека, param — поле,
если ошибка относится к конкретному, и request_id.
Ветвитесь по type и code, а не по тексту message: текст мы можем уточнить
в любой момент, коды — нет.
{
"error": {
"type": "idempotency_error",
"code": "idempotency_key_reused",
"message": "Idempotency-Key уже использован с другим телом запроса",
"request_id": "req_4f2c8a1b9d3e"
}
}{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "pan должен состоять из 16 цифр",
"param": "pan",
"request_id": "req_4f2c8a1b9d3e"
}
}Отказ по платежу — запрос корректен, но банк не провёл операцию. HTTP-ответ
успешный, статус платежа FAILED, причина в failureCode. Не обрабатывайте
это как сбой интеграции.
{
"id": "cmsr9x8y",
"status": "FAILED",
"failureCode": "DECLINED"
}Идентификатор запроса
Каждый ответ содержит заголовок Request-Id, а в ошибках он ещё и в теле —
error.request_id. Сохраняйте его в своих журналах.
Когда что-то пойдёт не так, назовите нам этот идентификатор — мы найдём ваш запрос за секунду. Без него разбор начинается с вопроса «когда примерно это было», и на него редко есть точный ответ.
Если вы пришлёте свой Request-Id, мы используем его вместо своего — так
сквозная трассировка не рвётся на нашей границе.
HTTP-коды
| Код | Когда |
|---|---|
400 | Неверные данные запроса — поле не прошло проверку |
401 | Ключ отсутствует, неверен или отозван |
403 | Действие запрещено: нет доступа к боевому режиму, запрос с чужого домена |
404 | Объект не найден — или принадлежит другому продукту либо режиму |
409 | Конфликт: повтор ключа с другим телом, платёж уже обрабатывается |
410 | Сессия привязки истекла или закрыта |
429 | Слишком много запросов |
503 | Банковская рельса недоступна или не настроена |
Причины отказов
Что показать клиенту и стоит ли повторять:
| failureCode | Сообщение клиенту | Повтор |
|---|---|---|
INSUFFICIENT_FUNDS | Недостаточно средств на карте | Да, позже |
DECLINED | Банк отклонил операцию | Другой картой |
TIMEOUT | Платёж обрабатывается | Нет — дождитесь статуса |
CARD_INACTIVE | Карта заблокирована или неактивна | Другой картой |
CARD_NOT_FOUND | Карта не найдена | Проверьте номер |
CARD_NOT_INDIVIDUAL | Подходят только карты физических лиц | Другой картой |
EXPIRY_MISMATCH | Неверный срок действия карты | Проверьте срок |
WRONG_CODE | Неверный код из SMS | Да, до 5 попыток |
NOT_SUPPORTED | — | Операция недоступна на текущей рельсе: например частичный возврат или выплата |
Никогда не показывайте клиенту технический код
INSUFFICIENT_FUNDS в интерфейсе выглядит как сбой. Переводите коды
в понятные фразы — колонка «Сообщение клиенту» выше подойдёт как есть.