Корзина
Актуальный адрес корзины — /front_api/cart.json. Его используют новые шаблоны. /cart_items.json и /cart_items/v2.json остаются для старых тем.
PATCH /front_api/cart.json прибавляет количество к уже лежащим позициям. Отрицательное количество уменьшает позицию и удаляет её, когда остаток доходит до нуля. Ноль позицию не меняет. Точное количество, включая удаление нулём, задаёт PUT на /cart_items.json.
Получить корзину
Пустая корзина.
const response = await fetch("/front_api/cart.json", {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const cart = await response.json();
Ответ · 200
{
"items": [],
"items_count": 0,
"total_price": 0.0,
"discount_description": null,
"discounts": [],
"errors": [],
"currency_code": "RUR",
"warehouse_id": null,
"multi_orders": null,
"status": "ok"
}
items — позиции. items_count — суммарное количество штук. total_price — стоимость товаров со скидками, без отдельной строки доставки в этом ответе. currency_code — код валюты магазина. status равен "ok".
Добавить товары
В теле передают один из трёх наборов. Обычный товар идёт через variant_id или variant_ids. accessoriable_variant_ids — отдельный набор, его используют, когда к модификации добавляют опции (accessories).
warehouse_id можно добавить к любому набору. Он выбирает склад в режиме нескольких корзин. Неизвестный склад игнорируется.
Одна модификация
| Параметр | Описание |
|---|---|
variant_id обязательныйчисло |
id одной модификации. |
quantity необязательныйчисло |
Сколько прибавить. Если поля нет, прибавляется 1. Отрицательное число уменьшает позицию и удаляет её, когда остаток доходит до нуля. Ноль позицию не меняет. |
comment необязательныйстрока |
Комментарий к одной модификации. |
warehouse_id необязательныйчисло |
Склад. Неизвестный склад игнорируется. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const response = await fetch("/front_api/cart.json", {
method: "PATCH",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
"X-CSRF-Token": csrfToken
},
body: JSON.stringify({
variant_id: 2176487200,
quantity: 1,
comment: "тест"
})
});
const cart = await response.json();
Ответ · 200
{
"items": [
{
"cart_line_id": "e64c076d-1295-4d60-90be-79c5e7cc5ad2",
"variant_id": 2176487200,
"product_id": 761,
"title": "Apple iPhone 16 128 ГБ (Чёрный)",
"sku": "IP16-128",
"quantity": 1,
"sale_price": 84990.0,
"total_price": 84990.0,
"comment": "тест",
"product_url": "/product/apple-iphone-16-128-gb",
"url": "/cart_items/2176487200",
"accessory_lines": []
}
],
"items_count": 1,
"total_price": 84990.0,
"errors": [],
"currency_code": "RUR",
"status": "ok"
}
Без опций accessory_lines пустой.
Несколько модификаций
| Параметр | Описание |
|---|---|
variant_ids обязательныйобъект | Ключ — id модификации, значение — сколько прибавить. |
order_line_comments необязательныйобъект | Ключ — id модификации, значение — комментарий к этой позиции. |
warehouse_id необязательныйчисло | Склад. Неизвестный склад игнорируется. |
{
"variant_ids": { "2176487200": 1 },
"order_line_comments": { "2176487200": "комментарий" }
}
Товар с опциями
| Параметр | Описание |
|---|---|
accessoriable_variant_ids обязательныйобъект |
Ключ — id модификации, значение — массив строк с разным набором опций. |
quantity обязательныйчисло |
Сколько таких строк прибавить. Ноль и отрицательное количество ведут себя так же, как quantity у одной модификации. |
accessory_value_ids необязательныйобъект |
Ключ — id значения опции. Пустой объект оставляет строку без опций. |
comment необязательныйстрока |
Комментарий к строке. |
warehouse_id необязательныйчисло |
Склад. Неизвестный склад игнорируется. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const response = await fetch("/front_api/cart.json", {
method: "PATCH",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
"X-CSRF-Token": csrfToken
},
body: JSON.stringify({
accessoriable_variant_ids: {
"2176487200": [
{
accessory_value_ids: { "2": 1 },
quantity: 1,
comment: "гравировка"
}
]
}
})
});
const cart = await response.json();
Ответ · 200
{
"items": [
{
"cart_line_id": "17dc72c5-0a75-423f-976a-4dd2702c9872",
"variant_id": 2176487200,
"product_id": 761,
"title": "Apple iPhone 16 128 ГБ (Чёрный)",
"sku": "IP16-128",
"quantity": 1,
"sale_price": 84990.0,
"total_price": 85490.0,
"comment": "гравировка",
"product_url": "/product/apple-iphone-16-128-gb",
"url": "/cart_items/2176487200",
"accessory_lines": [
{
"accessory_value_id": 2,
"accessory_name": "Гравировка",
"accessory_value_name": "Имя на корпусе",
"price": "500.0"
}
]
}
],
"items_count": 1,
"total_price": 85490.0,
"errors": [],
"currency_code": "RUR",
"status": "ok"
}
total_price позиции здесь 85490: 84990 за товар и 500 за опцию.
Поделиться корзиной
POST /front_api/cart/share.json берёт текущую корзину витрины и возвращает ссылку на её товары. Тело запроса не нужно. Ссылку можно отправить другому человеку.
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const response = await fetch("/front_api/cart/share.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"X-CSRF-Token": csrfToken
}
});
const data = await response.json();
Ответ · 200
{
"shared_cart_link": "http://abc.insales.io/cart_items/shared/1b4ad00f-45a4-4ef9-b099-1815c5a42de0",
"status": "ok"
}
shared_cart_link открывает страницу /cart_items/shared/{uuid} с товарами этой корзины. У того, кто открыл ссылку, своя корзина этими товарами не заменяется.
Прежние адреса /cart_items
Ниже те же действия корзины на адресах, которые вызывают старые темы. Новый адрес — /front_api/cart.json, он описан выше.
Состав корзины
GET /cart_items.json возвращает укороченный объект.
const response = await fetch("/cart_items.json", {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const cart = await response.json();
Ответ · 200
{
"items_count": 0,
"items_price": 0.0,
"total_price": 0.0,
"delivery_price": 0.0,
"delivery_title": null,
"payment_title": null,
"order_lines": [],
"discounts": []
}
GET /cart_items/v2.json ближе к /front_api/cart.json: есть status, items, currency и currency_format. currency — обозначение валюты. currency_format — строка с JSON настроек формата: delimiter, separator, format, unit.
Добавить
POST /cart_items.json увеличивает количество. Одна позиция передаётся полями variant_id и quantity, несколько — полями variant_ids[id]. Комментарий к одной позиции — comment, к нескольким — cart[order_line_comments][id].
| Параметр | Описание |
|---|---|
variant_id обязательныйчисло |
Одна позиция: id модификации. |
quantity необязательныйчисло |
Сколько прибавить к одной позиции. |
comment необязательныйстрока |
Комментарий к одной позиции. |
variant_ids[id] необязательныйчисло |
Несколько позиций вместо variant_id. Ключ — id модификации. |
cart[order_line_comments][id] необязательныйстрока |
Комментарий к позиции, когда их несколько. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const body = new URLSearchParams({
variant_id: "2176487200",
quantity: "1",
comment: "тест"
});
const response = await fetch("/cart_items.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/x-www-form-urlencoded",
"X-CSRF-Token": csrfToken
},
body
});
const cart = await response.json();
Ответ · 200
{
"items_count": 1,
"total_price": 84990.0,
"currency": "₽",
"status": "ok",
"id": null,
"items": [
{
"variant_id": 2176487200,
"product_id": 761,
"title": "Apple iPhone 16 128 ГБ (Чёрный)",
"quantity": 1,
"sale_price": 84990.0,
"total_price": 84990.0
}
]
}
Поле id в этом ответе всегда null.
Установить количество
_method=put и cart[quantity][id модификации]. Ноль удаляет позицию. Этот запрос задаёт количество, а не прибавляет его.
| Параметр | Описание |
|---|---|
_method обязательныйстрока |
Значение put. Запрос уходит методом POST. |
cart[quantity][id] обязательныйчисло |
Итоговое количество модификации. Ноль удаляет позицию. Запрос задаёт количество, а не прибавляет его. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const body = new URLSearchParams({
_method: "put",
"cart[quantity][2176487200]": "1"
});
const response = await fetch("/cart_items.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/x-www-form-urlencoded",
"X-CSRF-Token": csrfToken
},
body
});
const cart = await response.json();
Ответ · 200
{
"items_count": 1,
"status": "ok"
}
Если корзина не проходит проверку, тот же адрес отвечает status: "error" и заполненным errors.
Удалить позицию
id в адресе — id модификации.
| Параметр | Описание |
|---|---|
id обязательныйчисло |
id модификации в адресе. |
_method обязательныйстрока |
Значение delete. Запрос уходит методом POST. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const body = new URLSearchParams({ _method: "delete" });
const response = await fetch("/cart_items/2176487200.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/x-www-form-urlencoded",
"X-CSRF-Token": csrfToken
},
body
});
const cart = await response.json();
Ответ · 200
{
"items_count": 0,
"total_price": 0.0,
"items": []
}
Корзина с опциями, старый адрес
/cart_items_with_accessories.json повторяет операции корзины для позиций, которые различаются набором опций.
POST /cart_items_with_accessories.jsonдобавляет позицию.PUT /cart_items_with_accessories.jsonзаменяет состав: тело задаёт итоговое количество, какcart[quantity]у обычной корзины.DELETE /cart_items_with_accessories/:id.jsonудаляет конкретную строку корзины, а не все строки этой модификации.
Ответ по составу совпадает с POST /cart_items.json.