/v2/orders/{order_id}/refund

Запрос на возврат средств за заказ.

Доступно только для платежей в статусе CAPTURED и PARTIALLY_REFUNDED. В случае успешного выполнения запроса изменится статус платежа:

  • на REFUNDED, если был произведен полный возврат;
  • на PARTIALLY_REFUNDED, если после совершения возврата в заказе остались ещё товары.

Метод является асинхронным. Узнать результат возврата можно через механизм событий или вызов метода состояния операции. Событие OPERATION_STATUS_UPDATED будет отправлено как в случае успеха, так и при возникновении ошибки в процессе совершения возврата.

Если требуется выполнить полный возврат, достаточно передать refundAmount, равный сумме заказа.

Для выполнения частичного возврата в запросе дополнительно нужно передать итоговую корзину предоставляемых товаров и услуг. Для формирования итоговой корзины исключите некоторые позиции из текущей корзины или скорректируйте количество/цену в позициях, по которым производился возврат.

Примечание

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

Поле targetCart описывает итоговое состояние корзины после выполнения возврата. Если это поле не указано или равно null, то считается, что корзина возвращается полностью.

Поле targetShipping применимо только к Yandex Pay Checkout. В остальных случаях следует оставить это поле пустым. Поле описывает итоговое состояние доставки после выполнения возврата. Если это поле не указано или равно null, то считается, что стоимость доставки возвращается полностью.

Примеры вызовов

Рассмотрим на примере заказа с orderId = Order-123 и следующей корзиной:

{
    "items": [
        {
            "productId": "id-1",
            "price": "50",
            "title": "Шариковая ручка",
            "quantity": {
                "count": "10"
            },
        },
        {
            "productId": "id-2",
            "price": "200",
            "title": "Блокнот",
            "quantity": {
                "count": "2"
            },
        }
    ]
}

Пример полного возврата

http POST https://sandbox.pay.yandex.ru/api/merchant/v2/orders/Order-123/refund \
        "Authorization: Api-Key ${API_KEY}" 'refundAmount:="900.00"'

Примеры частичного возврата

Возврат единиц товара

Допустим, необходимо вернуть две шариковые ручки. Это делается следующим запросом

http POST https://sandbox.pay.yandex.ru/api/merchant/v2/orders/Order-123/refund \
  "Authorization: Api-Key ${API_KEY}" \
  'targetCart[items][0]:={"productId": "id-1", "quantityCount": "8"}' \
  'targetCart[items][1]:={"productId": "id-2", "quantityCount": "2"}' \
  'refundAmount:="100.00"'

В данном примере:

  • Количество шариковых ручек уменьшилось на 2, с 10 до 8 единиц;
  • Поле price в запросе пропущено, но его вполне допустимо было указать;
  • quantityCount у позиции с блокнотом не изменилось, его можно было не указывать.

Возврат части денег

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

http POST https://sandbox.pay.yandex.ru/api/merchant/v2/orders/Order-123/refund \
  "Authorization: Api-Key ${API_KEY}" \
  'targetCart[items]:=[{"productId": "id-1"}, {"productId": "id-2", "price": "170"}]' \
  'refundAmount:="60.00"'

В данном примере:

  • Цена блокнота уменьшилась на 30, с 200 рублей до 170 рублей;
  • Таким образом, производится возврат 60 рублей, поскольку блокнотов было два;
  • quantityCount не указаны, но вполне допустимо указать их прежние значения.

Request

POST

https://pay.yandex.ru/api/merchant/v2/orders/{order_id}/refund

Production

POST

https://sandbox.pay.yandex.ru/api/merchant/v2/orders/{order_id}/refund

Sandbox

Path parameters

Name

Type

Description

order_id*

string

ID заказа на стороне продавца, который был передан в ответе на /order/create.

Body

application/json
{
    "externalOperationId": "string",
    "refundAmount": "123.45",
    "targetCart": {
        "items": [
            {
                "price": "123.45",
                "productId": "string",
                "quantityCount": "123.45"
            }
        ]
    },
    "targetShipping": {
        "amount": "123.45"
    }
}

Name

Type

Description

externalOperationId

string

Идентификатор операции возврата в системе продавца. Должен быть уникальным

Передайте его для того, чтобы получить возможность отслеживать состояние операции возврата через метод состояния операции. Повторный вызов метода возврата с тем же значением externalOperationId является идемпотентным. Если остальные аргументы вызова метода совпадают с аргументами изначального вызова, в ответе вернется та же операция. Иначе вернется ошибка.
Max length: 2048

refundAmount*

string<double>

Сумма к возврату
Example: 123.45

targetCart

TargetCart

Описывает итоговое состояние корзины после выполнения возврата. Если это поле не указано или равно null, то считается, что корзина возвращается полностью.

targetShipping

TargetShipping

Применимо только к Yandex Pay Checkout. В остальных случаях следует оставить это поле пустым.

Описывает итоговое состояние доставки после выполнения возврата. Если это поле не указано или равно null, то считается, что стоимость доставки возвращается полностью.

TargetCart

Описывает итоговое состояние корзины после выполнения возврата. Если это поле не указано или равно null, то считается, что корзина возвращается полностью.

Name

Type

Description

items

TargetCartItem[]

TargetShipping

Применимо только к Yandex Pay Checkout. В остальных случаях следует оставить это поле пустым.

Описывает итоговое состояние доставки после выполнения возврата. Если это поле не указано или равно null, то считается, что стоимость доставки возвращается полностью.

Name

Type

Description

amount

string<double>

Стоимость доставки после выполнения операции
Example: 123.45

TargetCartItem

Name

Type

Description

price

string<double>

Цена одной единицы товара/услуги после выполнения операции. Необходимо указать, если цена одной единицы уменьшается в результате операции. Это может быть полезным, если необходимо вернуть часть денег за товар или подтверждении заказа. Если не указывать это поле в запросе, то считается, что цена осталась прежней.
Example: 123.45

productId*

string

Идентификатор позиции в корзине на момент создания заказа. Если передать идентификатор, которого не было в первоначальной корзине - произойдёт ошибка.
Max length: 2048

quantityCount

string<double>

Количество единиц товара/услуги, которое останется у пользователя после выполнения операции. Если не указывать это поле в запросе, то считается, что количество не изменилось.
Example: 123.45

Responses

200 OK

Body

application/json
{
    "code": 200,
    "data": {
        "operation": {
            "amount": "123.45",
            "created": "2022-12-29T18:02:01Z",
            "externalOperationId": "string",
            "operationId": "c3073b9d-edd0-49f2-a28d-b7ded8ff9a8b",
            "operationType": "AUTHORIZE",
            "orderId": "string",
            "params": {},
            "reason": "string",
            "status": "PENDING",
            "updated": "2022-12-29T18:02:01Z"
        }
    },
    "status": "success"
}

Name

Type

Description

code

number

Default: 200

data

OperationResponseData

status

string

Enum: success
Default: success

OperationResponseData

Name

Type

Description

operation

Operation

Operation

Name

Type

Description

amount*

string<double>

Сумма операции
Example: 123.45

created

string<date-time>

Дата и время создания операции (ISO 8601)

externalOperationId

string

Идентификатор операции на стороне продавца
Max length: 2048

operationId*

string<uuid>

Max length: 2048

operationType*

string

Enum: AUTHORIZE, BIND_CARD, REFUND, CAPTURE, VOID, RECURRING

orderId*

string

Max length: 2048

params

object

reason

string

Причина ошибки
Max length: 2048

status

string

Enum: PENDING, SUCCESS, FAIL
Default: PENDING

updated

string<date-time>

Дата и время обновления операции (ISO 8601)

Предыдущая