---
metadata:
  - name: generator
    content: Diplodoc Platform v5.55.3
alternate:
  - https://pay.yandex.ru/docs/ru/hold/index.md
  - href: ru/hold/index.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    type: text/markdown
    title: llms.txt
title: "Холдирование платежей в Яндекс\_Пэй\_— двухстадийная оплата и предавторизация | Документация"
description: "Настройте холдирование средств для безопасных платежей. Инструкция по отложенной оплате, двухстадийным платежам и предавторизации в Яндекс\_Пэй."
---
> **Documentation Index:** Fetch the complete configuration index at https://pay.yandex.ru/docs/ru/llms.txt


# Холдирование средств

Холдированием денежных средств еще называют отложенную оплату, двухстадийные платежи или предавторизацию.

Покупатель выбирает товар, но при оплате средства не снимают, а сначала замораживают на его счете. Полностью деньги снимают после подтверждения от продавца.

Холдирование подходит продавцам, которые берут предоплату: при бронировании жилья или билетов на транспорт, аренде, продаже туристических путевок и так далее. Например, с предоплатой можно управлять частичной или полной отменой заказов.

Использование сценария холдирования дает преимущества при возврате средств клиенту, но только пока деньги заморожены: отмена операции проходит быстрее и без комиссии за эквайринг. Если средства уже списаны, возврат выполняется по стандартной схеме.

## Как это работает? {#how-it-works}

{% note info %}

Холдирование не подключено по умолчанию и своей функциональностью дополняет [базовую механику](https://pay.yandex.ru/docs/ru/payments/basic.md). Ознакомьтесь с ней, чтобы лучше понимать, как все работает. Подробнее о механиках оплаты читайте в разделе [Способы оплаты и платежные механики](https://pay.yandex.ru/docs/ru/payments/index.md).

Чтобы подключить и настроить холдирование, обратитесь в [поддержку](https://forms.yandex.ru/surveys/13490261.f4adc83a2c75b10abe163bf264af4e3842a535e0/).

{% endnote %}

<!-- source: ru/_includes/postman-link.md -->
{% note tip %}

Для знакомства с платежными механиками [API Яндекс Пэй](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/index.md) используйте готовую Postman-коллекцию.

<a class="custom-g-button custom-g-button_view_normal custom-g-button_size_l" href="https://doc-static.yandex.net/src/support/yandex_pay/postman/yandex-pay-api_postman-collection_v5_22-12-2025.zip" target="_blank" download>
  <span class="g-button__text">
    Скачать коллекцию
  </span>
</a>

{% endnote %}
<!-- endsource: ru/_includes/postman-link.md -->

### Стадии платежа

Платеж с использованием холдирования проходит в две стадии.

**I стадия**

 
:   Блокировка средств (предавторизация) и переход платежа в статус **Платеж авторизован** (`AUTHORIZED`).
    
    На этой стадии вернуть деньги клиенту можно через отмену блокировки средств.

**II стадия**

 
:   Подтверждение списания магазином и переход платежа в статус **Оплачен** (`CAPTURED`).
    
    На этой стадии вернуть деньги можно, воспользовавшись операцией возврата платежа.

{% note info "Блокировка средств работает только при оплате картой" %}
 
Если покупатель оплатит по **СБП**, то средства спишутся сразу без подтверждения со стороны магазина. Платеж перейдет в статус `CAPTURED`, минуя стадию блокировки и статус `AUTHORIZED`.

Учитывайте это при обработке статусов заказа.

{% endnote %}

Успешные статусы платежа в сценариях с холдированием средств представлены на схеме ниже. С остальными статусами можно ознакомиться в разделе [Статусы, которые мы высылаем в интеграции](#statuses).

```mermaid
%%{init: {'themeVariables': {'fontSize': '10px'}}}%%
graph TB
    P(["Платеж"]):::color1
    A1["`AUTHORIZED`"]:::color1
    B1["`CAPTURED`"]:::color1
    B2["`VOIDED`"]:::color2
    C1["`REFUNDED`"]:::color2
    C2["`PARTIALLY_REFUNDED`"]:::color2

    P --> |"<a href='hold/#holding-scenarios'>Создание заявки </a>
(метод <a href='custom/backend/yandex-pay-api/order/merchant_v1_orders-post'>/orders</a>)
с последующей оплатой клиентом" | A1
    A1 -->  |"<a href='hold/#clear'>Подтверждение клира</a> магазином 
(метод <a href='custom/backend/yandex-pay-api/order/merchant_v1_capture-post'>/orders/{order_id}/capture</a>)"| B1
    A1 -->  |"<a href='hold/#auto-clear'>Окончание периода холдирования </a>
(автоматический клир)"| B1
    A1 -->  |"<a href='hold/#otmena-blokirovki-sredstv'>Отмена блокировки средств</a> магазином 
(метод <a href='custom/backend/yandex-pay-api/order/merchant_v1_cancel-post'>/orders/{order_id}/cancel</a>)"| B2
    B1 -->  |"<a href='hold/#refund'>Полный возврат </a>
(метод <a href='custom/backend/yandex-pay-api/order/merchant_v2_refund-post'>/v2/orders/{order_id}/refund</a>)"| C1
    B1 -->  |"<a href='hold/#refund'>Частичный возврат </a>
(метод <a href='custom/backend/yandex-pay-api/order/merchant_v2_refund-post'>/v2/orders/{order_id}/refund</a>)"| C2

    classDef color1 fill:#FAE9F6,stroke:#FAE9F6,stroke-width:2px,font-size:14px;
    classDef color2 fill:#E2DFF5,stroke:#E2DFF5,stroke-width:2px,rx:5,ry:5,font-size:14px;
```

### Сценарий холдирования {#holding-scenarios}

1. Сформируйте ссылку на оплату заказа с помощью метода [/orders](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_orders-post.md).
1. Покупатель переходит по ссылке и оплачивает покупку через форму Яндекс Пэй.
1. Происходит блокировка средств на счете покупателя, платеж переходит в статус `AUTHORIZED`.

   По умолчанию средства блокируются на 5 дней с момента платежа. После этого деньги списываются автоматически, см. [Автоклир](#auto-clear).

   Срок блокировки можно изменить в диапазоне от 1 до 5 дней через [поддержку](https://forms.yandex.ru/surveys/13490261.f4adc83a2c75b10abe163bf264af4e3842a535e0/).
1. Если настроен [Callback URL](https://pay.yandex.ru/docs/ru/console/settings-pay-split.md#callback-settings), бэкенд магазина получает [уведомление](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) о событии `ORDER_STATUS_UPDATED`.

### Списание средств (клир) { #clear }

1. Подтвердите списание средств за заказ с помощью метода [/orders/{order_id}/capture](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post.md).

    {% note info "Если сумма покупки окажется меньше?" %}

     Например, если покупатель решит не выкупать отдельные позиции в корзине, оставшаяся часть заблокированных средств будет возвращена. В данном случае передайте новые значения в параметре `cart` метода [/orders/{order_id}/capture](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post.md#cartwithrequiredtotalwithoutfinalprice).

    {% endnote %}

1. Происходит списание средств со счета покупателя, платеж переходит в статус `CAPTURED`.
1. Если настроен [Callback URL](https://pay.yandex.ru/docs/ru/console/settings-pay-split.md#callback-settings), бэкенд магазина получает [уведомление](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) о событии `ORDER_STATUS_UPDATED`.

   <img src="https://yastatic.net/s3/doc-binary/src/support/pay/hold-diagram.png" alt="Схема списания средств: платеж переходит из статуса AUTHORIZED в CAPTURED после подтверждения клира магазином">

### Отмена блокировки средств

Отменить блокировку средств можно только для платежей в статусе `AUTHORIZED` (деньги заблокированы, но еще не списаны).

1. Отправьте запрос на получение деталей заказа с помощью метода [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md).
2. Проверьте статус заказа в поле `paymentStatus` ответа:
   - Если статус `AUTHORIZED`, выполните отмену блокировки средств методом [/orders/{order_id}/cancel](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_cancel-post.md). 
     После отмены платеж перейдет в статус `VOIDED`, а деньги зачислятся обратно на счет клиента.
   - Если статус заказа отличается от `AUTHORIZED`, отменить блокировку невозможно. Рассмотрите возможность [возврата платежа](#refund).

<img src="https://yastatic.net/s3/doc-binary/src/support/pay/hold-diagram-cancel.png" alt="Схема отмены блокировки: платеж из статуса AUTHORIZED переходит в VOIDED, деньги возвращаются на счет клиента">

### Автоклир {#auto-clear}

Если подтверждения списания средств или отмены блокировки не происходит по истечению периода холдирования, на стороне Яндекс Пэй происходит автоматическое списание (автоклир) денежных средств.

{% note tip %}

Чтобы избежать нежелательного списания денежных средств с карты покупателя, рекомендуем настроить автоматическую отмену блокировки с помощью метода [/orders/{order_id}/cancel](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_cancel-post.md) по истечению заданного времени. При этом срок автоматической отмены должен быть меньше, чем период холдирования, т.к. отменить можно только платежи в статусе `AUTHORIZED`.

{% endnote %}

<img src="https://yastatic.net/s3/doc-binary/src/support/pay/hold-diagram-autoclear.png" alt="Схема автоклира: после окончания периода холдирования платеж автоматически переходит из статуса AUTHORIZED в CAPTURED">

### Возврат оплаты {#refund}

Провести возврат можно двумя способами:

- в личном кабинете в разделе [Платежи](https://pay.yandex.ru/docs/ru/custom/refund-payments.md#payment-refund);
- при помощи запросов к [API](https://pay.yandex.ru/docs/ru/custom/refund-payments.md#api-refund).

Минимальная сумма возврата — 1 рубль.

## Статусы, которые мы высылаем в интеграции {#statuses}

{% note info %}

Статус `CONFIRMED` в текущей интеграции не используются.

{% endnote %}

Проверьте актуальный статус платежа на любом этапе с помощью метода [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) или в [личном кабинете](https://console.pay.yandex.ru/payments), выбрав нужный платеж.

Статусы при проведении оплаты:

<!-- source: ru/_includes/payments.md -->
 #|
|| `PENDING`   | Оплата еще в процессе, нужно запросить статус платежа позже. Не отправляется в нотификации. ||
|| `FAILED`    | Оплата завершилась неудачно. Терминальный неуспешный статус. ||
|| `AUTHORIZED`| Оплата успешна, денежные средства захолдированы. ||
|| `CAPTURED`  | Оплата совершена. Терминальный успешный статус. ||
|| `VOIDED`    | Оплата отменена, денежные средства расхолдированы. Терминальный статус. ||
|#
<!-- endsource: ru/_includes/payments.md -->

Статусы при проведении возврата:

<!-- source: ru/_includes/payments.md -->
 #|
|| `FAILED`    | Процедура возврата неуспешна. Терминальный неуспешный статус. ||
|| `REFUNDED`  | Возврат совершен. Терминальный успешный статус. ||
|| `PARTIALLY_REFUNDED` | Частичный возврат совершен. Терминальный успешный статус. ||
|#
<!-- endsource: ru/_includes/payments.md -->

## Сценарии тестирования механики {#test-cases}

<!-- source: ru/_includes/testing.md -->
Для качественной работы сервиса [протестируйте](https://pay.yandex.ru/docs/ru/testing.md#pay-split) его в тестовой и боевой среде перед приемом платежей пользователей.

Если вы настроили интеграцию по [API Яндекс Пэй](https://pay.yandex.ru/docs/ru/custom/back-index.yaml), в ходе тестирования рекомендуем использовать тестовые сценарии:
<!-- endsource: ru/_includes/testing.md -->

 #|
||
**Сценарий**
|
**Действия**
|
**Ожидаемый результат**
|
**Среда**
||
||
Успешная оплата с последующим клиром (списанием средств) по инициативе продавца
|
1. Создайте заявку на оплату методом [/orders](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_orders-post.md) и откройте ссылку на оплату клиенту. В корзине должно быть несколько товаров одного `productId`.
1. Перейдите по ссылке и оплатите покупку.
1. Завершите бронь заказа и вызовите метод для клира средств [/orders/{order_id}/capture](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post.md).
|
1. {% include notitle [testing](../_includes/testing.md#common-22) %}
1. {% include notitle [testing](../_includes/testing.md#common-25) %}
1. {% include notitle [testing](../_includes/testing.md#common-23) %}
|
Test, Prod
||
||
Успешная оплата с отменой покупки до клира средств
|
1. {% include notitle [testing](../_includes/testing.md#common-21) %}
1. Перейдите по ссылке и оплатите покупку.
1. Инициируйте отмену заказа методом [/orders/{order_id}/cancel](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_cancel-post.md).
|
1. {% include notitle [testing](../_includes/testing.md#common-22) %}
1. По факту отмены от Яндекс пришел webhook или на опрос статуса [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) получен статус `VOIDED`.
|
Test, Prod
||
||
Успешная оплата с автоклиром средств (заказ без принудительного клира)
|
1. {% include notitle [testing](../_includes/testing.md#common-21) %}
1. Перейдите по ссылке и оплатите покупку.
1. Оставьте заявку на 5 суток.
|
1. {% include notitle [testing](../_includes/testing.md#common-22) %}
1. По факту автоклира средств от Яндекс пришел webhook или на опрос статуса [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) получен статус `CAPTURED`.
|
Test, Prod
||
||
Успешная оплата с частичным клиром средств
|
1. {% include notitle [testing](../_includes/testing.md#common-21) %}
1. Перейдите по ссылке и оплатите покупку.
1. Завершите бронь заказа с изменением состава в меньшую сторону и вызовите метод для клира средств [/orders/{order_id}/capture](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post.md) на итоговую корзину.
|
1. {% include notitle [testing](../_includes/testing.md#common-22) %}
1. {% include notitle [testing](../_includes/testing.md#common-25) %}
1. {% include notitle [testing](../_includes/testing.md#common-23) %}
|
Test, Prod
||
||
Успешная оплата с частичным возвратом после клира средств
|
1. {% include notitle [testing](../_includes/testing.md#common-21) %}
1. Перейдите по ссылке и оплатите покупку.
1. Подтвердите покупку [orders/{order_id}/capture](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post.md).
1. Выберите несколько товаров к возврату (не все) и осуществите возврат методом [/v2/orders/{order_id}/refund](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v2_refund-post.md) с последующей проверкой статуса возврата.
|
1. {% include notitle [testing](../_includes/testing.md#common-22) %}
1. {% include notitle [testing](../_includes/testing.md#common-25) %}
1. Частичный возврат осуществлен и получен статус заказа `PARTIALLY_REFUNDED` в webhook или в метод [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md).
|
Test, Prod
||
||
Успешная оплата с полным возвратом после клира средств
|
1. {% include notitle [testing](../_includes/testing.md#common-21) %}
1. Перейдите по ссылке и оплатите покупку.
1. {% include notitle [testing](../_includes/testing.md#common-32) %}
|
1. {% include notitle [testing](../_includes/testing.md#common-22) %}
1. {% include notitle [testing](../_includes/testing.md#common-25) %}
1. {% include notitle [testing](../_includes/testing.md#common-31) %}
|
Test, Prod
||
||
Проверка ежедневного отчета о продажах
|
{% include notitle [testing](../_includes/testing.md#common-29) %}
|
{% include notitle [testing](../_includes/testing.md#common-30) %}
|
Prod
||
||
Успешная оплата банковской картой
|
1. {% include notitle [testing](../_includes/testing.md#common-21) %}
1. Перейдите по ссылке и оплатите покупку банковской картой.
1. Завершите бронь заказа и вызовите метод для клира средств [/orders/{order_id}/capture](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post.md).
|
1. {% include notitle [testing](../_includes/testing.md#common-22) %}
1. {% include notitle [testing](../_includes/testing.md#common-25) %}
1. {% include notitle [testing](../_includes/testing.md#common-23) %}
|
Prod
||
||
Успешная оплата Сплит
|
1. {% include notitle [testing](../_includes/testing.md#common-21) %}
1. Перейдите по ссылке и оплатите покупку Сплитом.
1. Завершите бронь заказа и вызовите метод для клира средств [/orders/{order_id}/capture](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post.md).
|
1. {% include notitle [testing](../_includes/testing.md#common-22) %}
1. {% include notitle [testing](../_includes/testing.md#common-25) %}
1. {% include notitle [testing](../_includes/testing.md#common-23) %}
|
Prod
||
||
Успешная оплата СБП
|
1. {% include notitle [testing](../_includes/testing.md#common-21) %}
1. Перейдите по ссылке и оплатите покупку СБП.
|
1. {% include notitle [testing](../_includes/testing.md#common-25) %}
1. {% include notitle [testing](../_includes/testing.md#common-23) %}
|
Prod
||
||
Успешная оплата СБП с частичным возвратом
|
1. {% include notitle [testing](../_includes/testing.md#common-21) %}
1. Перейдите по ссылке и оплатите покупку через СБП.
1. Выберите несколько товаров к возврату (не все) и осуществите возврат методом [/v2/orders/{order_id}/refund](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v2_refund-post.md) с последующей проверкой статуса возврата.
|
1. {% include notitle [testing](../_includes/testing.md#common-24) %}
1. Частичный возврат осуществлен и получен статус заказа `PARTIALLY_REFUNDED` в webhook или в метод [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md).
|
Prod
||
||
Успешная оплата СБП с полным возвратом
|
1. {% include notitle [testing](../_includes/testing.md#common-21) %}
1. Перейдите по ссылке и оплатите покупку через СБП.
1. {% include notitle [testing](../_includes/testing.md#common-32) %}
|
1. {% include notitle [testing](../_includes/testing.md#common-24) %}
1. {% include notitle [testing](../_includes/testing.md#common-31) %}
|
Prod
||
|#



{% included (../_includes/testing.md) %}
# Тестирование

## sandbox {#sandbox}

{% note alert %}

Тестирование проводится в тестовом окружении (Sandbox). В данном случае запросы к API сервиса Яндекс Пэй отправляются на `https://sandbox.pay.yandex.ru`.

{% endnote %}

## Примечание {#note}

{% note info %}

Для авторизации используется реальный аккаунт, но банковская карта для оплаты будет предложена из списка тестовых карт.

Убедитесь, что платеж тестовый: в адресе ссылки на оплату будет префикс `sandbox`. Например: `https://sandbox.pay.ya.ru/o/nxPUqR`.

{% endnote %}

## Эквайринг {#acquiring}

{% note info %}

На данном этапе в боевых условиях происходит эквайринг в банке выбранной карты. В тестовой среде эквайринг имитируется программным способом.

{% endnote %}

## Включение тестовой среды {#testing-test}

1. В личном кабинете выберите в [селекторе](https://pay.yandex.ru/docs/ru/console/management.md#selector) ваш магазин.
1. Перейдите в раздел [Настройки](https://console.pay.yandex.ru/settings) и правом верхнем углу включите опцию **Тестовые данные**, чтобы посмотреть параметры интеграции для тестовой среды.
1. [Заполните](https://pay.yandex.ru/docs/ru/console/settings-pay-split.md#callback-settings) поле **Callback URL** `Тестовый`, если хотите, чтобы Яндекс Пэй присылал [уведомления](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) по Merchant API.
1. [Настройте](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/index.md) декодирование сообщений.
1. Проведите [тестирование](https://pay.yandex.ru/docs/ru/testing.md#pay-split).

## Включение боевой среды {#testing-prod}

1. В разделе **Настройки** отключите опцию **Тестовые данные**, чтобы посмотреть параметры интеграции для боевой среды.
1. Заполните поле **Callback URL**.
1. Выпустите [API-ключ](https://pay.yandex.ru/docs/ru/console/settings-pay-split.md#merchant-api-keys).
1. Проведите тестирование в боевой среде.

## Тестовые сценарии

### {#common-0}

Для качественной работы сервиса [протестируйте](https://pay.yandex.ru/docs/ru/testing.md#pay-split) его в тестовой и боевой среде перед приемом платежей пользователей.

Если вы настроили интеграцию по [API Яндекс Пэй](https://pay.yandex.ru/docs/ru/custom/back-index.yaml), в ходе тестирования рекомендуем использовать тестовые сценарии:

### {#common-1}

1. Задайте Callback URL в ЛК.
1. Проведите оплату через сервис Пэй/Сплит.
1. Проверьте изменение статуса в CRM на успешный на основании webhook.

### {#common-1-1}

1. Задайте Callback URL в ЛК.
1. Проведите оплату через сервис Пэй.
1. Проверьте изменение статуса в CRM на успешный на основании webhook.

### {#common-2}

1. Получен webhook с статусом заказа `CAPTURED`.
1. На основании полученного из Яндекс статуса на стороне продавца сформирован чек продажи и передан клиенту и в ФНС.

### {#common-3}

1. Не задавайте Callback URL в ЛК.
1. Проведите оплату через сервис Пэй/Сплит.
1. Проверьте изменение статуса в CRM на успешный на основании опроса статуса.

### {#common-3-1}

1. Не задавайте Callback URL в ЛК.
1. Проведите оплату через сервис Пэй.
1. Проверьте изменение статуса в CRM на успешный на основании опроса статуса.

### {#common-4}

1. В методе [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) получен статус заказа `CAPTURED`. Webhook не отправляется.
1. На основании полученного из Яндекс статуса на стороне продавца сформирован чек продажи и передан клиенту и в ФНС.

### {#common-5}

1. Частичный возврат осуществлен и получен статус заказа `PARTIALLY_REFUNDED` в webhook или на метод [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md).
1. На основании полученного из Яндекс статуса на стороне продавца сформирован чек возврата и передан клиенту и в ФНС.

### {#common-6}

1. Полный возврат осуществлен и получен статус заказа `REFUNDED` в webhook или на метод [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md).
1. На основании полученного из Яндекс статуса на стороне продавца сформирован чек возврата и передан клиенту и в ФНС.

### {#common-7}

1. Проведите оплату через сервис Пэй/Сплит с использованием банковской карты.
1. Проверьте изменение статуса в CRM на успешный на основании опроса статуса.

### {#common-7-1}

1. Проведите оплату через сервис Пэй с использованием банковской карты.
1. Проверьте изменение статуса в CRM на успешный на основании опроса статуса.

### {#common-8}

1. По факту оплаты от Яндекс пришел webhook или на опрос статуса [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) получен статус `CAPTURED`.
1. На основании полученного из Яндекс статуса на стороне продавца сформирован чек продажи и передан клиенту и в ФНС.

### {#common-9}

1. Проведите оплату через сервис Пэй/Сплит.
1. В ЛК Яндекс Пэй найдите платеж и сделайте частичный возврат товаров.

### {#common-9-1}

1. Проведите оплату через сервис Пэй.
1. В ЛК Яндекс Пэй найдите платеж и сделайте частичный возврат товаров.

### {#common-10}

1. Проведите оплату через сервис Пэй/Сплит.
1. В ЛК Яндекс Пэй найдите платеж и сделайте полный возврат товаров.

### {#common-10-1}

1. Проведите оплату через сервис Пэй.
1. В ЛК Яндекс Пэй найдите платеж и сделайте полный возврат товаров.

### {#common-11}

1. Проведите оплату через сервис Пэй/Сплит с использованием СБП.
1. Проверьте изменение статуса в CRM на успешный на основании опроса статуса.

### {#common-11-1}

1. Проведите оплату через сервис Пэй с использованием СБП.
1. Проверьте изменение статуса в CRM на успешный на основании опроса статуса.

### {#common-12}

1. По факту оплаты от Яндекс пришел webhook или на опрос статуса [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) получен статус `CAPTURED`.
1. На основании полученного из Яндекс статуса на стороне продавца сформирован чек продажи и передан клиенту и в ФНС.

### {#common-13}

Оставьте без возврата успешные продажи на сумму не менее 500 рублей.

### {#common-14}

На следующий день после тестов получен ежедневный отчет с операциями.
Проверьте начисленную комиссию за успешную оплату.

### {#common-15}

1. В методе [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) или в webhook получен статус заказа `CAPTURED`.
1. На основании полученного из Яндекс статуса на стороне продавца сформирован чек продажи и передан клиенту и в ФНС.

### {#common-16}

1. В методе [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) или в webhook получен статус заказа `FAILED`.
1. В поле `reason` отражен комментарий, что недостаточно денежных средств.

### {#common-17}

Инициируйте оплату методом [subscriptions/recur](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api-secret-spec/subscriptions/merchant_v1_subscriptions_recur-post.md) с передачей заказа, в котором привязана карта.

### {#common-18}

В Яндекс вызовите метод [/v2/orders/{order_id}/refund](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v2_refund-post.md).

### {#common-19}

В кассовом ПО или CRM выберите весь чек к возврату и осуществите его.

### {#common-20}

В кассовом ПО или CRM выберите несколько товаров к возврату и осуществите его.

### {#common-21}

Создайте заявку на оплату методом [/orders](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_orders-post.md) и откройте ссылку на оплату клиенту.

### {#common-22}

По факту оплаты от Яндекс пришел webhook или на опрос статуса [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) получен статус `AUTHORIZED`.

### {#common-23}

На основании полученного из Яндекс статуса на стороне продавца сформирован чек продажи и передан клиенту и в ФНС.

### {#common-24}

По факту оплаты от Яндекс пришел webhook или на опрос статуса [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) получен статус `CAPTURED`.

### {#common-25}

По факту клира средств от Яндекс пришел webhook или на опрос статуса [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) получен статус `CAPTURED`.

### {#common-26}

По факту аннулирования заказа от Яндекс пришел webhook или на опрос статуса [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) получен статус `FAILED`.

### {#common-27}

По факту оплаты от Яндекс пришел webhook или на опрос статуса [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md) получен статус `CONFIRMED`.

### {#common-28}

Создайте заявку на оплату методом /orders с `isPrepayment = true` и откройте ссылку на оплату клиенту.

### {#common-29}

Проведите и оставьте без возврата успешные продажи на сумму не менее 500 рублей.

### {#common-30}

1. На следующий день после тестов получен ежедневный отчет с операциями, где за аннулирование оплат до клира нет комиссии.
1. В отчете указана начисленная комиссию за успешную оплату.

### {#common-31}

Полный возврат осуществлен и получен статус заказа `REFUNDED` в webhook или в метод [/orders/{order_id}](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_order-get.md).

### {#common-32}

Выберите все товары к возврату и осуществите возврат методом [/v2/orders/{order_id}/refund](https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v2_refund-post.md) с последующей проверкой статуса возврата.

### {#testing-qr}

{% list tabs %}

- В кассовом ПО

  {% note warning %}

  Протестировать прием платежей в кассовом ПО можно, если вы подключили QR‑код от Яндекс Пэй в настройках кассового ПО.

  {% endnote %}
  1. Создайте заказ в вашем кассовом ПО и выберите способ оплаты с помощью QR‑кода от Яндекс Пэй.
  1. Отсканируйте QR-табличку камерой смартфона и подтвердите оплату с помощью СБП.
  1. Проверьте, что оплата прошла успешно.
  1. Если у вас подключена оплата в Сплит, создайте заказ и аналогично шагам выше оплатите заказ в Сплит.
  1. Проверьте, что оплата прошла успешно.
  1. Выполните возврат средств в вашем кассовом ПО.

     {% note info %}

     Если кассовое ПО не поддерживает возвраты, оформите возврат в разделе [Платежи](https://console.pay.yandex.ru/payments) личного кабинета Яндекс Пэй. Как оформить возврат см. подробнее в разделе [Возврат платежей](https://pay.yandex.ru/docs/ru/custom/refund-payments.md).

     {% endnote %}

- В личном кабинете Яндекс Пэй

  {% note warning %}

  Протестировать прием платежей в личном кабинете вы можете, если в заявке на подключение сервиса, вы указали, что не используете кассовое ПО или используете ПО, которого нет в списке поддерживаемого.

  {% endnote %}

  1. Перейдите в раздел [Платежи](https://console.pay.yandex.ru/payments) личного кабинета Яндекс Пэй и примите оплату по инструкции в разделе [Прием платежа](https://pay.yandex.ru/docs/ru/console/create-link.md#qr).
  1. Выполните возврат средств по инструкции в разделе [Возврат платежей](https://pay.yandex.ru/docs/ru/custom/refund-payments.md).

- В Cash Register API

  {% note tip %}

  Подробный процесс работы с заказом см. в разделе [Самостоятельная интеграция](https://pay.yandex.ru/docs/ru/qr-code/api.md#how-to).

  {% endnote %}
  
  <!-- source: ru/_includes/testing-qr-api.md -->
  Для тестирования Cash Register API доступна sandbox-среда, которая позволяет проверить интеграцию без реальных платежей. В ней все методы API работают так же, как в боевой среде.

  **Особенности sandbox:**

  - Тестовые ключи отличаются от боевых.
  - Базовый URL: `https://sandbox.pay.yandex.ru/api/merchant/cash-register`.
  - Включена автоматическая оплата — после создания заказа оплата происходит автоматически, переходить по `paymentUrl` не требуется.

  #### Настройка тестовой среды в личном кабинете {#sandbox-settings}

  1.  В [личном кабинете](https://console.pay.yandex.ru/settings) откройте раздел **Настройки**.

  1.  Включите опцию **Тестовая среда**.

      ![Настройки sandbox](../_assets/test-qr-settings.png){.c-screenshot width=400}

  1.  В разделе **Тестирование в Sandbox** скопируйте тестовые ключи и используйте их для [аутентификации запросов](https://pay.yandex.ru/docs/ru/qr-code/api.md#auth):
      - **YandexPayApiKey** — в заголовке `Authorization: Api-Key <ключ>`;
      - **SoftwareAuthorization** — в заголовке `Software-Authorization: <ключ>`.

  1.  Настройте [Callback URL](https://pay.yandex.ru/docs/ru/qr-code/api.md#callback-settings) для получения [нотификаций](https://pay.yandex.ru/docs/ru/qr-code/api.md#webhook) о статусе заказа и операций.

  1.  Вы также можете посмотреть тестовые платежи в личном кабинете. Подробнее см. в разделе [Просмотр тестовых платежей](https://pay.yandex.ru/docs/ru/testing.md#test-payments).

  #### Оформление заказа с помощью статического QR-кода {#test-static-qr}

  1.  Получите `qrcId` методом [/accounts](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/QR-tablichki/getAccounts.md).

  1.  Создайте заказ методом [/orders](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/createOrder.md) с одной из тестовых сумм для эмуляции результатов оплаты.

      {% cut "Тестовые суммы" %}

      #|
      || **Сумма** | **Результат** ||
      || 10 000 | Успешная оплата через СБП, карту или в Сплит.

      Статус платежа: `paymentStatus: "CAPTURED"`.

      Статус операции: `operationType: "AUTHORIZE"`, `status: "SUCCESS"`. ||

      || 10 001 | Техническая ошибка.

      Статус платежа: `paymentStatus: "FAILED"`, `reason: "WRONG_ENVIRONMENT"`.

      Статус операции: `operationType: "AUTHORIZE"`, `status: "FAIL"`. ||
      || 10 002 | Недостаточно средств.

      Статус платежа: `paymentStatus: "FAILED"`, `reason: "NOT_ENOUGH_FUNDS"`.

      Статус операции: `operationType: "AUTHORIZE"`, `status: "FAIL"`. ||
      || 10 004 | Вечный статус `PENDING`. Используйте для проверки поллинга и деактивации статического QR-кода.

      Статус платежа: `paymentStatus: "PENDING"` — заказ остается в этом статусе до деактивации.

      Статус операции: `operationType: "AUTHORIZE"`, `status: "PENDING"`. ||
      |#

      {% endcut %}

      Для отображения Сплита в способах оплаты передайте `availablePaymentMethods: ["CARD", "SPLIT"]`.

  1.  Яндекс Пэй вернет поле `paymentUrl` с уникальной ссылкой на оплату.

      В sandbox оплата произойдет автоматически — переходить по ссылке не требуется.

      В боевой среде перейдите по ссылке и оплатите заказ через СБП, карту или в Сплит.

  1.  Проверьте статус заказа одним из способов:

      - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `ORDER_STATUS_UPDATED`.

      - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду.

      Ожидаемый результат см. в столбце **Результат** в таблице тестовых сумм.

  #### Оформление заказа с помощью динамического QR-кода {#test-dynamic-qr}

  1.  Создайте заказ методом [/orders/dynamic](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/createDynamicOrder.md) с одной из тестовых сумм для эмуляции результатов оплаты. Получать `qrcId` не требуется — QR-код генерируется автоматически.

      {% cut "Тестовые суммы" %}

      #|
      || **Сумма** | **Результат** ||
      || 10 000 | Успешная оплата через СБП, карту или в Сплит.

      Статус платежа: `paymentStatus: "CAPTURED"`.

      Статус операции: `operationType: "AUTHORIZE"`, `status: "SUCCESS"`. ||

      || 10 001 | Техническая ошибка.

      Статус платежа: `paymentStatus: "FAILED"`, `reason: "WRONG_ENVIRONMENT"`.

      Статус операции: `operationType: "AUTHORIZE"`, `status: "FAIL"`. ||
      || 10 002 | Недостаточно средств.

      Статус платежа: `paymentStatus: "FAILED"`, `reason: "NOT_ENOUGH_FUNDS"`.

      Статус операции: `operationType: "AUTHORIZE"`, `status: "FAIL"`. ||
      || 10 004 | Вечный статус `PENDING`. Используйте для проверки поллинга и деактивации статического QR-кода.

      Статус платежа: `paymentStatus: "PENDING"` — заказ остается в этом статусе до деактивации.

      Статус операции: `operationType: "AUTHORIZE"`, `status: "PENDING"`. ||
      |#

      {% endcut %}

      Для отображения Сплита в способах оплаты передайте `availablePaymentMethods: ["CARD", "SPLIT"]`.

  1.  Яндекс Пэй вернет поле `paymentUrl` с уникальной ссылкой на оплату.

      В sandbox оплата произойдет автоматически — переходить по ссылке не требуется.

      В боевой среде перейдите по ссылке и оплатите заказ через СБП, карту или в Сплит.

  1.  Проверьте статус заказа одним из способов:

      - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `ORDER_STATUS_UPDATED`.

      - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду.

      Ожидаемый результат см. в столбце **Результат** в таблице тестовых сумм.

  #### Поллинг и деактивация (прерывание оплаты) {#test-polling-deactivate}

  Деактивация доступна только для статических QR-кодов.

  1. Получите `qrcId` методом [/accounts](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/QR-tablichki/getAccounts.md).

  1. Создайте заказ методом [/orders](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/createOrder.md) на сумму **10 004 рубля**.

  1. Деактивация доступна только для заказов в статусе `paymentStatus: "PENDING"`.

     Проверьте статус заказа методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md).

  1. Настройте поллинг:
     - Первый запрос — через 5–10 секунд после создания заказа.

     - Последующие запросы — не чаще одного раза в секунду.

  1. Убедитесь, что заказ остается в статусе `paymentStatus: "PENDING"` и деактивируйте его методом [/orders/{orderId}/deactivate](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/deactivateOrder.md).

  1. Проверьте статусы:
     - операции: `operationType: "AUTHORIZE"`, `status: "FAIL"`;
     - заказа: `paymentStatus: "FAILED"`, `reason: "Payment rolled back by merchant"`.

  #### Полный возврат {#test-full-refund}

  1. Создайте и оплатите заказ на сумму **10 000 рублей** с помощью [статического](#test-static-qr) или [динамического QR-кода](#test-dynamic-qr).

  1. Возврат доступен только для заказов в статусе `paymentStatus: "CAPTURED"` или `paymentStatus: "PARTIALLY_REFUNDED"`.

     Проверьте статус заказа методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md).

  1. Выполните полный возврат методом [/orders/{orderId}/refund](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/refundOrder.md) с параметрами:
     - `externalOperationId` — уникальный идентификатор операции на стороне продавца. По нему можно узнать статус операции и он служит токеном идемпотентности.
     - `refundAmount` — сумма к возврату. Для полного возврата укажите сумму заказа (**10 000 рублей**).
     - `refundCart` — корзина возвращаемых позиций. Для полного возврата можно не указывать.

  1. Проверьте статус операции возврата одним из способов:

     - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `OPERATION_STATUS_UPDATED`.

     - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду. Находите нужную операцию по `externalOperationId`, который вы передали в [/orders/{orderId}/refund](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/refundOrder.md).

     Ожидаемый результат: `operationType: "REFUND"`, `status: "SUCCESS"`.

  1. Проверьте статус заказа одним из способов:

     - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `ORDER_STATUS_UPDATED`.

     - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду.

     Ожидаемый результат: `paymentStatus: "REFUNDED"`.

  #### Частичный возврат {#test-partial-refund}

  1. Создайте и оплатите заказ с несколькими позициями на сумму **10 000 рублей** с помощью [статического](#test-static-qr) или [динамического QR-кода](#test-dynamic-qr).

     При формировании корзины используйте [одну из логик](https://pay.yandex.ru/docs/ru/qr-code/api.md#refund-logics): **базовую** без цены за единицу товара `CartItem.unitPrice` или **расширенную** — с `CartItem.unitPrice`.

     От корзины при создании заказа зависит будущая логика возврата.

  1. Возврат доступен только для заказов в статусе `paymentStatus: "CAPTURED"` или `paymentStatus: "PARTIALLY_REFUNDED"`.

     Проверьте статус заказа методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md).

  1. Выполните частичный возврат методом [/orders/{orderId}/refund](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/refundOrder.md) с параметрами:
     - `externalOperationId` — уникальный идентификатор операции на стороне продавца. По нему можно узнать статус операции и он служит токеном идемпотентности.
     - `refundAmount` — сумма к возврату.
     - `refundCart` — корзина возвращаемых позиций. Обязательна для частичного возврата.

       Формат `refundCart` зависит от логики возвратов. Подробнее см. в разделах [Две логики возвратов](https://pay.yandex.ru/docs/ru/qr-code/api.md#refund-logics) и [Примеры возвратов](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/refundOrder.md#refund-examples).

  1. Проверьте статус операции возврата одним из способов:

     - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `OPERATION_STATUS_UPDATED`.

     - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду. Находите нужную операцию по `externalOperationId`, который вы передали в [/orders/{orderId}/refund](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/refundOrder.md).

     Ожидаемый результат: `operationType: "REFUND"`, `status: "SUCCESS"`.

  1. Проверьте статус заказа одним из способов:

     - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `ORDER_STATUS_UPDATED`.

     - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду.

     Ожидаемый результат: `paymentStatus: "PARTIALLY_REFUNDED"`.
  <!-- endsource: ru/_includes/testing-qr-api.md -->

{% endlist %}

{% endincluded %}
{% included (../_includes/testing.md:./testing-qr-api.md) %}
# Тестирование Cash Register API

Для тестирования Cash Register API доступна sandbox-среда, которая позволяет проверить интеграцию без реальных платежей. В ней все методы API работают так же, как в боевой среде.

**Особенности sandbox:**

- Тестовые ключи отличаются от боевых.
- Базовый URL: `https://sandbox.pay.yandex.ru/api/merchant/cash-register`.
- Включена автоматическая оплата — после создания заказа оплата происходит автоматически, переходить по `paymentUrl` не требуется.

#### Настройка тестовой среды в личном кабинете {#sandbox-settings}

1.  В [личном кабинете](https://console.pay.yandex.ru/settings) откройте раздел **Настройки**.

1.  Включите опцию **Тестовая среда**.

    ![Настройки sandbox](../_assets/test-qr-settings.png){.c-screenshot width=400}

1.  В разделе **Тестирование в Sandbox** скопируйте тестовые ключи и используйте их для [аутентификации запросов](https://pay.yandex.ru/docs/ru/qr-code/api.md#auth):
    - **YandexPayApiKey** — в заголовке `Authorization: Api-Key <ключ>`;
    - **SoftwareAuthorization** — в заголовке `Software-Authorization: <ключ>`.

1.  Настройте [Callback URL](https://pay.yandex.ru/docs/ru/qr-code/api.md#callback-settings) для получения [нотификаций](https://pay.yandex.ru/docs/ru/qr-code/api.md#webhook) о статусе заказа и операций.

1.  Вы также можете посмотреть тестовые платежи в личном кабинете. Подробнее см. в разделе [Просмотр тестовых платежей](https://pay.yandex.ru/docs/ru/testing.md#test-payments).

#### Оформление заказа с помощью статического QR-кода {#test-static-qr}

1.  Получите `qrcId` методом [/accounts](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/QR-tablichki/getAccounts.md).

1.  Создайте заказ методом [/orders](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/createOrder.md) с одной из тестовых сумм для эмуляции результатов оплаты.

    {% cut "Тестовые суммы" %}

    #|
    || **Сумма** | **Результат** ||
    || 10 000 | Успешная оплата через СБП, карту или в Сплит.

    Статус платежа: `paymentStatus: "CAPTURED"`.

    Статус операции: `operationType: "AUTHORIZE"`, `status: "SUCCESS"`. ||

    || 10 001 | Техническая ошибка.

    Статус платежа: `paymentStatus: "FAILED"`, `reason: "WRONG_ENVIRONMENT"`.

    Статус операции: `operationType: "AUTHORIZE"`, `status: "FAIL"`. ||
    || 10 002 | Недостаточно средств.

    Статус платежа: `paymentStatus: "FAILED"`, `reason: "NOT_ENOUGH_FUNDS"`.

    Статус операции: `operationType: "AUTHORIZE"`, `status: "FAIL"`. ||
    || 10 004 | Вечный статус `PENDING`. Используйте для проверки поллинга и деактивации статического QR-кода.

    Статус платежа: `paymentStatus: "PENDING"` — заказ остается в этом статусе до деактивации.

    Статус операции: `operationType: "AUTHORIZE"`, `status: "PENDING"`. ||
    |#

    {% endcut %}

    Для отображения Сплита в способах оплаты передайте `availablePaymentMethods: ["CARD", "SPLIT"]`.

1.  Яндекс Пэй вернет поле `paymentUrl` с уникальной ссылкой на оплату.

    В sandbox оплата произойдет автоматически — переходить по ссылке не требуется.

    В боевой среде перейдите по ссылке и оплатите заказ через СБП, карту или в Сплит.

1.  Проверьте статус заказа одним из способов:

    - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `ORDER_STATUS_UPDATED`.

    - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду.

    Ожидаемый результат см. в столбце **Результат** в таблице тестовых сумм.

#### Оформление заказа с помощью динамического QR-кода {#test-dynamic-qr}

1.  Создайте заказ методом [/orders/dynamic](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/createDynamicOrder.md) с одной из тестовых сумм для эмуляции результатов оплаты. Получать `qrcId` не требуется — QR-код генерируется автоматически.

    {% cut "Тестовые суммы" %}

    #|
    || **Сумма** | **Результат** ||
    || 10 000 | Успешная оплата через СБП, карту или в Сплит.

    Статус платежа: `paymentStatus: "CAPTURED"`.

    Статус операции: `operationType: "AUTHORIZE"`, `status: "SUCCESS"`. ||

    || 10 001 | Техническая ошибка.

    Статус платежа: `paymentStatus: "FAILED"`, `reason: "WRONG_ENVIRONMENT"`.

    Статус операции: `operationType: "AUTHORIZE"`, `status: "FAIL"`. ||
    || 10 002 | Недостаточно средств.

    Статус платежа: `paymentStatus: "FAILED"`, `reason: "NOT_ENOUGH_FUNDS"`.

    Статус операции: `operationType: "AUTHORIZE"`, `status: "FAIL"`. ||
    || 10 004 | Вечный статус `PENDING`. Используйте для проверки поллинга и деактивации статического QR-кода.

    Статус платежа: `paymentStatus: "PENDING"` — заказ остается в этом статусе до деактивации.

    Статус операции: `operationType: "AUTHORIZE"`, `status: "PENDING"`. ||
    |#

    {% endcut %}

    Для отображения Сплита в способах оплаты передайте `availablePaymentMethods: ["CARD", "SPLIT"]`.

1.  Яндекс Пэй вернет поле `paymentUrl` с уникальной ссылкой на оплату.

    В sandbox оплата произойдет автоматически — переходить по ссылке не требуется.

    В боевой среде перейдите по ссылке и оплатите заказ через СБП, карту или в Сплит.

1.  Проверьте статус заказа одним из способов:

    - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `ORDER_STATUS_UPDATED`.

    - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду.

    Ожидаемый результат см. в столбце **Результат** в таблице тестовых сумм.

#### Поллинг и деактивация (прерывание оплаты) {#test-polling-deactivate}

Деактивация доступна только для статических QR-кодов.

1. Получите `qrcId` методом [/accounts](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/QR-tablichki/getAccounts.md).

1. Создайте заказ методом [/orders](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/createOrder.md) на сумму **10 004 рубля**.

1. Деактивация доступна только для заказов в статусе `paymentStatus: "PENDING"`.

   Проверьте статус заказа методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md).

1. Настройте поллинг:
   - Первый запрос — через 5–10 секунд после создания заказа.

   - Последующие запросы — не чаще одного раза в секунду.

1. Убедитесь, что заказ остается в статусе `paymentStatus: "PENDING"` и деактивируйте его методом [/orders/{orderId}/deactivate](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/deactivateOrder.md).

1. Проверьте статусы:
   - операции: `operationType: "AUTHORIZE"`, `status: "FAIL"`;
   - заказа: `paymentStatus: "FAILED"`, `reason: "Payment rolled back by merchant"`.

#### Полный возврат {#test-full-refund}

1. Создайте и оплатите заказ на сумму **10 000 рублей** с помощью [статического](#test-static-qr) или [динамического QR-кода](#test-dynamic-qr).

1. Возврат доступен только для заказов в статусе `paymentStatus: "CAPTURED"` или `paymentStatus: "PARTIALLY_REFUNDED"`.

   Проверьте статус заказа методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md).

1. Выполните полный возврат методом [/orders/{orderId}/refund](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/refundOrder.md) с параметрами:
   - `externalOperationId` — уникальный идентификатор операции на стороне продавца. По нему можно узнать статус операции и он служит токеном идемпотентности.
   - `refundAmount` — сумма к возврату. Для полного возврата укажите сумму заказа (**10 000 рублей**).
   - `refundCart` — корзина возвращаемых позиций. Для полного возврата можно не указывать.

1. Проверьте статус операции возврата одним из способов:

   - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `OPERATION_STATUS_UPDATED`.

   - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду. Находите нужную операцию по `externalOperationId`, который вы передали в [/orders/{orderId}/refund](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/refundOrder.md).

   Ожидаемый результат: `operationType: "REFUND"`, `status: "SUCCESS"`.

1. Проверьте статус заказа одним из способов:

   - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `ORDER_STATUS_UPDATED`.

   - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду.

   Ожидаемый результат: `paymentStatus: "REFUNDED"`.

#### Частичный возврат {#test-partial-refund}

1. Создайте и оплатите заказ с несколькими позициями на сумму **10 000 рублей** с помощью [статического](#test-static-qr) или [динамического QR-кода](#test-dynamic-qr).

   При формировании корзины используйте [одну из логик](https://pay.yandex.ru/docs/ru/qr-code/api.md#refund-logics): **базовую** без цены за единицу товара `CartItem.unitPrice` или **расширенную** — с `CartItem.unitPrice`.

   От корзины при создании заказа зависит будущая логика возврата.

1. Возврат доступен только для заказов в статусе `paymentStatus: "CAPTURED"` или `paymentStatus: "PARTIALLY_REFUNDED"`.

   Проверьте статус заказа методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md).

1. Выполните частичный возврат методом [/orders/{orderId}/refund](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/refundOrder.md) с параметрами:
   - `externalOperationId` — уникальный идентификатор операции на стороне продавца. По нему можно узнать статус операции и он служит токеном идемпотентности.
   - `refundAmount` — сумма к возврату.
   - `refundCart` — корзина возвращаемых позиций. Обязательна для частичного возврата.

     Формат `refundCart` зависит от логики возвратов. Подробнее см. в разделах [Две логики возвратов](https://pay.yandex.ru/docs/ru/qr-code/api.md#refund-logics) и [Примеры возвратов](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/refundOrder.md#refund-examples).

1. Проверьте статус операции возврата одним из способов:

   - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `OPERATION_STATUS_UPDATED`.

   - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду. Находите нужную операцию по `externalOperationId`, который вы передали в [/orders/{orderId}/refund](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/refundOrder.md).

   Ожидаемый результат: `operationType: "REFUND"`, `status: "SUCCESS"`.

1. Проверьте статус заказа одним из способов:

   - Нотификации (рекомендуется) — дождитесь нотификации [/webhook](https://pay.yandex.ru/docs/ru/custom/backend/merchant-api/webhook.md) с событием `ORDER_STATUS_UPDATED`.

   - Поллинг — опрашивайте статус методом [/orders/{orderId}](https://pay.yandex.ru/docs/ru/custom/backend/cash-register/Zakazy/getOrder.md). Первый запрос через 5–10 секунд после создания заказа, далее не чаще раза в секунду.

   Ожидаемый результат: `paymentStatus: "PARTIALLY_REFUNDED"`.

{% endincluded %}