Микросервис checkout-orchestration

В статье описываются функции, логика работы, конфигурация и методы микросервиса checkout-orchestration.

Микросервис checkout-orchestration предоставляет функциональность для управления заказами (оформление и сбор статистики).

Доступ к сервису предоставляется по запросу.

Логика работы Copy-icon

В работе микросервиса используются следующие сущности:

  • Заказ (Order) - содержит данные конкретного заказа (id заказа, id покупателя, номер заказа, дата формирования заказа, товары в заказе, адрес доставки, данные получателя, итоговая сумма заказа, скидки, статус заказа и др.)
  • Статистика заказов пользователей (AggregatedCustomerStatistics) - содержит статистику количества заказов пользователей
  • Количество заказов пользователя (AccountOrderTotal) - содержит данные об итоговом количестве заказов конкретного пользователя

Аутентификация Copy-icon

При обращении к микросервису через API необходимо указать следующие параметры в заголовке:

  • Authorization - для указания токена: Authorization: Bearer <токен>
  • If-Match - для указания значения захешированного заказа при редактировании: If-Match: <хэш заказа>
  • If-None-Match - для указания значения захешированного заказа при получении: If-None-Match: <хэш заказа>

Service context path Copy-icon

/api/checkout-orchestration/

Настройки и параметры конфигурации Copy-icon

Параметры конфигурации указываются в Vault.

Vault используется на нашей платформе в качестве хранилища всех конфигураций развертывания. Инструмент может быть выбран другой.

По умолчанию

{
  "env": {
    "JAVA_XMS": "XXm",
    "JAVA_XMX": "YYYm"

  }
}



Copy-icon
Указываемые на каждом отдельном стенде

// пример взят с тестового стенда


{

  "env": {
    "DC_MAIL_ORDER_CONFIRMATION_SENDER": "адрес_почты_отправителя_письма",
    "KAFKA_BROKER_ADDRESS": "сокет_для_брокера_kafka",
    "OAUTH_ECOM_CLIENT_ID": "токен_приложения_ECOM_OAuth",
    "OAUTH_ZITADEL_CLIENT_ID": "токен_приложения_Zitadel",
    "OAUTH_ZITADEL_ISSUER_URI": "url_Zitadel",
    "ZITADEL_SERVICE_USER_TOKEN": "токен_пользователя_Zitadel",
    "ZITADEL_SYNC_USER_ENABLED": "включение_синхронизации_пользователей_Zitadel",
    "ZITADEL_URL": "url_доступа_к_Zitadel"
  }
}


Copy-icon
  • Создание заказа - POST запрос, /v2/orders/{cartId}
Request parameters (body sample)

cartId - path-параметр: ID корзины, на основе которой создается заказ

Copy-icon
Response sample

{
    "id": "a6b5a5f7-70c6-4622-b008-2d66187f5eee",
    "customerId": "245615803066508818",
    "orderNum": "2-29122023000048",
    "createTime": "2023-12-29T12:35:28",
    "entries": [
        {
            "articleId": "1000419DC",
            "productId": "1000418DC",
            "articleName": "Кроссы",
            "asset": {
                "id": "ad021c5c-bd5b-431d-9b75-9bdc152b76fe",
                "media": {
                    "url": "master/catalog/images/1697179587383-1882559365.jpg",
                    "absoluteUrl": "https://test-ecom-media.digitalchief.tech/master/catalog/images/1697179587383-1882559365.jpg",
                    "name": "Кроссовки.jpg",
                    "type": "PHOTO",
                    "size": 120828,
                    "resolution": "800x600 px",
                    "createdDate": "2023-10-13T09:47:27.488"
                },
                "title": "Кроссовки1",
                "altAttr": "Обувь",
                "description": "",
                "sign": "",
                "tags": [
                    ""
                ]
            },
            "availability": {
                "id": "41e99a26-9a8b-4f60-b4a6-cefd359d0501",
                "articleId": "1000419DC",
                "quantity": 20.00,
                "replenishmentTime": 0
            },
            "quantity": 1.00,
            "unitPrice": 300.00,
            "discountUnitPrice": 6.00,
            "price": 300.00,
            "discountPrice": 6.00,
            "discountSum": 294.00
        }
    ],
    "shippingAddress": {
        "id": null,
        "company": null,
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "shippingRecipient": {
        "firstName": null,
        "lastName": null,
        "phone": null
    },
    "billingAddress": {
        "id": "642",
        "firstName": "Test",
        "lastName": "Zitadel",
        "company": "777",
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "charges": null,
    "totalPrice": 300.00,
    "discountPrice": 6.00,
    "discountSum": 294.00,
    "currencyId": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
    "cartId": "1-29122023000016",
    "orderStatus": "PENDING",
    "user": {
        "id": "245615803066508818",
        "firstName": "Test",
        "lastName": "Zitadel",
        "phone": null,
        "email": "test.zit.001@test.com",
        "registrationTime": null,
        "registrationCompleted": false,
        "addressDto": {
            "id": "642",
            "firstName": "Test",
            "lastName": "Zitadel",
            "company": "777",
            "address": null,
            "city": null,
            "zipCode": null,
            "poBox": null,
            "country": null
        }
    }
}

Copy-icon
Response header

// для дальнейшего редактирования заказа необходимо из заголовка ответа взять значение:


etag: "1478353428"
Copy-icon
Response codes
  • 201 - заказ успешно создан
  • 404 - не найдена указанная в запросе корзина, или пользователь, создавший корзину, уже не существует
  • Получение заказа - GET запрос, /v1/orders/{id}

Request parameters

id - path-параметр: ID заказа, по которому необходимо получить информацию

Copy-icon
Response sample

{
    "id": "a6b5a5f7-70c6-4622-b008-2d66187f5eee",
    "customerId": "245615803066508818",
    "orderNum": "2-29122023000048",
    "createTime": "2023-12-29T12:35:28",
    "entries": [
        {
            "articleId": "1000419DC",
            "productId": "1000418DC",
            "articleName": "Кроссы",
            "asset": {
                "id": "ad021c5c-bd5b-431d-9b75-9bdc152b76fe",
                "media": {
                    "url": "master/catalog/images/1697179587383-1882559365.jpg",
                    "absoluteUrl": "https://test-ecom-media.digitalchief.tech/master/catalog/images/1697179587383-1882559365.jpg",
                    "name": "Кроссовки.jpg",
                    "type": "PHOTO",
                    "size": 120828,
                    "resolution": "800x600 px",
                    "createdDate": "2023-10-13T09:47:27.488"
                },
                "title": "Кроссовки1",
                "altAttr": "Обувь",
                "description": "",
                "sign": "",
                "tags": [
                    ""
                ]
            },
            "availability": {
                "id": "41e99a26-9a8b-4f60-b4a6-cefd359d0501",
                "articleId": "1000419DC",
                "quantity": 20.00,
                "replenishmentTime": 0
            },
            "quantity": 1.00,
            "unitPrice": 300.00,
            "discountUnitPrice": 6.00,
            "price": 300.00,
            "discountPrice": 6.00,
            "discountSum": 294.00
        }
    ],
    "shippingAddress": {
        "id": null,
        "company": null,
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "shippingRecipient": {
        "firstName": null,
        "lastName": null,
        "phone": null
    },
    "billingAddress": {
        "id": "642",
        "firstName": "Test",
        "lastName": "Zitadel",
        "company": "777",
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "charges": null,
    "totalPrice": 300.00,
    "discountPrice": 6.00,
    "discountSum": 294.00,
    "currencyId": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
    "cartId": "1-29122023000016",
    "orderStatus": "PENDING",
    "user": {
        "id": "245615803066508818",
        "firstName": "Test",
        "lastName": "Zitadel",
        "phone": null,
        "email": "test.zit.001@test.com",
        "registrationTime": null,
        "registrationCompleted": false,
        "addressDto": {
            "id": "642",
            "firstName": "Test",
            "lastName": "Zitadel",
            "company": "777",
            "address": null,
            "city": null,
            "zipCode": null,
            "poBox": null,
            "country": null
        }
    }
}

Copy-icon
Response codes
  • 200 - заказ найден
  • 304 - заказ с указанным хешем не изменился (если указать хэш в заголовке запроса)
  • 404 - заказ не найден
  • Обновление заказа - PATCH запрос, /v2/orders/{orderId}

Request parameters

orderId - path-параметр: ID заказа, который необходимо обновить

Copy-icon
Request body sample

{
   "orderDto":{
      "id":"a6b5a5f7-70c6-4622-b008-2d66187f5eee",
      "customerId":"245615803066508818",
      "orderNum":"2-29122023000048",
      "createTime":"2023-12-29T12:35:28",
      "entries":[
         {
            "articleId":"1000419DC",
            "productId":"1000418DC",
            "articleName":"Кроссы",
            "asset":{
               "id":"ad021c5c-bd5b-431d-9b75-9bdc152b76fe",
               "media":{
                  "url":"master/catalog/images/1697179587383-1882559365.jpg",
                  "absoluteUrl":"https://test-ecom-media.digitalchief.tech/master/catalog/images/1697179587383-1882559365.jpg",
                  "name":"Кроссовки.jpg",
                  "type":"PHOTO",
                  "size":120828,
                  "resolution":"800x600 px",
                  "createdDate":"2023-10-13T09:47:27.488"
               },
               "title":"Кроссовки1",
               "altAttr":"Обувь",
               "description":"",
               "sign":"",
               "tags":[
                  ""
               ]
            },
            "availability":{
               "id":"41e99a26-9a8b-4f60-b4a6-cefd359d0501",
               "articleId":"1000419DC",
               "quantity":20,
               "replenishmentTime":0,
               "locationCode":"Строительный двор - Павловопосадский склад"
            },
            "quantity":1,
            "unitPrice":300,
            "discountUnitPrice":6,
            "price":300,
            "discountPrice":6,
            "discountSum":294
         }
      ],
      "shippingAddress":{
         "id":null,
         "company":null,
         "address":null,
         "city":null,
         "zipCode":null,
         "poBox":null,
         "country":null
      },
      "shippingRecipient":{
         "firstName":null,
         "lastName":null,
         "phone":null
      },
      "billingAddress":{
         "id":"642",
         "firstName":"Test",
         "lastName":"Zitadel",
         "company":"7777",
         "address":null,
         "city":null,
         "zipCode":null,
         "poBox":null,
         "country":null
      },
      "charges":null,
      "totalPrice":300,
      "discountPrice":6,
      "discountSum":294,
      "currencyId":"02d3eb94-8d0c-4e21-a952-db8684a1534d",
      "cartId":"1-29122023000016",
      "orderStatus":"PENDING",
      "user":{
         "id":"245615803066508818",
         "firstName":"Test",
         "lastName":"Zitadel",
         "phone":null,
         "email":"test.zit.001@test.com",
         "registrationTime":null,
         "registrationCompleted":false,
         "addressDto":{
            "id":"642",
            "firstName":"Test",
            "lastName":"Zitadel",
            "company":"7777",
            "address":null,
            "city":null,
            "zipCode":null,
            "poBox":null,
            "country":null
         }
      }
   },
   "cartToDelete":false
}

Copy-icon
Response sample

{
    "id": "a6b5a5f7-70c6-4622-b008-2d66187f5eee",
    "customerId": "245615803066508818",
    "orderNum": "2-29122023000048",
    "createTime": "2023-12-29T12:35:28",
    "entries": [
        {
            "articleId": "1000419DC",
            "productId": "1000418DC",
            "articleName": "Кроссы",
            "asset": {
                "id": "ad021c5c-bd5b-431d-9b75-9bdc152b76fe",
                "media": {
                    "url": "master/catalog/images/1697179587383-1882559365.jpg",
                    "absoluteUrl": "https://test-ecom-media.digitalchief.tech/master/catalog/images/1697179587383-1882559365.jpg",
                    "name": "Кроссовки.jpg",
                    "type": "PHOTO",
                    "size": 120828,
                    "resolution": "800x600 px",
                    "createdDate": "2023-10-13T09:47:27.488"
                },
                "title": "Кроссовки1",
                "altAttr": "Обувь",
                "description": "",
                "sign": "",
                "tags": [
                    ""
                ]
            },
            "availability": {
                "id": "41e99a26-9a8b-4f60-b4a6-cefd359d0501",
                "articleId": "1000419DC",
                "quantity": 20,
                "replenishmentTime": 0,
                "locationCode": "Строительный двор - Павловопосадский склад"
            },
            "quantity": 1,
            "unitPrice": 300,
            "discountUnitPrice": 6,
            "price": 300,
            "discountPrice": 6.00,
            "discountSum": 294.00
        }
    ],
    "shippingAddress": {
        "id": null,
        "company": null,
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "shippingRecipient": {
        "firstName": null,
        "lastName": null,
        "phone": null
    },
    "billingAddress": {
        "id": "642",
        "firstName": "Test",
        "lastName": "Zitadel",
        "company": "7777",
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "charges": null,
    "totalPrice": 300,
    "discountPrice": 6.00,
    "discountSum": 294.00,
    "currencyId": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
    "cartId": "1-29122023000016",
    "orderStatus": "PENDING",
    "user": {
        "id": "245615803066508818",
        "firstName": "Test",
        "lastName": "Zitadel",
        "phone": null,
        "email": "test.zit.001@test.com",
        "registrationTime": null,
        "registrationCompleted": false,
        "addressDto": {
            "id": "642",
            "firstName": "Test",
            "lastName": "Zitadel",
            "company": "7777",
            "address": null,
            "city": null,
            "zipCode": null,
            "poBox": null,
            "country": null
        }
    }
}

Copy-icon
Response codes
  • 200 - заказ обновлен
  • 400 - заказ не обновлен, общая ошибка
  • 404 - заказ не найден
  • 412 - заказ не обновлен, указанный хеш не соответствует текущему заказу
  • 428 - заказ не обновлен, не указан текущий хеш заказа
  • Получение списка заказов пользователя - GET запрос, /v1/orders/

Request parameters

customerId - query-параметр: ID пользователя, чьи заказы необходимо получить
page, size - query-параметр: номер и размер страницы заказов
statusFilter - query-параметр, необязательный: статус заказов

Copy-icon
Response sample

{
   "content":[
      // Список заказов
   ],
   "number":0,
   "size":5,
   "totalElements":5,
   "pageable":"INSTANCE",
   "last":true,
   "totalPages":1,
   "sort":{
      "unsorted":true,
      "sorted":false,
      "empty":true
   },
   "first":true,
   "numberOfElements":5,
   "empty":false
}

Copy-icon
Response codes

200 - получен список заказов пользователя

Статистика Copy-icon

  • Сбор статистики количества заказов пользователей - GET запрос, /v1/orders/statistics/aggregate-by-customers
Request parameters

customerIds - query-параметр: список ID пользователей, по которым нужно собрать статистику
statusFilter - query-параметр, необязательный: статус заказа, по которому фильтруется выборка

Copy-icon
Response sample

{
    "customerStatistics": [
        {
            "customerId": "245615803066508818",
            "ordersCount": 6
        },
        {
            "customerId": "238828852141385234",
            "ordersCount": 2
        }
    ]
}

Copy-icon
Response codes
  • 200 - запрос успешно выполнен
  • 403 - нет прав на получение данных
Response codes
  • 200 - операция выполнена успешно, рынок отредактирован
  • 400 - ошибка, не удалось отредактировать рынок

Отчет

  • Получение отчета по заказам - GET запрос, /v1/orders/report/download
Request parameters

statusFilter - query-параметр, необязательный: статус заказа, по которому фильтруется выборка

Copy-icon
Response sample

В ответе приходит Xlsx-файл с отчетом.

Response codes
  • 200 - запрос успешно выполнен
  • 403 -  нет прав на получение данных

Аккаунт Copy-icon

  • Получение заказов пользователя администратором - GET запрос, /v1/account/orders/page
Request parameters

searchTerm - query-параметр: поисковый запрос

customerId - query-параметр: ID пользователя, чьи заказы необходимо получить

orderNum - query-параметр: номер заказа, который нужно найти

createTimeFrom - query-параметр: дата создания заказа (для фильтра "Дата создания")

createTimeTo - query-параметр: дата создания заказа (для фильтра "Дата создания")

orderStatuses - query-параметр: статусы заказов для отображения

userFirstName - query-параметр: имя покупателя

userLastName - query-параметр: фамилия покупателя

discountPriceFirstValue - query-параметр: первый числовой параметр фильтра "Скидка"

discountPriceFirstOperator - query-параметр: первый числовой оператор фильтра "Скидка" (например, "меньше")
discountPriceFilterConnectiveType - query-параметр: тип соединения числовых параметров фильтра "Скидка" (например, "AND" или "OR")
discountPriceSecondValue - query-параметр: второй числовой параметр фильтра "Скидка"
discountPriceSecondOperator - query-параметр: второй числовой оператор фильтра "Скидка" (например, "больше")

orderStatusesToExclude - query-параметр: статусы заказов, которые не нужно отображать на странице
page, size - query-параметр: номер и размер страницы заказов

sort - query-параметр: сортировка элементов на странице

Copy-icon
Response sample

{
    "content": [
        {
            "id": "1fb1833f-3ed1-4932-b15c-86b409a482da",
            "orderNum": "2-14102024000005",
            "createTime": "2024-10-14T15:48:53",
            "entries": [
                {
                    "articleId": "1021613DC",
                    "productId": "1021611DC",
                    "articleName": "Товар",
                    "asset": {
                        "id": "15bee320-d89b-45c8-9a6b-298e9997bb97",
                        "media": {
                            "url": "master/catalog/images/1718096990855-1882559365.jpeg",
                            "absoluteUrl": "https://test-ecom-media.digitalchief.tech/master/catalog/images/1718096990855-1882559365.jpeg",
                            "name": "iphone15promax512.jpeg",
                            "type": "PHOTO",
                            "size": 91047,
                            "resolution": "400x396 px",
                            "createdDate": "2024-06-11T12:09:53.123"
                        },
                        "title": "Updated media asset title PERF AUTO mediaAssetsPatchAssets35267",
                        "altAttr": "Alt text for image PERF AUTO mediaAssetsPatchAssets34451",
                        "description": "Updated media asset description PERF AUTO mediaAssetsPatchAssets20732",
                        "sign": "Updated media asset sign",
                        "tags": [
                            "string"
                        ]
                    },
                    "availability": {
                        "id": "bd296dce-daa8-4333-81d6-7aa93d474b66",
                        "articleId": "1021613DC",
                        "quantity": 200,
                        "replenishmentTime": 0,
                        "locationId": "175e0b42-3f52-4bff-b785-d6ee56e6a182",
                        "locationCode": "1463456",
                        "locationName": "Главн"
                    },
                    "quantity": 1,
                    "unitPrice": 98000,
                    "discountUnitPrice": 98000,
                    "price": 98000,
                    "discountPrice": 98000,
                    "discountSum": 0
                }
            ],
            "shippingAddress": {
                "firstName": "Мария",
                "lastName": "Иванова",
                "phone": "+375298088880",
                "company": "ООО \"Компани\"",
                "address": "Арбат",
                "city": "Москва",
                "zipCode": "2000001",
                "houseNumber": "3",
                "country": "Россия"
            },
            "customer": {
                "firstName": "Анна",
                "lastName": "Мартова",
                "phone": "+7(345)67876545",
                "email": "mart@pochta.ru",
                "gender": null
            },
            "orderStatus": "CONFIRMED",
            "charges": [
                {
                    "type": "shipping",
                    "amount": 0
                }
            ],
            "cartPrice": 98000,
            "totalPrice": 98000,
            "discountPrice": 98000,
            "discountSum": 0,
            "currency": {
                "id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
                "isoCode": "EUR",
                "name": "Euro",
                "symbol": "€"
            },
            "cartId": "1-14102024000007",
            "shippingInfo": {
                "deliveryDate": "14.10.2024 15:48",
                "deliveryPrice": 0
            }
        }
    ],
    "number": 0,
    "size": 1,
    "totalElements": 1,
    "pageable": "INSTANCE",
    "last": true,
    "totalPages": 1,
    "sort": {
        "unsorted": true,
        "sorted": false,
        "empty": true
    },
    "first": true,
    "numberOfElements": 1,
    "empty": false
}

Copy-icon
Response codes
  • 200 - запрос успешно выполнен
  • 403 - нет прав на получение данных
  • Получение заказа по ID администратором - GET запрос, /v1/account/orders/{id}
Request parameters

id - path-параметр: ID заказа, по которому необходимо получить информацию

Copy-icon
Response sample

{
    "id": "b56b3467-e605-45a4-8fb5-61a22e1af85b",
    "orderNum": "2-21042023000021",
    "createTime": "2023-04-21T16:49:53",
    "entries": [
        {
            "articleId": "1000009",
            "productId": null,
            "articleName": "Фонарик походный",
            "asset": null,
            "availability": {
                "id": "ca747831-3847-4062-ab00-e66e41131d9b",
                "articleId": "1000009",
                "quantity": 203,
                "replenishmentTime": 14,
                "locationCode": null
            },
            "quantity": 1,
            "unitPrice": 8,
            "discountUnitPrice": null,
            "price": 8,
            "discountPrice": null,
            "discountSum": null
        },
        {
            "articleId": "1000001",
            "productId": null,
            "articleName": "Смарт-часы",
            "asset": null,
            "availability": {
                "id": "a6475175-1240-4176-b220-917bc369f864",
                "articleId": "1000001",
                "quantity": 2000,
                "replenishmentTime": 14,
                "locationCode": null
            },
            "quantity": 1,
            "unitPrice": 50,
            "discountUnitPrice": null,
            "price": 50,
            "discountPrice": null,
            "discountSum": null
        }
    ],
    "shippingAddress": {
        "id": "60b94e61-892a-4b72-b3c1-28fb96253f88",
        "company": null,
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "shippingRecipient": {
        "firstName": null,
        "lastName": null,
        "phone": null
    },
    "orderStatus": "CONFIRMED",
    "totalPrice": 58,
    "discountPrice": null,
    "discountSum": null,
    "currency": {
        "id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
        "isoCode": "EUR",
        "name": "Euro",
        "symbol": "€"
    },
    "cartId": "1-21042023000062"
}

Copy-icon
Response codes
  • 200 - запрос успешно выполнен
  • 403 - нет прав на получение данных
  • 404 - заказ не найден
  • Получение количества заказов пользователя администратором - GET запрос, /v1/account/orders/total
Request parameters

customerId - query-параметр: ID пользователя, чьи заказы необходимо получить

Copy-icon
Response sample

{
    "orderTotal": 692
}

Copy-icon
Response codes
  • 200 - запрос успешно выполнен
  • 403 - нет прав на получение данных