Перейти к содержанию

Отличия Sandbox от документации

Справочник для разработчика магазина и инженера поддержки: где ответы API в тестовой среде (Sandbox) расходятся с документацией Яндекс Пэй или описывают то, чего в ней нет. По таблице можно понять, какие ветки обработки ошибок в коде магазина не сработают и что проверить при разборе обращения.

Что проверено

Каждая строка подтверждена запросом в Sandbox 11–12 октября 2026 года, ссылка ведёт на лог. Поведение в Production не проверялось и может отличаться. Коды ошибок с причинами и рекомендациями — в справочнике Коды ошибок.

Возврат — POST /v2/orders/{order_id}/refund

Источник: описание метода возврата.

Ситуация В документации В Sandbox Что это значит Лог
Повтор возврата с тем же externalOperationId после того, как возврат запущен «Если процесс возврата был успешно запущен, то повторный вызов метода возврата с тем же externalOperationId вернет ошибку» DUPLICATE_EXTERNAL_OPERATION_ID 200 и та же операция (тот же operationId) с текущим статусом, в том числе после перехода в SUCCESS. Ошибка не приходит Ветка обработки DUPLICATE_EXTERNAL_OPERATION_ID в коде магазина не сработает. Повтор с тем же externalOperationId безопасен: второй возврат не создаётся. Повтор с новым externalOperationId проводит второй возврат 10, 11
refundAmount больше остатка заказа REFUND_AMOUNT_TOO_LARGE REFUND_AMOUNT_EXPECTATION_FAILED — и с корзиной (1 000 000,00 ₽ при заказе на 39 000,00 ₽), и без неё (10 000,00 ₽ при остатке 3 000,00 ₽) Обработчик REFUND_AMOUNT_TOO_LARGE не сработает. Сумму, которую ожидает API, сервер показывает в details.actual_refund_amount 07, шаги 2–3
refundAmount = 0.00 вместе с refundCart REFUND_AMOUNT_TOO_SMALL (меньше 1 рубля) или REFUND_NOT_POSITIVE_AMOUNT REFUND_AMOUNT_EXPECTATION_FAILED: сумма сверяется с корзиной раньше, чем проверяется на минимум. Без корзины не проверялось Ошибка про сумму почти всегда приходит как REFUND_AMOUNT_EXPECTATION_FAILED. Причину видно по details 07, шаг 1
Возврат без targetCart и refundCart Возвращается вся корзина. В списке ошибок есть ORDER_CART_EMPTY — не передана ни одна корзина ORDER_CART_EMPTY не приходит. Запрос считается возвратом остатка заказа: refundAmount сверяется с суммой, которая осталась после прошлых возвратов Чтобы вернуть остаток после частичных возвратов, передайте только refundAmount, равный остатку. Сумма больше остатка даёт REFUND_AMOUNT_EXPECTATION_FAILED, сумма меньше остатка не проверялась 07, шаг 3
В refundCart передана позиция, которая уже возвращена целиком productId — идентификатор позиции из исходной корзины. Неизвестный идентификатор вызывает ORDERUPDATE_UNKNOWN_ITEM_PRODUCT_ID Сервер сверяет productId с текущей корзиной. Возвращённая позиция из неё удалена и считается неизвестной, хотя в тексте ошибки написано «not present in the original cart» Партнёр видит «товара нет в корзине», хотя товар был в заказе. Проверьте, не возвращена ли позиция раньше: GET /v1/orders/{order_id} → operations и cart.items 09
Возврат по заказу в статусе REFUNDED Возврат возможен, если paymentStatus — CAPTURED или PARTIALLY_REFUNDED INVALID_PAYMENT_STATUS, в details.expected кроме этих двух статусов есть AUTHORIZED Возможно, возврат допустим и для заказа, который только авторизован. Не проверялось 08
В запросе поле с опечаткой в имени: targerCart вместо targetCart вместе с refundCart Не описано Неизвестное поле сервер молча игнорирует. Возврат прошёл по refundCart, хотя с правильным именем поля запрос вернул бы REFUND_ONLY_ONE_CART_EXPECTATION_FAILED Опечатка в имени поля не даёт ошибки, а меняет смысл запроса. При разборе обращения сверяйте имена полей с документацией посимвольно 12, для сравнения 06

Создание заказа — POST /v1/orders

Источник: описание метода создания заказа.

Ситуация В документации В Sandbox Что это значит Лог
total позиции не равен quantity.count × discountedUnitPrice Код не описан. Описан только ORDER_CART_DATA_ERROR: цена за единицу (total / quantity.count) должна иметь не больше двух знаков после запятой CART_ITEM_PRICE_MISMATCH, в details — cart_item_total, cart_item_quantity и cart_item_price В обработку ошибок создания заказа добавьте CART_ITEM_PRICE_MISMATCH. Частая причина — total посчитан по цене до скидки 02
Цена за единицу с тремя знаками после запятой ORDER_CART_DATA_ERROR Если цена передана в discountedUnitPrice и не сходится с total, приходит CART_ITEM_PRICE_MISMATCH. ORDER_CART_DATA_ERROR приходит, когда цены в позиции нет и сервер вычисляет её как total / quantity.count Обе ошибки означают проблему с ценой позиции. Какая придёт, зависит от того, передана ли цена явно 03, 04