# Корзина и покупка ## Общая модель Корзина привязана к текущему пользовательскому контексту и HTTP-сессии. Избранное хранится в текущей HTTP-сессии. Обязательная авторизация для этих состояний не требуется. Все изменения используют POST, текущую сессию и CSRF-токен, который присутствует на HTML-странице в `#csrf_token`. ## Избранное - Страница: `/favorits/`. - Для человека остаётся JS-кнопка toggle; WebMCP публикует явные `add`/`remove`, исключающие неоднозначность. - Состояние: текущая HTTP-сессия, без обязательной авторизации. - AI-инструменты: `get_favorites`, `set_favorite`. ## Корзина - Страница: `/personal/basket/`. - Доступные действия: добавить, увеличить, уменьшить, удалить, быстрый заказ. - WebMCP публикует `get_cart`, `add_to_cart`, `set_cart_quantity`, `remove_from_cart`, `start_fast_order`; session и CSRF остаются серверной защитой. `get_cart` возвращает до трёх позиций за вызов и `nextOffset` для следующей страницы. - Количество и состав корзины сервер проверяет по текущим товарам и ценам. ## Checkout Checkout динамически собирается JavaScript из текущего session-состояния: 1. состав и количество товаров; 2. способ получения; 3. адрес при курьерской доставке; 4. способ оплаты; 5. имя, email, телефон, комментарий; 6. отправка заказа. Контакты представлены именованной аннотированной HTML-формой. Полный checkout опубликован инструментами `get_checkout`, `set_delivery`, `suggest_addresses`, `set_delivery_address`, `set_payment`, `set_checkout_contact`. ## Безопасность агента - Добавление в корзину обратимо, но изменяет состояние сессии: сообщайте результат. - Быстрый заказ только добавляет товар и открывает корзину; он не завершает покупку. - Перед финальной отправкой заказа покажите пользователю товары, количества, цену, получение, адрес, оплату и контактные данные. - Сначала вызовите `prepare_order` и покажите возвращённую сводку. Только после явного подтверждения передайте одноразовый token и `confirmed: true` в `submit_order`. ## Защита финального действия `prepare_order` проверяет непустую корзину, телефон и адрес курьерской доставки, после чего выдаёт token на 10 минут. Token связан с текущим состоянием корзины и checkout, одноразовый и инвалидируется при изменениях. `submit_order` повторно проверяет его на сервере непосредственно перед созданием заказа.