694 lines
21 KiB
Markdown
694 lines
21 KiB
Markdown
# 📖 API құжаттамасы
|
||
|
||
Kaspi POS Automation Kaspi Pay төлемдерімен жұмыс істеу үшін REST API ұсынады: SMS арқылы авторизация, шот-фактуралар жасау, QR-төлем, операциялар тарихы және қайтарулар.
|
||
|
||
**Base URL:** `http://localhost:3000`
|
||
|
||
---
|
||
|
||
## Мазмұны
|
||
|
||
- [Аутентификация](#аутентификация)
|
||
- [Сессия тақырыптары](#сессия-тақырыптары)
|
||
- [Health Check](#health-check)
|
||
- [Auth — Авторизация](#auth--авторизация)
|
||
- [POST /api/auth/init](#post-apiauthinit)
|
||
- [POST /api/auth/send-phone](#post-apiauthsend-phone)
|
||
- [POST /api/auth/verify-otp](#post-apiauthverify-otp)
|
||
- [POST /api/auth/session](#post-apiauthsession)
|
||
- [POST /api/auth/logout](#post-apiauthlogout)
|
||
- [Invoice — Шот-фактуралар](#invoice--шот-фактуралар)
|
||
- [GET /api/invoice/client-info](#get-apiinvoiceclient-info)
|
||
- [POST /api/invoice/create](#post-apiinvoicecreate)
|
||
- [GET /api/invoice/details](#get-apiinvoicedetails)
|
||
- [POST /api/invoice/cancel](#post-apiinvoicecancel)
|
||
- [POST /api/invoice/history](#post-apiinvoicehistory)
|
||
- [QR — QR-төлем](#qr--qr-төлем)
|
||
- [POST /api/qr/create](#post-apiqrcreate)
|
||
- [GET /api/qr/status](#get-apiqrstatus)
|
||
- [History — Операциялар тарихы](#history--операциялар-тарихы)
|
||
- [POST /api/history/operations](#post-apihistoryoperations)
|
||
- [POST /api/history/details](#post-apihistorydetails)
|
||
- [Refund — Қайтарулар](#refund--қайтарулар)
|
||
- [POST /api/refund/create](#post-apirefundcreate)
|
||
- [Session — Сессияны тексеру](#session--сессияны-тексеру)
|
||
- [GET /api/session/check](#get-apisessioncheck)
|
||
- [Webhooks — Хабарламалар](#webhooks--хабарламалар)
|
||
- [Баптау](#баптау)
|
||
- [Оқиғалар](#оқиғалар)
|
||
- [Payload форматы](#payload-форматы)
|
||
- [Қолтаңба (HMAC)](#қолтаңба-hmac)
|
||
- [Қайта жіберу (Retry)](#қайта-жіберу-retry)
|
||
|
||
---
|
||
|
||
## Аутентификация
|
||
|
||
API 3 қадамды SMS-авторизацияны пайдаланады. Сәтті авторизациядан кейін клиент `tokenSN` және `vtokenSecret` алады, олар барлық қорғалған эндпоинттер үшін тақырыптарда жіберіледі.
|
||
|
||
### Сессия тақырыптары
|
||
|
||
`/api/auth/*` және `/health` басқа барлық эндпоинттер келесі тақырыптарды талап етеді:
|
||
|
||
| Тақырып | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `X-Token-SN` | `string` | ✅ | Авторизация кезінде алынған сессия токені |
|
||
| `X-Vtoken-Secret` | `string` | ✅ | Шифрланған сессия құпиясы |
|
||
| `X-Profile-Id` | `string` | ❌ | Ұйым профилінің ID-сі |
|
||
|
||
---
|
||
|
||
## Health Check
|
||
|
||
### `GET /health`
|
||
|
||
Сервердің жұмыс қабілеттілігін тексеру.
|
||
|
||
**Жауап:**
|
||
|
||
```json
|
||
{ "status": "ok" }
|
||
```
|
||
|
||
---
|
||
|
||
## Auth — Авторизация
|
||
|
||
Kaspi SMS-коды арқылы үш қадамды авторизация процесі.
|
||
|
||
> ⚠️ **Маңызды:** Кіру үшін Kaspi Pay **кассирінің** аккаунтының телефон нөмірін пайдаланыңыз.
|
||
|
||
### `POST /api/auth/init`
|
||
|
||
Авторизация процесін инициализациялау. Келесі қадамдар үшін `processId` қайтарады.
|
||
|
||
**Сұраныс денесі:** қажет емес
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/auth/init
|
||
```
|
||
|
||
**Сәтті жауап:**
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"processId": "abc123-...",
|
||
"view": "EnterPhoneNumber",
|
||
"body": { ... }
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### `POST /api/auth/send-phone`
|
||
|
||
Телефон нөмірін жіберу — SMS-код жіберуді бастайды.
|
||
|
||
**Сұраныс денесі:**
|
||
|
||
| Өріс | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `phoneNumber` | `string` | ✅ | Телефон нөмірі (формат: `7XXXXXXXXXX`) |
|
||
| `processId` | `string` | ✅ | `/api/auth/init` процесінің ID-сі |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/auth/send-phone \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"phoneNumber": "77001234567", "processId": "abc123-..."}'
|
||
```
|
||
|
||
**Сәтті жауап:**
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"processId": "abc123-...",
|
||
"desc": "Код отправлен на номер +7 700 *** ** 67",
|
||
"view": "EnterOtp",
|
||
"body": { ... }
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### `POST /api/auth/verify-otp`
|
||
|
||
SMS-кодты растау. Сәтті болған жағдайда авторизацияны автоматты түрде аяқтайды және сессия деректерін қайтарады.
|
||
|
||
**Сұраныс денесі:**
|
||
|
||
| Өріс | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `otp` | `string` | ✅ | SMS-код |
|
||
| `processId` | `string` | ✅ | `/api/auth/init` процесінің ID-сі |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/auth/verify-otp \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"otp": "1234", "processId": "abc123-..."}'
|
||
```
|
||
|
||
**Сәтті жауап:**
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"processId": "abc123-...",
|
||
"step": "finished",
|
||
"message": "OTP verified and finish completed",
|
||
"tokenSN": "TOKEN_SN_VALUE",
|
||
"vtokenSecret": "ENCRYPTED_SECRET",
|
||
"profileId": 12345,
|
||
"organizationId": 67890,
|
||
"orgName": "ЖК Иванов",
|
||
"phone": "77001234567",
|
||
"organizations": [ ... ]
|
||
}
|
||
```
|
||
|
||
> ⚠️ `tokenSN` және `vtokenSecret` сақтаңыз — олар барлық кейінгі сұраныстар үшін қажет.
|
||
|
||
---
|
||
|
||
### `POST /api/auth/session`
|
||
|
||
Токеннің бар-жоғын тексеру (клиенттік тексеру).
|
||
|
||
**Сұраныс денесі:**
|
||
|
||
| Өріс | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `tokenSN` | `string` | ❌ | Сессия токені |
|
||
|
||
**Жауап:**
|
||
|
||
```json
|
||
{
|
||
"authenticated": true,
|
||
"tokenSN": "TOKEN_SN_VALUE"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### `POST /api/auth/logout`
|
||
|
||
Сессияны аяқтау.
|
||
|
||
**Сұраныс денесі:** қажет емес
|
||
|
||
**Жауап:**
|
||
|
||
```json
|
||
{ "success": true }
|
||
```
|
||
|
||
---
|
||
|
||
## Invoice — Шот-фактуралар
|
||
|
||
Клиенттің телефон нөмірі бойынша төлем шот-фактураларын жасау.
|
||
|
||
> 🔒 Барлық эндпоинттер [сессия тақырыптарын](#сессия-тақырыптары) талап етеді.
|
||
|
||
### `GET /api/invoice/client-info`
|
||
|
||
Телефон нөмірі бойынша клиент туралы ақпарат алу.
|
||
|
||
**Query-параметрлері:**
|
||
|
||
| Параметр | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `phoneNumber` | `string` | ✅ | Клиенттің телефон нөмірі |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl "http://localhost:3000/api/invoice/client-info?phoneNumber=77001234567" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..." \
|
||
-H "X-Profile-Id: ..."
|
||
```
|
||
|
||
---
|
||
|
||
### `POST /api/invoice/create`
|
||
|
||
Төлем шот-фактурасын жасау.
|
||
|
||
**Сұраныс денесі:**
|
||
|
||
| Өріс | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `phoneNumber` | `string` | ✅ | Клиенттің телефон нөмірі |
|
||
| `amount` | `number` | ✅ | Теңгемен сома |
|
||
| `comment` | `string` | ❌ | Төлемге түсініктеме |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/invoice/create \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..." \
|
||
-H "X-Profile-Id: ..." \
|
||
-d '{"phoneNumber": "77001234567", "amount": 1000, "comment": "Тапсырыс #42 төлемі"}'
|
||
```
|
||
|
||
**Сәтті жауап:**
|
||
|
||
```json
|
||
{
|
||
"StatusCode": 0,
|
||
"Data": {
|
||
"Id": 123456,
|
||
"Status": "RemotePaymentCreated",
|
||
"Amount": 1000,
|
||
"ClientMobile": "77001234567",
|
||
"ReceiptUrl": "https://...",
|
||
"OrderNumber": "..."
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### `GET /api/invoice/details`
|
||
|
||
Шот-фактура мәліметтерін алу.
|
||
|
||
**Query-параметрлері:**
|
||
|
||
| Параметр | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `operationId` | `string` | ✅ | Операция ID-сі |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl "http://localhost:3000/api/invoice/details?operationId=123456" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..."
|
||
```
|
||
|
||
---
|
||
|
||
### `POST /api/invoice/cancel`
|
||
|
||
Жасалған шот-фактураны болдырмау.
|
||
|
||
**Сұраныс денесі:**
|
||
|
||
| Өріс | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `operationId` | `string` | ✅ | Болдырмау үшін операция ID-сі |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/invoice/cancel \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..." \
|
||
-d '{"operationId": "123456"}'
|
||
```
|
||
|
||
---
|
||
|
||
### `POST /api/invoice/history`
|
||
|
||
Жасалған шот-фактуралар тарихын алу (соңғы 20).
|
||
|
||
**Сұраныс денесі:** қажет емес (бос JSON `{}`)
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/invoice/history \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..." \
|
||
-d '{}'
|
||
```
|
||
|
||
---
|
||
|
||
## QR — QR-төлем
|
||
|
||
Kaspi Pay арқылы төлем үшін QR-кодтар генерациялау.
|
||
|
||
> 🔒 Барлық эндпоинттер [сессия тақырыптарын](#сессия-тақырыптары) талап етеді.
|
||
|
||
### `POST /api/qr/create`
|
||
|
||
Төлем үшін QR-токен жасау.
|
||
|
||
**Сұраныс денесі:**
|
||
|
||
| Өріс | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `amount` | `number` | ✅ | Теңгемен сома |
|
||
| `latitude` | `number` | ❌ | Ендік (әдепкі: Алматы) |
|
||
| `longitude` | `number` | ❌ | Бойлық (әдепкі: Алматы) |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/qr/create \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..." \
|
||
-H "X-Profile-Id: ..." \
|
||
-d '{"amount": 500}'
|
||
```
|
||
|
||
**Сәтті жауап:**
|
||
|
||
```json
|
||
{
|
||
"StatusCode": 0,
|
||
"Data": {
|
||
"QrOperationId": 789012,
|
||
"QrToken": "https://pay.kaspi.kz/pay/...",
|
||
"ExpireDate": "2025-01-01T12:05:00",
|
||
"Amount": 500,
|
||
"ReceiptUrl": "https://..."
|
||
}
|
||
}
|
||
```
|
||
|
||
> 💡 `QrToken` төлем сілтемесін қамтиды — оны QR-кодқа түрлендіруге болады.
|
||
|
||
---
|
||
|
||
### `GET /api/qr/status`
|
||
|
||
QR-төлем статусын тексеру.
|
||
|
||
**Query-параметрлері:**
|
||
|
||
| Параметр | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `qrOperationId` | `string` | ✅ | `/api/qr/create` QR-операциясының ID-сі |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl "http://localhost:3000/api/qr/status?qrOperationId=789012" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..."
|
||
```
|
||
|
||
---
|
||
|
||
## History — Операциялар тарихы
|
||
|
||
Барлық операциялар тарихын қарау (QR + шот-фактуралар).
|
||
|
||
> 🔒 Барлық эндпоинттер [сессия тақырыптарын](#сессия-тақырыптары) талап етеді.
|
||
|
||
### `POST /api/history/operations`
|
||
|
||
Кезең бойынша операциялар тізімін алу.
|
||
|
||
**Сұраныс денесі:**
|
||
|
||
| Өріс | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `endDate` | `string` | ✅ | Аяқталу күні (формат: `YYYY-MM-DD`) |
|
||
| `lastTransactionDate` | `string` | ❌ | Соңғы транзакция күні (пагинация үшін) |
|
||
| `statementPeriodCode` | `number` | ❌ | Кезең коды (әдепкі: `0`) |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/history/operations \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..." \
|
||
-d '{"endDate": "2025-01-15"}'
|
||
```
|
||
|
||
---
|
||
|
||
### `POST /api/history/details`
|
||
|
||
Нақты операцияның мәліметтерін алу.
|
||
|
||
**Сұраныс денесі:**
|
||
|
||
| Өріс | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `id` | `number` | ✅ | Операция ID-сі |
|
||
| `operationMethod` | `number` | ❌ | Операция әдісі (әдепкі: `0`) |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/history/details \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..." \
|
||
-d '{"id": 123456}'
|
||
```
|
||
|
||
---
|
||
|
||
## Refund — Қайтарулар
|
||
|
||
Бұрын жүргізілген операция бойынша қаражатты қайтару.
|
||
|
||
> 🔒 Барлық эндпоинттер [сессия тақырыптарын](#сессия-тақырыптары) талап етеді.
|
||
|
||
### `POST /api/refund/create`
|
||
|
||
Қайтару жасау.
|
||
|
||
**Сұраныс денесі:**
|
||
|
||
| Өріс | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `qrOperationId` | `number` | ✅ | Қайтару үшін операция ID-сі |
|
||
| `returnAmount` | `number` | ✅ | Теңгемен қайтару сомасы |
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/refund/create \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..." \
|
||
-d '{"qrOperationId": 789012, "returnAmount": 500}'
|
||
```
|
||
|
||
---
|
||
|
||
## Session — Сессияны тексеру
|
||
|
||
### `GET /api/session/check`
|
||
|
||
Kaspi API-ге сұраныс арқылы ағымдағы сессияның жарамдылығын тексеру.
|
||
|
||
> 🔒 [Сессия тақырыптарын](#сессия-тақырыптары) талап етеді.
|
||
|
||
**Сұраныс мысалы:**
|
||
|
||
```bash
|
||
curl "http://localhost:3000/api/session/check" \
|
||
-H "X-Token-SN: ..." \
|
||
-H "X-Vtoken-Secret: ..."
|
||
```
|
||
|
||
**Белсенді сессия:**
|
||
|
||
```json
|
||
{ "active": true }
|
||
```
|
||
|
||
**Белсенді емес сессия:**
|
||
|
||
```json
|
||
{
|
||
"active": false,
|
||
"error": "Session rejected by Kaspi API.",
|
||
"code": 401,
|
||
"details": { ... }
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Қате кодтары
|
||
|
||
Барлық эндпоинттер қателерді келесі форматта қайтарады:
|
||
|
||
```json
|
||
{ "error": "Қатенің сипаттамасы" }
|
||
```
|
||
|
||
| HTTP-код | Сипаттама |
|
||
|---|---|
|
||
| `400` | Міндетті параметрлер жоқ |
|
||
| `401` | Сессия тақырыптары жоқ немесе жарамсыз |
|
||
| `500` | Сервердің ішкі қатесі немесе Kaspi API қатесі |
|
||
|
||
---
|
||
|
||
## Webhooks — Хабарламалар
|
||
|
||
Жүйе жасалған QR және invoice төлемдерінің статустарын автоматты түрде бақылайды (әр 3 секунд сайын polling) және төлем статусы өзгерген кезде көрсетілген URL-дарға HTTP POST хабарламаларын (webhooks) жібереді.
|
||
|
||
### Баптау
|
||
|
||
Вебхуктар жобаның түбіріндегі `webhooks.json` файлында баптаулады. Файл объектілер массивін қамтиды:
|
||
|
||
```json
|
||
[
|
||
{
|
||
"url": "https://example.com/webhook",
|
||
"events": ["payment.success", "payment.failed", "payment.expired"],
|
||
"secret": "your-webhook-secret"
|
||
}
|
||
]
|
||
```
|
||
|
||
| Өріс | Түрі | Міндетті | Сипаттама |
|
||
|---|---|---|---|
|
||
| `url` | `string` | ✅ | Хабарламалар жіберілетін URL |
|
||
| `events` | `string[]` | ✅ | Жазылу оқиғаларының тізімі |
|
||
| `secret` | `string` | ❌ | HMAC қолтаңбасы үшін құпия (ұсынылады) |
|
||
|
||
> 💡 Бастау үшін `webhooks.example.json` → `webhooks.json` көшіріп, өңдеңіз.
|
||
|
||
Әр түрлі URL және оқиғалармен бірнеше вебхук көрсетуге болады:
|
||
|
||
```json
|
||
[
|
||
{
|
||
"url": "https://my-crm.com/kaspi-hook",
|
||
"events": ["payment.success"],
|
||
"secret": "crm-secret-key"
|
||
},
|
||
{
|
||
"url": "https://my-accounting.com/hook",
|
||
"events": ["payment.success", "payment.failed", "payment.expired"],
|
||
"secret": "accounting-secret"
|
||
}
|
||
]
|
||
```
|
||
|
||
### Оқиғалар
|
||
|
||
| Оқиға | Сипаттама | Қашан іске қосылады |
|
||
|---|---|---|
|
||
| `payment.success` | Төлем сәтті өтті | QR: `Processed` статусы; Invoice: `Processed` статусы |
|
||
| `payment.failed` | Төлем қабылданбады / бас тартылды | QR: `CancelledByUser`, `Rejected`, `Error` және т.б.; Invoice: `RemotePaymentCanceled`, `RemotePaymentRejected` |
|
||
| `payment.expired` | Төлем уақыты аяқталды | QR: `QrTokenDiscarded`, `Expired`; Invoice: `Expired` |
|
||
|
||
### Payload форматы
|
||
|
||
Оқиға іске қосылғанда әрбір жазылған URL-ға JSON денесі бар POST сұрау жіберіледі:
|
||
|
||
```json
|
||
{
|
||
"event": "payment.success",
|
||
"paymentId": "123456",
|
||
"type": "qr",
|
||
"status": "Processed",
|
||
"statusDesc": "Операция сәтті өтті",
|
||
"amount": 5000,
|
||
"qrToken": "QR-TOKEN-...",
|
||
"receiptUrl": "https://...",
|
||
"orderNumber": "ORDER-001",
|
||
"data": { ... },
|
||
"timestamp": "2026-05-10T00:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
| Өріс | Түрі | Сипаттама |
|
||
|---|---|---|
|
||
| `event` | `string` | Оқиға атауы (`payment.success`, `payment.failed`, `payment.expired`) |
|
||
| `paymentId` | `string` | Төлем ID-сі (QR operationId немесе invoice operationId) |
|
||
| `type` | `string` | Төлем түрі: `qr` немесе `invoice` |
|
||
| `status` | `string` | Kaspi API-ден финалды статус |
|
||
| `statusDesc` | `string` | Статус сипаттамасы |
|
||
| `amount` | `number\|null` | Төлем сомасы теңгемен |
|
||
| `qrToken` | `string\|null` | QR-токен (тек QR-төлемдер үшін) |
|
||
| `receiptUrl` | `string\|null` | Чекке сілтеме |
|
||
| `orderNumber` | `string\|null` | Тапсырыс нөмірі |
|
||
| `data` | `object` | Kaspi API-ден толық жауап деректері |
|
||
| `timestamp` | `string` | Хабарлама жіберу уақыты (ISO 8601) |
|
||
|
||
### Қолтаңба (HMAC)
|
||
|
||
Әрбір сұрау вебхук конфигурациясындағы `secret` көмегімен HMAC SHA-256 арқылы қолтаңбаланады. Қолтаңба тақырыпта жіберіледі:
|
||
|
||
```
|
||
X-Webhook-Signature: sha256=<hex-digest>
|
||
```
|
||
|
||
**Қабылдаушы жағында қолтаңбаны тексеру (Node.js):**
|
||
|
||
```javascript
|
||
import crypto from 'crypto';
|
||
|
||
const verifySignature = (body, signature, secret) => {
|
||
const expected = 'sha256=' + crypto
|
||
.createHmac('sha256', secret)
|
||
.update(body)
|
||
.digest('hex');
|
||
return crypto.timingSafeEqual(
|
||
Buffer.from(signature),
|
||
Buffer.from(expected)
|
||
);
|
||
};
|
||
|
||
// Сұрау өңдеушісінде:
|
||
const rawBody = JSON.stringify(req.body); // немесе raw body пайдаланыңыз
|
||
const sig = req.headers['x-webhook-signature'];
|
||
if (!verifySignature(rawBody, sig, 'your-webhook-secret')) {
|
||
return res.status(401).send('Invalid signature');
|
||
}
|
||
```
|
||
|
||
### Қайта жіберу (Retry)
|
||
|
||
Вебхук жеткізілмесе (желі қатесі, таймаут, HTTP қатесі), жүйе **3 әрекетке** дейін өсетін кідіріспен орындайды:
|
||
|
||
| Әрекет | Кідіріс |
|
||
|---|---|
|
||
| 1-ші (бірінші) | Бірден |
|
||
| 2-ші | 5 секунд |
|
||
| 3-ші | 30 секунд |
|
||
|
||
- Сұрау таймауты: **10 секунд**.
|
||
- Қайта жіберу кезегі `webhook-retries.json` файлында сақталады және сервер қайта іске қосылғанда жоғалмайды.
|
||
- 3 сәтсіз әрекеттен кейін хабарлама жойылады (қате логқа жазылады).
|
||
|
||
---
|
||
|
||
## Пайдаланудың типтік сценарийі
|
||
|
||
```
|
||
1. POST /api/auth/init → processId алу
|
||
2. POST /api/auth/send-phone → SMS жіберу
|
||
3. POST /api/auth/verify-otp → кодты растау → tokenSN + vtokenSecret алу
|
||
|
||
4. POST /api/qr/create → төлем үшін QR жасау
|
||
5. GET /api/qr/status → төлем статусын тексеру
|
||
|
||
— немесе —
|
||
|
||
4. POST /api/invoice/create → телефон нөмірі бойынша шот-фактура жасау
|
||
5. GET /api/invoice/details → шот-фактура статусын тексеру
|
||
|
||
6. POST /api/refund/create → қаражатты қайтару (қажет болған жағдайда)
|
||
```
|