Skip to content

Корзина

Актуальный адрес корзины — /front_api/cart.json. Его используют новые шаблоны. /cart_items.json и /cart_items/v2.json остаются для старых тем.

PATCH /front_api/cart.json прибавляет количество к уже лежащим позициям. Отрицательное количество уменьшает позицию и удаляет её, когда остаток доходит до нуля. Ноль позицию не меняет. Точное количество, включая удаление нулём, задаёт PUT на /cart_items.json.

Получить корзину

Пустая корзина.

GET/front_api/cart.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 можно добавить к любому набору. Он выбирает склад в режиме нескольких корзин. Неизвестный склад игнорируется.

Одна модификация

PATCH/front_api/cart.json
Параметр Описание
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": "комментарий" }
}

Товар с опциями

PATCH/front_api/cart.json
Параметр Описание
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 берёт текущую корзину витрины и возвращает ссылку на её товары. Тело запроса не нужно. Ссылку можно отправить другому человеку.

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 возвращает укороченный объект.

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].

POST/cart_items.json
Параметр Описание
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 модификации]. Ноль удаляет позицию. Этот запрос задаёт количество, а не прибавляет его.

PUT/cart_items.json
Параметр Описание
_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 модификации.

DELETE/cart_items/2176487200.json
Параметр Описание
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.