Корзина, расчёт доставки СДЭК, пункты выдачи и оплата. Вход покупателю не нужен: гостевая корзина держится на паре кук, которые платформа выдаёт сама. Если покупатель потом войдёт, его гостевая корзина подхватится.
Заказ не списывает остаток, а закрепляет товар за собой. Списание происходит в момент отгрузки. Поэтому брошенная корзина или неоплаченный заказ не «съедают» витрину навсегда: закрепление снимается само.
Отсюда следствие для интерфейса: остаток, который отдаёт корзина, — доступный, то есть уже за вычетом чужих закреплений. Складывать его с чем-то ещё не нужно.
Корзина, расчёт доставки СДЭК, пункты выдачи и оплата. Вход покупателю не нужен: гостевая корзина держится на паре кук, которые платформа выдаёт сама. Если покупатель потом войдёт, его гостевая корзина подхватится.
Отдельно вызывать не обязательно: если обратиться к любому /cart-эндпоинту вообще без пропуска, платформа заведёт его сама. Явный вызов нужен, когда хочется получить пропуск заранее — например, чтобы показать пустую корзину до первого действия.
Содержимое корзины с ценами и доступными остатками.
Доступ:Гостевая сессияСессия сотрудника
Для вошедшего покупателя — его корзина, для гостя — та, что привязана к пропуску. Остаток считается доступный: физический минус то, что уже закреплено за чужими неотгруженными заказами.
Заголовки
Параметр
Тип
Обязателен
Описание
X-Site-Source
string
нет
Код магазина. Сервер его не требует — без заголовка подставляется бренд по умолчанию (acme). Для настоящей интеграции передавайте всегда.
X-Guest-ID
string
нет
Пропуск гостя, если покупатель не вошёл.
X-Guest-Token
string
нет
Подпись пропуска. Обязателен вместе с X-Guest-ID — без него 401.
Позиции или корзины нет, либо любая другая ошибка сервиса. Реальные причины («Корзина не найдена», «Товар не найден в корзине») не документированы отдельными кодами — контроллер отдаёт для них всех одинаковый 500.
Отдаёт города перевозчика вместе с их кодами. Код нужен и для списка пунктов выдачи, и для расчёта доставки, и при создании заказа — сохраняйте его вместе с названием.
Параметры запроса
Параметр
Тип
Обязателен
Описание
q
string
нет
Часть названия или региона. Имя параметра именно q, не search — search молча игнорируется, поиск станет пустым.
Поля ответа
Поле
Тип
Описание
code
int
Код города у перевозчика.
city
string
Название.
region
string
Регион — им различают одноимённые города.
Ошибки
Код
Ответ сервера
Когда возникает
Что делать
500
{"error":"Internal server error"}
Параметр q не передан вовсе — сервис падает на пустом запросе.
Товар при этом не списывается со склада, а закрепляется за заказом: списание происходит в момент отгрузки. Поэтому создание заказа не «съедает» остаток витрины навсегда — неоплаченный резерв освободится сам.
Заголовки
Параметр
Тип
Обязателен
Описание
X-Site-Source
string
да
Код магазина.
X-Guest-ID
string
нет
Пропуск гостя.
X-CSRF-Token
string
нет
Ключ из /auth/csrf. Заявлен обязательным, но фактически на этом роуте не проверяется — CSRF-middleware сюда не навешан. Присылайте его всё равно: это может измениться без предупреждения.
Тело запроса
Параметр
Тип
Обязателен
Описание
lastName
string
да
Фамилия получателя.
firstName
string
да
Имя.
middleName
string
нет
Отчество.
phone
string
да
Телефон.
email
string
нет
Почта — на неё уйдёт письмо с заказом. Проверяется поверх (подтверждённость), но сама обязательность поля сервером не проверена.
telegram
string
нет
Контакт в Telegram.
city
string
нет
Город. Обязательность не проверяется сервером — пустое значение приведёт к 500, а не к понятной ошибке.
cityCode
int
нет
Код города.
deliveryMethod
cdek_pvz | cdek_courier | international
нет
Способ доставки. Обязательность не проверяется сервером.
pvzCode
string
нет
Код пункта выдачи для cdek_pvz.
pvzAddress
string
нет
Адрес пункта выдачи текстом.
street
string
нет
Улица для курьера.
house
string
нет
Дом.
apartment
string
нет
Квартира.
entrance
string
нет
Подъезд.
floor
string
нет
Этаж.
intercom
string
нет
Домофон.
postalCode
string
нет
Индекс.
inn
string
нет
ИНН — для покупки от юрлица/ИП.
promoCode
string
нет
Промокод, уже проверенный через /orders/validate-promo.
comment
string
нет
Комментарий покупателя.
paymentMethod
string
нет
Способ оплаты.
agreedToTerms
boolean
нет
Согласие с условиями. Сервер проверяет только истинность значения, не то, что поле прислано — по факту необязательное.
agreedToPrivacy
boolean
нет
Согласие на обработку данных. Та же оговорка.
agreedToMarketing
boolean
нет
Согласие на рассылку.
marketingUtmCampaign
string
нет
UTM-метка рекламной кампании.
Поля ответа
Поле
Тип
Описание
id
int
Идентификатор заказа.
orderNumber
string
Номер для покупателя.
hash
string
Ключ для страницы отслеживания без входа.
total
int
Итого с доставкой.копейки
deliveryCost
int
Доставка.копейки
Ошибки
Код
Ответ сервера
Когда возникает
Что делать
500
{"error":"Internal server error"}
Корзина пуста, либо товар в ней стал недоступен, либо не указан город. Три разных случая дают один и тот же 500 — исходный текст ошибки в ответ не попадает, это баг бэкенда, а не отсутствие валидации по смыслу.
—
400
{"error":"Выберите пункт выдачи СДЭК"}
Доставка в пункт выдачи без указания пункта.
—
400
{"error":"Укажите улицу и дом для курьерской доставки"}
Курьерская доставка без адреса.
—
400
{"error":"Выбранный способ доставки недоступен"}
Магазин отключил этот способ.
—
422
{"error":"Подтвердите email в профиле, чтобы оформить заказ."}
У покупателя не подтверждена почта.
—
409
{"error":"Промокод больше недоступен: лимит использований исчерпан"}code: PROMO_EXHAUSTED
Лимит использований промокода исчерпали между проверкой и оформлением.
—
409
{"error":"<товар>: доступно к продаже только N шт."}code: SALES_LIMIT
В корзине товар/размер, для которого магазин ограничил продажи («не больше N штук»), и лимит на момент оформления уже исчерпан. Не задокументировано в коде — проверяется перед созданием заказа.
Заводит платёж и возвращает адрес платёжной страницы.
Доступ:Гостевая сессияСессия сотрудника
После создания заказа отправьте покупателя по этому адресу. Итог платежа платформа узнаёт сама от банка — опрашивать её не нужно, статус заказа обновится.
Заголовки
Параметр
Тип
Обязателен
Описание
X-Site-Source
string
да
Код магазина.
X-CSRF-Token
string
нет
Ключ из /auth/csrf. Заявлен обязательным, но фактически на этом роуте не проверяется. Присылайте всё равно.
Тело запроса
Параметр
Тип
Обязателен
Описание
orderId
int
да
Заказ, который оплачиваем.
paymentMethod
string
нет
Способ оплаты. Фактически на сервере игнорируется: параметр нигде не используется дальше, платёж всегда заводится через Т-Банк независимо от значения. Можно не присылать вовсе.
Поля ответа
Поле
Тип
Описание
paymentId
string
Внутренний идентификатор строки платежа в БД. НЕ идентификатор транзакции у банка — тот в этот ответ не попадает вообще.
orderId
int
Оплачиваемый заказ.
orderNumber
string
Номер заказа для покупателя.
orderHash
string
Ключ страницы отслеживания.
amount
number
Сумма к оплате.
paymentMethod
string
Всегда возвращает "tbank", независимо от того, что было прислано в теле запроса (или не прислано вовсе) — переданное значение сервер не учитывает.
paymentUrl
string
Адрес платёжной страницы.
status
string
Статус свежесозданного платежа.
Ошибки
Код
Ответ сервера
Когда возникает
Что делать
500
{"error":"Internal server error"}
Заказ уже оплачен ("Оплата уже выполнена") либо заказ не найден ("Заказ не найден") — обе проверки бросают ошибку без кода статуса и проваливаются в общий catch. Документированные тексты «Заказ уже оплачен» (400) и «Заказ не найден» (404) в ответе НЕ появляются — реальный текст всегда «Internal server error», а код всегда 500. Это баг бэкенда.
—
400
{"error":"Онлайн-оплата для этого магазина пока не настроена..."}code: TBANK_NOT_CONFIGURED