Покупатель
Запросы идут с cookie витрины. Форма ответа контактов зависит от поколения личного кабинета.
Контакты
Гость классического кабинета не получает карточку:
const response = await fetch("/client_account/contacts.json", {
credentials: "same-origin",
headers: { Accept: "application/json" }
});
const data = await response.json();
Ответ · 200
{
"status": "error",
"message": "Not authorized",
"url": "/client_account/session/new"
}
Личный кабинет третьего поколения отвечает status: "ok" и объектом client. У гостя registered равен false, имя, телефон и email пустые:
{
"status": "ok",
"client": {
"id": null,
"email": null,
"name": null,
"surname": null,
"middlename": null,
"phone": null,
"registered": false,
"subscribe": true,
"bonus_points": 0,
"client_group_id": null,
"type": "Client::Individual",
"fields_values": [],
"default_address": null,
"orders_count": 0
}
}
У вошедшего покупателя те же ключи заполнены: id, email, name, phone, registered: true, orders_count, default_address.
Обратная связь
Тело — объект feedback. content обязателен. Пустой content отвечает 200 и { "status": "error", "errors": { "content": ["Сообщение не может быть пустым"] } }. Запрос без объекта feedback отвечает { "status": "error", "errors": {} }.
| Параметр | Описание |
|---|---|
feedback[content] обязательныйстрока |
Текст сообщения. Пустой текст отвечает ошибкой поля content. |
feedback[from] необязательныйстрока |
Email отправителя. |
feedback[name] необязательныйстрока |
Имя. |
feedback[phone] необязательныйстрока |
Телефон. |
feedback[subject] необязательныйстрока |
Тема письма. |
g-recaptcha-response необязательныйстрока |
Токен reCAPTCHA. Его передают, когда в магазине выбран этот тип капчи. |
recaptcha_type необязательныйстрока |
Только для reCAPTCHA. У невидимой капчи значение invisible. |
yandex-smart-token необязательныйстрока |
Токен Yandex SmartCaptcha. Его передают, когда в магазине выбран этот тип капчи. Имя совпадает со скрытым полем виджета. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const response = await fetch("/client_account/feedback.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
"X-CSRF-Token": csrfToken
},
body: JSON.stringify({
feedback: {
from: "from@mail.ru",
name: "Антон",
phone: "+7 (111) 111 11 11",
subject: "Обратная связь",
content: "Тест документации"
}
})
});
const data = await response.json();
Ответ · 200
{
"status": "ok",
"notice": "Сообщение успешно отправлено."
}
Неверный CSRF: 422 и { "status": "error", "message": "Invalid CSRF token" }.
Какое поле капчи передавать, зависит от типа капчи магазина. Для reCAPTCHA это g-recaptcha-response. На формах обратного звонка и предзаказа эта капча невидимая: вместе с токеном передают recaptcha_type=invisible. Для Yandex SmartCaptcha это yandex-smart-token на верхнем уровне запроса, поле recaptcha_type не нужно. Форма подписки в подвале капчу не показывает. Запрос витрины уходит как application/x-www-form-urlencoded и для reCAPTCHA передаёт токен и тип ещё и внутри feedback. Сервер читает токен на верхнем уровне.
Вход
Классический кабинет принимает POST /client_account/session.json с полями email и password либо login и code. Успех возвращает client.
Одноразовый код для кабинета третьего поколения: POST /client_account/one_time_code.json с полем login. Пустой логин:
{
"status": "error",
"errors": ["Недопустимый адрес электронной почты"],
"timeout": null
}
Успешная отправка кода отвечает { "status": "ok", "timeout": 60 }. timeout — секунды до повторной отправки. Тип логина задаёт type (email по умолчанию), канал — auth_type (sms по умолчанию).
Выход из классического кабинета: POST /client_account/exit.json.
Ключ мессенджера
GET /front_api/messengers/anonymous_key.json возвращает строку ключа анонимной сессии, не объект. Ключ нужен виджету сообщений, чтобы отличить гостя до регистрации.