Содержание статьи
Примеры нотификаций
На этой странице собраны примеры всех типов нотификаций, которые отправляет Lamoda B2B Platform Partner API. Используйте эти примеры для тестирования и отладки интеграции.
Изменение статуса заказа (statusChanged)
Отправляется при изменении статуса заказа целиком.
Заказ подтверждён (Confirmed)
{
"type": "statusChanged",
"trackingId": "117391950",
"sequenceNumber": 2,
"data": {
"id": "CZ117391950",
"status": "Confirmed",
"paymentMethod": "COD",
"fullSum": "12000.00",
"deliveryPrice": "250.00",
"createdAt": "2025-01-20",
"updatedAt": "2025-01-20 10:30:15",
"dates": {
"confirmed": "2025-01-20 10:30:00"
},
"confirmationFailedReason": null,
"currency": "rub",
"items": [
{
"id": 7598,
"status": "Confirmed",
"finalERPStatus": null,
"sku": "SELLERSKU104",
"size": "42",
"description": "Кроссовки Nike Air Max",
"paidPrice": 12000.00,
"totalDiscount": "0.00",
"datamatrix": null,
"statusChangeReason": null
}
],
"shippingAddress": {
"zipcode": "115114",
"region": "Москва",
"city": "Москва",
"street": "Летниковская",
"houseNum": "д.2 с1",
"apartment": "909",
"cityId": "7700000000000",
"streetId": "77000000000170700",
"buildingId": "770000000001707000001",
"pickupPointId": null
},
"deliveryMethod": {
"deliveryPrice": "250.00",
"deliveryDate": "2025-01-22",
"deliveryIntervalFrom": "15:00",
"deliveryIntervalTo": "18:00",
"deliveryIntervalId": 514877540,
"hasIntervals": true,
"shippingMethodName": "Курьерская доставка Lamoda Express",
"shippingMethodCode": "lamoda",
"serviceLevelTypeCode": "economy_b2b",
"serviceLevelTypeName": "Без примерки",
"cutOff": "2025-01-28 03:00:00",
"shippingMethodTypeCode": "delivery_service"
},
"customer": {
"firstName": "Иван",
"lastName": "Петров",
"middleName": "Сергеевич",
"phone": "+79161234567",
"email": "ivan.petrov@example.com"
}
}
}
Заказ доставлен (Delivered)
{
"type": "statusChanged",
"trackingId": "117391950",
"sequenceNumber": 5,
"data": {
"id": "CZ117391950",
"status": "Delivered",
"paymentMethod": "COD",
"fullSum": "12000.00",
"deliveryPrice": "250.00",
"createdAt": "2025-01-20",
"updatedAt": "2025-01-22 17:48:00",
"dates": {
"confirmed": "2025-01-20 10:30:00",
"shipped": "2025-01-21 08:15:00",
"delivered": "2025-01-22 17:48:00"
},
"items": [
{
"id": 7598,
"status": "Delivered",
"finalERPStatus": "sold",
"sku": "SELLERSKU104",
"size": "42",
"paidPrice": 12000.00,
"datamatrix": "010460406000600021K4FNP6WPM93DH"
}
]
}
}
Изменение статуса товара (itemStatusChanged)
Отправляется при изменении статуса отдельного товара в заказе.
Частичный выкуп — один товар доставлен, второй не выкуплен
{
"type": "itemStatusChanged",
"trackingId": "117391951",
"sequenceNumber": 6,
"data": {
"id": "CZ117391951",
"status": "Delivered",
"paymentMethod": "COD",
"fullSum": "25000.00",
"createdAt": "2025-01-20",
"updatedAt": "2025-01-22 18:15:00",
"dates": {
"delivered": "2025-01-22 18:15:00"
},
"items": [
{
"id": 7599,
"status": "Delivered",
"finalERPStatus": "sold",
"sku": "SELLERSKU201",
"size": "M",
"description": "Куртка зимняя",
"paidPrice": 15000.00,
"statusChangeReason": null
},
{
"id": 7600,
"status": "Not bought",
"finalERPStatus": "rejected",
"sku": "SELLERSKU202",
"size": "L",
"description": "Свитер шерстяной",
"paidPrice": 10000.00,
"statusChangeReason": "Размер не подошёл"
}
]
}
}
Возврат товара (Claimed → Claimed ok)
{
"type": "itemStatusChanged",
"trackingId": "117391950",
"sequenceNumber": 8,
"data": {
"id": "CZ117391950",
"status": "Delivered",
"updatedAt": "2025-01-30 14:20:00",
"items": [
{
"id": 7598,
"status": "Claimed ok",
"finalERPStatus": "claimed_ok",
"sku": "SELLERSKU104",
"size": "42",
"paidPrice": 12000.00,
"statusChangeReason": "Товар не подошёл по размеру",
"datamatrix": "010460406000600021K4FNP6WPM93DH"
}
]
}
}
Изменение статуса поставки FBO (fulfilmentShipmentStatusChanged)
Отправляется при изменении статуса входящей FBO-поставки на склад Lamoda. Доступна только для модели FBO (см. таблицу доступности).
Поставка подтверждена (Confirmed)
{
"type": "fulfilmentShipmentStatusChanged",
"createdAt": "2025-01-15T11:00:00+03:00",
"data": {
"id": 12345,
"shipmentId": "SHIP-2025-001234",
"status": "confirmed",
"itemQuantity": 100,
"priceSum": 250000.00,
"receipt": 0,
"accepted": 0,
"surplus": 0,
"missing": 0,
"damaged": 0,
"items": [
{
"sku": "SELLER-SKU-001",
"ean": "4600000000001",
"quantity": 50,
"price": 2500.00,
"datamatrixes": ["010460406000600021K4FNP6WPM93DH", "010460406000600021K4FNP6WPM93DI"]
},
{
"sku": "SELLER-SKU-002",
"ean": "4600000000002",
"quantity": 50,
"price": 2500.00,
"datamatrixes": []
}
]
}
}
Поставка принята по количеству (Received)
{
"type": "fulfilmentShipmentStatusChanged",
"createdAt": "2025-01-18T16:30:00+03:00",
"data": {
"id": 12345,
"shipmentId": "SHIP-2025-001234",
"status": "received",
"itemQuantity": 100,
"priceSum": 250000.00,
"receipt": 97,
"accepted": 0,
"surplus": 2,
"missing": 5,
"damaged": 0,
"unknownSurplus": 0,
"items": [
{
"sku": "SELLER-SKU-001",
"ean": "4600000000001",
"quantity": 50,
"receipt": 48,
"accepted": 0,
"surplus": 0,
"missing": 2,
"damaged": 0
},
{
"sku": "SELLER-SKU-002",
"ean": "4600000000002",
"quantity": 50,
"receipt": 49,
"accepted": 0,
"surplus": 2,
"missing": 3,
"damaged": 0
}
]
}
}
Поставка закрыта по качеству (Closed)
{
"type": "fulfilmentShipmentStatusChanged",
"createdAt": "2025-01-20T10:00:00+03:00",
"data": {
"id": 12345,
"shipmentId": "SHIP-2025-001234",
"status": "closed",
"itemQuantity": 100,
"priceSum": 250000.00,
"receipt": 97,
"accepted": 95,
"surplus": 2,
"missing": 5,
"damaged": 2,
"unknownSurplus": 0,
"items": [
{
"sku": "SELLER-SKU-001",
"ean": "4600000000001",
"quantity": 50,
"receipt": 48,
"accepted": 47,
"surplus": 0,
"missing": 2,
"damaged": 1
},
{
"sku": "SELLER-SKU-002",
"ean": "4600000000002",
"quantity": 50,
"receipt": 49,
"accepted": 48,
"surplus": 2,
"missing": 3,
"damaged": 1
}
]
}
}
Структура полей нотификации
Общие поля (statusChanged, itemStatusChanged)
| Поле | Тип | Описание |
type
|
string |
Тип нотификации (statusChanged или itemStatusChanged)
|
trackingId
|
string |
Номер заказа (без префикса). Подтверждено: NotificationMessage::getTrackingId()
|
sequenceNumber
|
integer | Порядковый номер изменения (для идемпотентности) |
data
|
object | Полные данные заказа со всеми товарами |
Поля верхнего уровня (fulfilmentShipmentStatusChanged)
| Поле | Тип | Описание |
type
|
string |
Всегда fulfilmentShipmentStatusChanged
|
createdAt
|
datetime | Время создания нотификации (ISO 8601) |
data
|
object | Данные поставки (ID, статус, позиции, приёмка) |
Поля товара в заказе (statusChanged, itemStatusChanged)
| Поле | Тип | Описание |
id
|
integer | ID товара в заказе |
status
|
string | Текущий статус товара |
finalERPStatus
|
string | Финальный ERP-статус (sold, rejected, claimed_ok и т.д.) |
sku
|
string | Артикул товара |
paidPrice
|
number | Оплаченная цена |
datamatrix
|
string | Код маркировки (UIT) |
statusChangeReason
|
string | Причина изменения статуса |
Поля позиции в FBO-поставке (fulfilmentShipmentStatusChanged)
| Поле | Тип | Описание |
sku
|
string | Артикул товара партнёра |
ean
|
string | Штрихкод EAN |
quantity
|
integer | Заявленное количество |
receipt
|
integer | Фактически принято (количественная приёмка) |
accepted
|
integer | Принято по качеству |
surplus
|
integer | Излишки |
missing
|
integer | Недостача |
damaged
|
integer | Повреждённые единицы |
price
|
number | Цена за единицу (присутствует при статусе Confirmed) |
datamatrixes
|
array of string | Коды маркировки (массив UIT, присутствует при статусе Confirmed) |
Использование sequenceNumber
Идемпотентность: ПолеsequenceNumber увеличивается с каждым изменением статуса. Используйте его для:
- Проверки порядка обработки нотификаций
- Игнорирования устаревших нотификаций (если получили sequenceNumber=5, а потом пришла 3 — игнорируем)
- Отладки и расследования инцидентов
def handle_notification(notification):
order_id = notification['data']['id']
seq = notification.get('sequenceNumber')
if seq is None:
# fulfilmentShipmentStatusChanged может не содержать sequenceNumber
process_notification(notification)
return
# Получаем последний обработанный sequenceNumber
last_seq = get_last_sequence(order_id)
if seq <= last_seq:
# Уже обработали или более свежую версию
log.info(f"Skipping old notification: {seq} <= {last_seq}")
return
# Обрабатываем
process_notification(notification)
save_sequence(order_id, seq)
Обработка нотификаций
Важно: НотификацииstatusChanged и itemStatusChanged всегда содержат полную информацию о заказе со всеми товарами. Даже если изменился статус одного товара, вы получите данные всех товаров в заказе.
Рекомендуемый алгоритм обработки
- Получить нотификацию
- Проверить
sequenceNumber(не устарела ли) — для заказных нотификаций - Извлечь
typeи направить в соответствующий обработчик - Обновить локальные данные
- Вернуть HTTP 200 OK
# Пример обработчика на Python (Flask)
@app.route('/webhook', methods=['POST'])
def handle_webhook():
notification = request.json
notification_type = notification.get('type')
handlers = {
'statusChanged': handle_order_status,
'itemStatusChanged': handle_item_status,
'fulfilmentShipmentStatusChanged': handle_shipment_status
}
handler = handlers.get(notification_type)
if handler:
handler(notification)
else:
# Игнорируйте неизвестные типы —
# в будущем могут появиться новые
log.warning(f"Unknown notification type: {notification_type}")
return 'OK', 200
Статусы доставки нотификаций
Каждая нотификация проходит через внутренние статусы доставки. Эти статусы отображаются в ответе метода управления подписками:
| Статус подписки | Внутренний статус | Описание |
active
|
sent | Последняя нотификация успешно доставлена |
failing
|
failed | Доставка не удалась (проверьте endpoint) |
has deferred messages
|
deferred | Подписка была отключена — нотификации накапливаются и будут отправлены при включении |
no messages
|
new | Нотификация создана, ожидает отправки (или нотификаций ещё не было) |
disabled
|
— | Подписка отключена партнёром |
Возможные ошибки доставки
При неудачной доставке нотификации система фиксирует одну из следующих ошибок:
| Код ошибки | Описание | Что делать |
http connection timeout
|
Timeout при подключении к endpoint партнёра | Проверьте доступность и скорость отклика endpoint |
http connection failed
|
Не удалось установить соединение | Проверьте DNS, HTTPS-сертификат и firewall |
http request failed
|
Endpoint вернул ошибочный HTTP-код (4xx/5xx) | Проверьте логику обработки на вашей стороне |
notifications disabled
|
Подписка была отключена в момент генерации | Включите подписку — deferred-нотификации переотправятся |
internal error
|
Внутренняя ошибка платформы Lamoda | Используйте переотправку или обратитесь в поддержку |
Статус верификации документа
| Элемент | Статус | Комментарий |
| Примеры statusChanged | Структура соответствует коду | |
| Примеры itemStatusChanged | Структура соответствует коду | |
| Примеры FBO (fulfilmentShipmentStatusChanged) | Структура ОК; расхождения формата с 10_2 (createdAt vs date) | |
| Примеры FBS (удалены) | Удалено | Код подтверждает: fulfilmentShipmentStatusChanged — только FBO. FBS = отдельное событие shipmentOutReceivedRest |
| Таблица общих полей | Исправлено | Разделена на заказные и поставочные нотификации |
| Таблица полей FBO-позиций | Добавлено | Отдельная таблица для items в FBO-нотификации (структура отличается от заказных items) |
| Статусы доставки Message | Добавлено | 4 статуса + маппинг подтверждены: Message entity + NotificationSubscriptionResponseFactory |
| Ошибки доставки | Добавлено | 5 типов ошибок из констант Message entity |
| Регистр статусов FBO | Расхождение: lowercase в примерах vs capitalized в 10_2 и state machine. Нужен сериализатор | |
| Формат createdAt vs date | Расхождение с 10_2. Нужен код сериализатора для разрешения |
См. также
Помогла эта информация?
Спасибо за отзыв
0/1000
Отправить