Skip to content

Процесс покупки в интернет-магазине

Полный путь клиента от обнаружения товара до доставки и послепродажной поддержки.

Обзор

Процесс покупки включает:

  1. Обнаружение товара (просмотр, поиск, фильтрация)
  2. Детали товара и отзывы
  3. Управление корзиной
  4. Процесс оформления заказа (доставка, оплата)
  5. Подтверждение заказа и отслеживание
  6. Доставка и послепродажные действия

Основная диаграмма процесса


Детали этапов

1. Обнаружение товара

Эндпоинт просмотра: GET /products

Параметры запроса:

ПараметрТипОписание
categorystringSlug категории
minPricenumberФильтр минимальной цены
maxPricenumberФильтр максимальной цены
sortstringpopular, newest, price_asc, price_desc
pagenumberНомер страницы (по умолчанию: 1)
limitnumberТоваров на страницу (по умолчанию: 20, максимум: 100)
inStockbooleanПоказывать только товары в наличии

Эндпоинт поиска: GET /products/search

Параметры запроса:

ПараметрТипОписание
qstringПоисковый запрос (минимум 2 символа)
categorystringОпциональный фильтр категории
sortstringrelevance, popular, price_asc, price_desc

Реализация поиска:

  • Полнотекстовый поиск PostgreSQL с tsvector
  • Взвешенный поиск: название (A), описание (B), SKU (C)
  • Нечеткое сопоставление для толерантности к опечаткам

2. Детали товара

Эндпоинт: GET /products/{slug}

Ответ:

json
{
  "id": "uuid",
  "sku": "WH-BT-001",
  "name": "Wireless Headphones Pro",
  "slug": "wireless-headphones-pro",
  "shortDescription": "Premium wireless headphones with noise cancellation",
  "description": "Full HTML description...",
  "basePrice": 9990.00,
  "salePrice": 7990.00,
  "currency": "RUB",
  "status": "ACTIVE",
  "stockQuantity": 45,
  "inStock": true,
  "images": [
    { "url": "https://cdn.../main.jpg", "isPrimary": true },
    { "url": "https://cdn.../side.jpg", "isPrimary": false }
  ],
  "category": {
    "id": "uuid",
    "name": "Electronics",
    "slug": "electronics"
  },
  "reviewsSummary": {
    "averageRating": 4.5,
    "totalReviews": 128
  },
  "careerPointsValue": 100.00
}

Отображение статуса наличия:

Уровень наличияОтображение
> 10"В наличии"
1-10"Осталось только X"
0"Нет в наличии"

3. Добавление в корзину

Эндпоинт: POST /cart/items

Запрос:

json
{
  "productId": "product-uuid",
  "quantity": 2
}

Правила валидации:

ПравилоОграничение
КоличествоМинимум: 1, Максимум: 99
Наличиеquantity <= доступный запас
Статус товараДолжен быть ACTIVE
Товаров в корзинеМаксимум 50 уникальных товаров

Идентификация корзины:

  • Авторизованный: По user_id
  • Гость: По session_id (cookie)

Атрибуция реферала:

  • Корзина наследует referring_partner_id из атрибуции сессии
  • Сохраняется, даже если пользователь входит во время оформления

4. Управление корзиной

Эндпоинт получения корзины: GET /cart

Ответ:

json
{
  "id": "cart-uuid",
  "items": [
    {
      "id": "item-uuid",
      "product": {
        "id": "product-uuid",
        "name": "Wireless Headphones Pro",
        "sku": "WH-BT-001",
        "imageUrl": "https://cdn.../thumb.jpg",
        "slug": "wireless-headphones-pro"
      },
      "quantity": 2,
      "unitPrice": 7990.00,
      "totalPrice": 15980.00,
      "stockStatus": "IN_STOCK",
      "availableQuantity": 45
    }
  ],
  "subtotal": 15980.00,
  "discountTotal": 0.00,
  "total": 15980.00,
  "currency": "RUB",
  "itemCount": 2,
  "referringPartnerCode": "ABC123"
}

Эндпоинт обновления количества: PATCH /cart/items/{itemId}

Запрос:

json
{
  "quantity": 3
}

Эндпоинт удаления товара: DELETE /cart/items/{itemId}

Сохранить на потом: POST /cart/items/{itemId}/save-for-later


5. Гостевое и авторизованное оформление

Процесс гостевого оформления:

  1. Сбор email (обязательно)
  2. Ввод адреса доставки
  3. Обработка оплаты
  4. Предложение создания аккаунта (опционально, после покупки)

Ограничения гостевого оформления:

  • История заказов только через поиск по email
  • Нет сохраненных адресов/способов оплаты
  • Нельзя использовать баллы лояльности
  • Атрибуция реферала по-прежнему работает

Объединение корзин (при входе гостя):

  • Товары гостевой корзины объединяются с корзиной пользователя
  • Дублирующиеся товары: количества суммируются
  • Атрибуция сохраняется из исходной корзины

6. Оформление Шаг 1: Адрес доставки

Эндпоинт сохраненных адресов: GET /users/me/addresses?type=SHIPPING

Запрос нового адреса:

json
{
  "firstName": "Ivan",
  "lastName": "Petrov",
  "phone": "+79001234567",
  "addressLine1": "ul. Lenina, d. 10, kv. 5",
  "addressLine2": "",
  "city": "Moscow",
  "state": "Moscow Oblast",
  "postalCode": "101000",
  "country": "RUS",
  "saveAddress": true,
  "setAsDefault": true
}

Валидация адреса:

ПолеПравила
firstName, lastNameОбязательно, 2-100 символов
addressLine1Обязательно, максимум 255 символов
cityОбязательно, максимум 100 символов
postalCodeОбязательно, формат зависит от страны
countryОбязательно, ISO 3166-1 alpha-3
phoneОбязательно, формат E.164

7. Оформление Шаг 2: Способ доставки

Эндпоинт: GET /checkout/shipping-methods

Ответ:

json
{
  "methods": [
    {
      "id": "method-uuid",
      "name": "CDEK Express",
      "carrier": "CDEK",
      "price": 350.00,
      "currency": "RUB",
      "estimatedDays": { "min": 2, "max": 4 },
      "description": "Fast delivery to your door"
    },
    {
      "id": "method-uuid-2",
      "name": "Standard Delivery",
      "carrier": "CDEK",
      "price": 200.00,
      "currency": "RUB",
      "estimatedDays": { "min": 5, "max": 7 },
      "description": "Economic delivery option"
    }
  ]
}

Расчет тарифов:

  • На основе: адреса назначения, веса, габаритов
  • Кэшируется на 15 минут
  • Реальный API-вызов к перевозчику при отсутствии кэша

8. Оформление Шаг 3: Оплата

Поддерживаемые способы оплаты:

СпособПровайдерВозможности
Кредитная/Дебетовая картаStripe3D Secure, сохраненные карты
Банковская карта (РФ)YooKassaРоссийские карты, SberPay
Электронный кошелекYooKassaYooMoney, QIWI
Банковский переводYooKassaОплата по счету

Процесс оплаты (Stripe):

  1. Frontend создает PaymentIntent
  2. Пользователь вводит данные карты в Stripe Elements
  3. Frontend подтверждает оплату
  4. Backend верифицирует через webhook

Эндпоинт завершения оформления: POST /checkout/complete

Запрос:

json
{
  "paymentMethodId": "pm_xxx",
  "paymentIntentId": "pi_xxx",
  "billingAddressId": "address-uuid",
  "notes": "Leave at door"
}

9. Подтверждение заказа

Созданный заказ:

json
{
  "id": "order-uuid",
  "orderNumber": "ORD-2024-001234",
  "status": "CONFIRMED",
  "items": [...],
  "subtotal": 15980.00,
  "shippingCost": 350.00,
  "discountTotal": 0.00,
  "taxAmount": 0.00,
  "total": 16330.00,
  "currency": "RUB",
  "shippingAddress": {...},
  "shippingMethod": {...},
  "createdAt": "2024-01-15T10:30:00Z",
  "estimatedDelivery": "2024-01-19"
}

Письмо подтверждения содержит:

  • Номер заказа и сводку
  • Детализированный список с ценами
  • Адрес и способ доставки
  • Ожидаемую дату доставки
  • Контакт поддержки

10. Отслеживание заказа

Эндпоинт: GET /orders/{orderNumber}

Хронология статусов заказа:

СтатусОписаниеДействие пользователя
PENDINGЗаказ создан, ожидает оплатыЗавершить оплату
CONFIRMEDОплата успешнаОжидать обработки
PROCESSINGПодготавливаетсяОжидать отправки
SHIPPEDПередан перевозчикуОтслеживать отправление
DELIVEREDПолучен клиентомОставить отзыв, запросить возврат
CANCELLEDЗаказ отмененСвязаться с поддержкой
REFUNDEDДеньги возвращеныН/Д

Интеграция отслеживания:

  • Отслеживание в реальном времени через API перевозчика
  • Webhook-обновления при изменении статуса
  • SMS/Email-уведомления на каждом этапе

11-12. Выполнение и доставка

Переходы состояний заказа:

PENDING -> CONFIRMED -> PROCESSING -> SHIPPED -> DELIVERED
    |          |            |
    v          v            v
CANCELLED  CANCELLED   CANCELLED (rare)
                           |
                           v
                       REFUNDED

Webhook-события перевозчика:

СобытиеДействие
picked_upОбновить статус отправления
in_transitОбновить события отслеживания
out_for_deliveryОтправить уведомление
deliveredОбновить заказ до DELIVERED
returnedИнициировать процесс возврата

13. Послепродажные действия

Отзывы

Эндпоинт: POST /products/{productId}/reviews

Запрос:

json
{
  "rating": 5,
  "title": "Great headphones!",
  "content": "Sound quality is amazing, battery lasts all day.",
  "orderId": "order-uuid"
}

Правила отзывов:

  • Товар должен быть куплен (заказ DELIVERED)
  • Один отзыв на товар от пользователя
  • Требуется модерация перед публикацией

Возвраты

Эндпоинт: POST /orders/{orderNumber}/returns

Запрос:

json
{
  "items": [
    {
      "orderItemId": "item-uuid",
      "quantity": 1,
      "reason": "DEFECTIVE",
      "description": "Left speaker not working"
    }
  ]
}

Причины возврата:

КодОписаниеСрок возврата
DEFECTIVEДефект товараПолный возврат, 3-5 дней
WRONG_ITEMПолучен неправильный товарПолный возврат, 3-5 дней
NOT_AS_DESCRIBEDНе соответствует описаниюПолный возврат, 3-5 дней
CHANGED_MINDПокупатель передумалВозврат минус доставка, 5-7 дней

Окно возврата: 14 дней с момента доставки


Сценарии ошибок

Ошибки корзины

СценарийHTTP-кодКод ошибкиСообщение
Товар не найден404PRODUCT_NOT_FOUND"Товар больше недоступен"
Нет в наличии422INSUFFICIENT_STOCK"Доступно только X товаров"
Товар снят с продажи422PRODUCT_UNAVAILABLE"Этот товар больше не продается"
Корзина пуста400EMPTY_CART"Ваша корзина пуста"

Ошибки оформления

СценарийHTTP-кодКод ошибкиСообщение
Наличие изменилось при оформлении409STOCK_CHANGED"Некоторые товары больше недоступны"
Цена изменилась409PRICE_CHANGED"Цены были обновлены"
Неверный адрес400INVALID_ADDRESS"Пожалуйста, проверьте ваш адрес"
Доставка недоступна422SHIPPING_UNAVAILABLE"Доставка по этому адресу недоступна"

Ошибки оплаты

СценарийHTTP-кодКод ошибкиСообщение
Карта отклонена422CARD_DECLINED"Ваша карта была отклонена"
Недостаточно средств422INSUFFICIENT_FUNDS"Недостаточно средств"
Ошибка 3DS4223DS_FAILED"Верификация 3D Secure не удалась"
Таймаут оплаты408PAYMENT_TIMEOUT"Время оплаты истекло, попробуйте снова"

Связанные документы