Skip to content

Commit 7bb96af

Browse files
authored
Merge pull request #17 from rees46/feat/checkout-processing
feat: checkout processing
2 parents f3dc2ac + 5772f66 commit 7bb96af

10 files changed

Lines changed: 1009 additions & 8 deletions

File tree

docs/.vitepress/config.mts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,27 +110,34 @@ export default defineConfig({
110110
collapsed: true,
111111
items: [
112112
{ text: 'Введение', link: '/integration/loyalty/checkout/index.md' },
113+
{ text: 'Предварительная оценка', link: '/integration/loyalty/checkout/estimate.md' },
114+
{ text: 'Создание заказа', link: '/integration/loyalty/checkout/apply.md' },
115+
{ text: 'Подтверждение заказа', link: '/integration/loyalty/checkout/confirm.md' },
116+
{ text: 'Отмена заказа', link: '/integration/loyalty/checkout/cancel.md' },
117+
{ text: 'Частичный возврат', link: '/integration/loyalty/checkout/change.md' },
118+
{ text: 'Информация о заказе', link: '/integration/loyalty/checkout/details.md' },
119+
{ text: 'История заказов', link: '/integration/loyalty/checkout/history.md' },
113120
]
114121
},
115122
{
116-
text: 'Бонусы',
123+
text: 'Акции',
117124
collapsed: true,
118125
items: [
119-
{ text: 'Введение', link: '/integration/loyalty/bonuses/index.md' },
126+
{ text: 'Введение', link: '/integration/loyalty/promotions/index.md' },
120127
]
121128
},
122129
{
123-
text: 'Сертификаты',
130+
text: 'Бонусы',
124131
collapsed: true,
125132
items: [
126-
{ text: 'Введение', link: '/integration/loyalty/certificates/index.md' },
133+
{ text: 'Введение', link: '/integration/loyalty/bonuses/index.md' },
127134
]
128135
},
129136
{
130-
text: 'Акции',
137+
text: 'Сертификаты',
131138
collapsed: true,
132139
items: [
133-
{ text: 'Введение', link: '/integration/loyalty/promotions/index.md' },
140+
{ text: 'Введение', link: '/integration/loyalty/certificates/index.md' },
134141
]
135142
},
136143
{
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
# Создание заказа и блокировка средств
2+
3+
Когда на стороне продавца заказ создан и готов к оплате, необходимо создать заказ на нашей стороне, заблокировать бонусы, сертификаты и промокоды во избежание фрода.
4+
5+
Метод получает тот же набор параметров, что и в [`checkout/estimate`](./estimate.md), а также обязательно идентификатор текущего заказа.
6+
7+
::: info Важно
8+
Номер заказа `order_id` должен быть уникальным. Если ранее вы подтверждали или отменяли заказ с таким же `order_id`, запрос выполнится с ошибкой.
9+
10+
При этом, если заказ все еще в начальном статусе и покупатель перед оплатой решил еще раз изменить состав заказа, вы можете безопасно делать повторные запросы `checkout/apply` с тем же номером заказа.
11+
:::
12+
13+
::: warning Особо важно
14+
Если клиент еще не перешел к оплате, а просто меняет содержимое корзины, не используйте данный метод для расчета скидок, т.к. блокировка и разблокировка бонусов и сертификатов будет создавать лишние транзакции в логах системы, что в последующем усложнит идентификацию фрода.
15+
:::
16+
17+
```
18+
POST https://api.rees46.ru/loyalty/checkout/apply
19+
```
20+
21+
22+
## Параметры
23+
24+
Те же самые параметры, что и в [`checkout/estimate`](./estimate.md), с той разницей, что `order_id` является обязательным.
25+
26+
## Запрос
27+
28+
Пример запроса:
29+
30+
```shell
31+
curl --header "Content-Type: application/json" \
32+
--request POST \
33+
--data-binary "@payload.json" \
34+
https://api.rees46.ru/loyalty/checkout/apply
35+
```
36+
37+
Пример JSON-тела:
38+
39+
```json payload.json
40+
{
41+
"shop_id": "...",
42+
"shop_secret": "...",
43+
"order_id": "...",
44+
"identifier": "...",
45+
"payment_type": "...",
46+
"promo_codes": ["...", "..."],
47+
"certificates": ["...", "..."],
48+
"charge_bonuses": true,
49+
"bonuses_amount": 500,
50+
"stream": "pos",
51+
"current_time": "17:31",
52+
"cart_items": [
53+
{"product_id": "...", "price": 1000, "quantity": 4},
54+
{"product_id": "...", "price": 2000, "quantity": 1, "discountable": false, "bonusable": false, "rewardable": false }
55+
]
56+
}
57+
```
58+
59+
## Ответ
60+
61+
Пример ответа сервера:
62+
63+
```json
64+
{
65+
"success": true,
66+
"payload": {
67+
"order_id": "...",
68+
"identifier": "...",
69+
"payment_type": "...",
70+
"products_total": 5,
71+
"order_total": 6000,
72+
"saved_total": 1100,
73+
"saved_by_discounts": 400,
74+
"saved_by_bonuses": 600,
75+
"saved_by_offers": 0,
76+
"saved_by_certificates": 100,
77+
"order_to_pay": 4900,
78+
"order_bonuses_to_charge": 500,
79+
"bonuses_balance": 1000,
80+
"bonuses_reward": 500,
81+
"bonuses_referrer_reward": 0,
82+
"referrer_identifier": "...",
83+
"referral_program": 21,
84+
"applied_promotions": [],
85+
"rewarded_stickers": {},
86+
"used_stickers": {},
87+
"stickers_balance": {},
88+
"promo_codes": [],
89+
"promo_codes_failed": [],
90+
"certificates": [],
91+
"certificates_failed": [],
92+
"items": [
93+
{
94+
"uniqid": "...",
95+
"quantity": 4,
96+
"price": 1000,
97+
"total": 4000,
98+
"discountable": true,
99+
"bonusable": true,
100+
"rewardable": true,
101+
"paid_with_offers": 0,
102+
"paid_with_offers_per_product": 0,
103+
"paid_with_referral_discounts": 0,
104+
"paid_with_referral_discounts_per_product": 0,
105+
"paid_with_discounts": 500,
106+
"paid_with_discounts_per_product": 100,
107+
"paid_with_bonuses": 500,
108+
"paid_with_bonuses_per_product": 100,
109+
"paid_with_certificates": 100,
110+
"paid_with_certificates_per_product": 25,
111+
"bonuses_reward": 400,
112+
"bonuses_reward_per_product": 100,
113+
"bonuses_reward_loyalty_program": {
114+
"total": 40,
115+
"per_product": 10
116+
},
117+
"bonuses_reward_referral_program": {
118+
"total": 80,
119+
"per_product": 20
120+
},
121+
"bonuses_reward_promotions": {
122+
"33": { "total": 100, "per_product": 25 },
123+
"17": { "total": 180, "per_product": 45 }
124+
},
125+
"certificates": {
126+
"14": { "id": 14, "code": "...", "pool_id": 11, "amount": 100, "amount_per_product": 25 },
127+
"32": { "id": 31, "code": "...", "pool_id": 19, "amount": 160, "amount_per_product": 40 }
128+
},
129+
"bonuses_used": 500,
130+
"bonuses_used_per_product": 125,
131+
"total_after_discounts": 3500,
132+
"total_after_discounts_per_product": 875
133+
},
134+
...
135+
]
136+
}
137+
}
138+
```
139+
140+
Расшифровка ответа: то же самое, что и в [`checkout/estimate`](./estimate.md).
141+
142+
В случае ошибки данных вернет подобную структуру:
143+
144+
```json
145+
{
146+
"success": false,
147+
"payload": {
148+
"message": "Cart contains line items with the same product ID",
149+
"identifier": "..."
150+
}
151+
}
152+
```
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Отмена заказа
2+
3+
Отмена заказа возможна в двух случаях:
4+
5+
1. Заказ подтвержден через `checkout/confirm`
6+
2. Заказ оформлен через `checkout/apply`
7+
8+
Отмена выполняет следующие операции:
9+
10+
1. Возмещает потраченные бонусы, стикеры, купоны, промокоды и сертификаты.
11+
2. Отменяет вознаграждения покупателя и реферера.
12+
3. Отменяет выданные купоны.
13+
14+
::: info Важно
15+
Не отменяйте заказ на этапе `checkout/apply`, если клиент, вероятно, решит его оплатить. Статус "отменен" финальный и повторно отправить `apply` с тем же номером заказа не получится. Если клиент просто меняет содержимое корзины, используйте повторный `checkout/apply` с тем же номером заказа.
16+
17+
Но не путайте с `checkout/estimate`: если клиент меняет корзину, но не переходит к оплате, используйте `checkout/estimate`. Метод `checkout/apply` применяйте только тогда, когда клиент зафиксировал корзину и перешел к оплате.
18+
:::
19+
20+
```
21+
POST https://api.rees46.ru/loyalty/checkout/cancel
22+
```
23+
24+
## Параметры
25+
26+
| Параметр | Обязателен? | Описание |
27+
|-------------|-------------|--------------------|
28+
| shop_id | Да | API-ключ |
29+
| shop_secret | Да | Секретный ключ API |
30+
| order_id | Да | Номер заказа |
31+
32+
## Запрос
33+
34+
Пример запроса:
35+
36+
```shell
37+
curl --header "Content-Type: application/json" \
38+
--request POST \
39+
--data-binary "@payload.json" \
40+
https://api.rees46.ru/loyalty/checkout/cancel
41+
```
42+
43+
Пример JSON-тела:
44+
45+
```json payload.json
46+
{
47+
"shop_id": "...",
48+
"shop_secret": "...",
49+
"order_id": "..."
50+
}
51+
```
52+
53+
## Ответ
54+
55+
Пример ответа сервера:
56+
57+
```json
58+
{
59+
"success": true,
60+
"payload": {
61+
"order_id": "...",
62+
"identifier": "..."
63+
}
64+
}
65+
```
66+
67+
Расшифровка ответа:
68+
69+
| Параметр | Описание |
70+
|--------------------|----------------------------------------------------------------------|
71+
| success | Запрос выполнен успешно или нет |
72+
| payload.message | Сообщение с результатом обработки запроса |
73+
| payload.order_id | Идентификатор заказа |
74+
| payload.identifier | Идентификатор участника программы лояльности в формате `7XXXXXXXXXX` |
75+
76+
В случае ошибки данных вернет подобную структуру:
77+
78+
```json
79+
{
80+
"success": false,
81+
"payload": {
82+
"message": "Could not cancel order in its current status"
83+
}
84+
}
85+
```

0 commit comments

Comments
 (0)