Skip to Content

Ошибки JSON v3: HTTP-коды

Тело ошибки одинаково у всех кодов: {"success": false, "error": {"code": "…", "message": "…", "next_step": "…"}}. Разбирайте error.code, а не тексты — они могут меняться. Колонка «чем воспроизвести» — готовые способы получить каждый код в песочнице.

error.next_step — императивная инструкция, что сделать дальше («возьмите свежий X-Timestamp», а не «неверная метка времени»): ошибка читается не человеком в логе, а следующей итерацией вашего кода или ИИ-агента. Поле песочницы — в боевом контракте его нет, завязываться на него в логике не нужно.

HTTPerror.codeКогдаЧто делатьЧем воспроизвести
401AUTH_INVALID_SIGNATUREПодпись не сошлась, нет заголовков аутентификации, версия подписи не поддержана или логин не найден — конкретная причина в error.messageПересчитайте по формуле; частые причины — подписан не тот timestamp или лишние пробелы в секретеЗаменить X-Signature на 64 нуля; запрос без заголовков; X-Signature-Version: 2; несуществующий логин
401AUTH_INVALID_TIMESTAMPДрейф времени больше ±20 минутВозьмите свежий UTC-timestamp; проверьте часы сервера и что время именно UTCX-Timestamp суточной давности
403AUTH_INVALID_PROJECTproject_id не принадлежит партнёру или неактивенИспользуйте свой project_id; в песочнице — 1001/projects/999999/invoices
400BAD_REQUESTТело POST /invoices — не JSON-объектОтправляйте JSON-объект; счёт при этом не создаётсяТело not json
400TEST_CALLBACK_URL_FORBIDDENtest_info.callback_url без разрешения у партнёраАдрес коллбека настраивается для проекта; за флагом — к администраторам sandboxПередать callback_url на демо-доступах
409INVOICE_ALREADY_EXISTSУ клиента уже есть незакрытый инвойс; его id — в error.details.invoice_idПрочитайте существующий инвойс или отмените его, вместо создания второго заказаДва POST /invoices подряд для одного msisdn
404INVOICE_NOT_FOUNDИнвойса с таким id нет в этом проектеПроверьте invoice_id и project_idGET /invoices/{случайный-uuid}
422INVALID_PAYMENT_METHODНеизвестный payment_methodДопустимы sbp, sberpay_desktop, sberpay_mobile либо поле не передаётся (карта)"payment_method": "paypal"
422INVOICE_NOT_PAIDВозврат по неоплаченному инвойсуДождитесь payment_status: PAIDrefund сразу после создания
422INVOICE_NOT_AUTHORIZEDНеверный PIN; в ответе — остаток попытокВ песочнице верный PIN — 1234"pin_code": "0000"
422INVOICE_AUTH_ATTEMPTS_EXCEEDEDТри попытки PIN исчерпаны — инвойс больше не примет авторизацию, даже с верным кодомСоздайте новый инвойсТри неверных PIN подряд
409CONTRACT_DRAFT_EXISTSКонтракт с этим merchant_contract_id уже создан и ждёт PIN; его id — в error.details.contract_idПодтвердите существующий контракт вместо создания второгоДва POST /contracts подряд с одним merchant_contract_id
409CONTRACT_ALREADY_EXISTSКонтракт с этим merchant_contract_id уже подтверждён; его id — в error.details.contract_idСписывайте по существующему контрактуPOST /contracts с номером подтверждённого контракта
404CONTRACT_NOT_FOUNDКонтракт неизвестен или отменёнПроверьте contract_id и project_idPOST /contracts/{случайный-uuid}/authorize
409CONTRACT_ALREADY_AUTHORIZEDКонтракт уже подтверждёнПовторно подтверждать не нужноВторой authorize того же контракта
422CONTRACT_NOT_AUTHORIZEDНеверный PIN контрактаВ песочнице верный PIN — 1234"pin_code": "0000" в POST /contracts/{contract_id}/authorize
422CONTRACT_AUTH_ATTEMPTS_EXCEEDEDТри попытки PIN исчерпаны — контракт не примет даже верный кодПодтвердить этот контракт уже нельзяТри неверных PIN подряд

Ещё три кода зависят от настроек и инфраструктуры: TEST_CALLBACK_URL_REJECTED и TEST_CALLBACK_URL_RATE_LIMITED получают только партнёры с включённым test_info.callback_url (см. «Песочные ручки»), а SERVICE_UNAVAILABLE (503) означает, что песочница не смогла собрать заготовленный ответ — повторите запрос.

Тело ошибки
{ "success": false, "error": { "code": "INVOICE_NOT_AUTHORIZED", "message": "Wrong PIN, 2 attempts left" } }
Ошибки аутентификации — в том же конверте
// 401 и 403 приходят в том же конверте {success, error}, // что и остальные ошибки { "success": false, "error": { "code": "AUTH_INVALID_SIGNATURE", "message": "…" } }