Микросервис checkout-orchestration
Микросервис checkout-orchestration предоставляет функциональность для управления заказами (оформление и сбор статистики).
Доступ к сервису предоставляется по запросу.
Логика работы
В работе микросервиса используются следующие сущности:
- Заказ (Order) - содержит данные конкретного заказа (id заказа, id покупателя, номер заказа, дата формирования заказа, товары в заказе, адрес доставки, данные получателя, итоговая сумма заказа, скидки, статус заказа и др.)
- Статистика заказов пользователей (AggregatedCustomerStatistics) - содержит статистику количества заказов пользователей
- Количество заказов пользователя (AccountOrderTotal) - содержит данные об итоговом количестве заказов конкретного пользователя
Аутентификация
При обращении к микросервису через API необходимо указать следующие параметры в заголовке:
Authorization
- для указания токена:Authorization: Bearer <токен>
If-Match
- для указания значения захешированного заказа при редактировании:If-Match: <хэш заказа>
If-None-Match
- для указания значения захешированного заказа при получении:If-None-Match: <хэш заказа>
Service context path
/api/checkout-orchestration/
Настройки и параметры конфигурации
Параметры конфигурации указываются в Vault.
Vault используется на нашей платформе в качестве хранилища всех конфигураций развертывания. Инструмент может быть выбран другой.
{
"env": {
"JAVA_XMS": "XXm",
"JAVA_XMX": "YYYm"
}
}
// пример взят с тестового стенда
{
"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"
}
}
Методы микросервиса
Заказы
- Создание заказа - POST запрос, /v2/orders/{cartId}
cartId - path-параметр: ID корзины, на основе которой создается заказ
{
"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
}
}
}
// для дальнейшего редактирования заказа необходимо из заголовка ответа взять значение:
etag: "1478353428"
- 201 - заказ успешно создан
- 404 - не найдена указанная в запросе корзина, или пользователь, создавший корзину, уже не существует
-
Получение заказа - GET запрос, /v1/orders/{id}
id - path-параметр: ID заказа, по которому необходимо получить информацию
{
"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
}
}
}
- 200 - заказ найден
- 304 - заказ с указанным хешем не изменился (если указать хэш в заголовке запроса)
- 404 - заказ не найден
-
Обновление заказа - PATCH запрос, /v2/orders/{orderId}
orderId - path-параметр: ID заказа, который необходимо обновить
{
"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
}
{
"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
}
}
}
- 200 - заказ обновлен
- 400 - заказ не обновлен, общая ошибка
- 404 - заказ не найден
- 412 - заказ не обновлен, указанный хеш не соответствует текущему заказу
- 428 - заказ не обновлен, не указан текущий хеш заказа
-
Получение списка заказов пользователя - GET запрос, /v1/orders/
customerId - query-параметр: ID пользователя, чьи заказы необходимо
получить
page, size - query-параметр: номер и размер страницы
заказов
statusFilter - query-параметр, необязательный: статус
заказов
{
"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
}
200 - получен список заказов пользователя
Статистика
- Сбор статистики количества заказов пользователей - GET запрос, /v1/orders/statistics/aggregate-by-customers
customerIds - query-параметр: список ID пользователей, по которым
нужно собрать статистику
statusFilter - query-параметр,
необязательный: статус заказа, по которому фильтруется выборка
{
"customerStatistics": [
{
"customerId":
"245615803066508818",
"ordersCount": 6
},
{
"customerId": "238828852141385234",
"ordersCount": 2
}
]
}
- 200 - запрос успешно выполнен
- 403 - нет прав на получение данных
- 200 - операция выполнена успешно, рынок отредактирован
- 400 - ошибка, не удалось отредактировать рынок
Отчет
- Получение отчета по заказам - GET запрос, /v1/orders/report/download
statusFilter - query-параметр, необязательный: статус заказа, по которому фильтруется выборка
В ответе приходит Xlsx-файл с отчетом.
- 200 - запрос успешно выполнен
- 403 - нет прав на получение данных
Аккаунт
- Получение заказов пользователя администратором - GET запрос, /v1/account/orders/page
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-параметр: сортировка элементов на странице
{
"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
}
- 200 - запрос успешно выполнен
- 403 - нет прав на получение данных
- Получение заказа по ID администратором - GET запрос, /v1/account/orders/{id}
id - path-параметр: ID заказа, по которому необходимо получить информацию
{
"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"
}
- 200 - запрос успешно выполнен
- 403 - нет прав на получение данных
- 404 - заказ не найден
- Получение количества заказов пользователя администратором - GET запрос, /v1/account/orders/total
customerId - query-параметр: ID пользователя, чьи заказы необходимо получить
{
"orderTotal": 692
}
- 200 - запрос успешно выполнен
- 403 - нет прав на получение данных