/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",
"finalPrice": "50",
"title": "Шариковая ручка",
"quantity": {
"count": "10"
},
},
{
"productId": "id-2",
"finalPrice": "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
https://sandbox.pay.yandex.ru/api/merchant/v2/orders/{order_id}/refund
Production
Sandbox
Path parameters
Name |
Type |
Description |
order_id* |
string |
ID заказа на стороне продавца, который был передан в ответе на /order/create. |
Body
{
"externalOperationId": "string",
"refundAmount": "123.45",
"targetCart": {
"items": [
{
"price": "123.45",
"productId": "string",
"quantityCount": "123.45"
}
]
},
"targetShipping": {
"amount": "123.45"
}
}
Name |
Type |
Description |
externalOperationId |
string |
Идентификатор операции возврата в системе продавца. Должен быть уникальным Передайте его для того, чтобы получить возможность отслеживать состояние операции возврата через метод состояния операции.
Повторный вызов метода возврата с тем же значением |
refundAmount* |
string<double> |
Сумма к возврату |
targetCart |
Описывает итоговое состояние корзины после выполнения возврата.
Если это поле не указано или равно |
|
targetShipping |
Применимо только к Yandex Pay Checkout. В остальных случаях следует оставить это поле пустым. Описывает итоговое состояние доставки после выполнения возврата.
Если это поле не указано или равно |
TargetCart
Описывает итоговое состояние корзины после выполнения возврата.
Если это поле не указано или равно null
, то считается, что корзина возвращается полностью.
Name |
Type |
Description |
items |
TargetShipping
Применимо только к Yandex Pay Checkout. В остальных случаях следует оставить это поле пустым.
Описывает итоговое состояние доставки после выполнения возврата.
Если это поле не указано или равно null
, то считается, что стоимость доставки возвращается полностью.
Name |
Type |
Description |
amount |
string<double> |
Стоимость доставки после выполнения операции |
TargetCartItem
Name |
Type |
Description |
price |
string<double> |
Цена одной единицы товара/услуги после выполнения операции.
Необходимо указать, если цена одной единицы уменьшается в результате операции.
Это может быть полезным, если необходимо вернуть часть денег за товар или подтверждении заказа.
Если не указывать это поле в запросе, то считается, что цена осталась прежней. |
productId* |
string |
Идентификатор позиции в корзине на момент создания заказа. Если передать идентификатор, которого не было в первоначальной корзине - произойдёт ошибка. |
quantityCount |
string<double> |
Количество единиц товара/услуги, которое останется у пользователя после выполнения операции.
Если не указывать это поле в запросе, то считается, что количество не изменилось. |
Responses
200 OK
Body
{
"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: |
data |
||
status |
string |
Enum: |
OperationResponseData
Name |
Type |
Description |
operation |
Operation
Name |
Type |
Description |
amount* |
string<double> |
Сумма операции |
created |
string<date-time> |
Дата и время создания операции (ISO 8601) |
externalOperationId |
string |
Идентификатор операции на стороне продавца |
operationId* |
string<uuid> |
|
operationType* |
string |
Enum: |
orderId* |
string |
|
params |
object |
|
reason |
string |
Причина ошибки |
status |
string |
Enum: |
updated |
string<date-time> |
Дата и время обновления операции (ISO 8601) |