Алдаа боловсруулалт
GovPay channel-api алдааны загвар, статус кодууд болон алдаанд хэрхэн зохицох
GovPay channel-api нь алдааг HTTP статус код болон JSON биеэр дамжуулна. Энэ хуудас алдааны загвар, нийтлэг шалтгаан болон танай систем алдаанд хэрхэн зохицох талаар тайлбарлана. Бүх статус кодын нэгдсэн жагсаалтыг Алдааны кодууд хуудаснаас үзнэ үү.
Validation алдаа (400)
Бүх endpoint NestJS ValidationPipe-ийг whitelist + forbidNonWhitelisted горимоор ашигладаг. Энэ нь:
- Хүсэлтийн биед үл мэдэгдэх / зөвшөөрөгдөөгүй талбар байвал →
400. - Талбарын төрөл буруу (жишээ нь
amount-д тоо биш утга) байвал →400.
Жишээ нь POST /payments дээр илүүдэл талбар явуулбал хүсэлт бүхэлдээ татгалзана:
{ "invoiceId": "5f8d0a3e-1b2c-4d6e-8a9f-0c1d2e3f4a5b", "foo": "bar" }{
"statusCode": 400,
"message": ["property foo should not exist"],
"error": "Bad Request"
}Зөвхөн баримтжуулсан талбаруудыг л явуул. Шинэ талбар нэмбэл хүсэлт 400-аар
бүхэлдээ татгалзах тул хариуг үл тоомсорлох гэж бүү найд.
GET /invoices дээр шүүлтүүрийг яг нэгийг (ttd, vehicle эсвэл taxRef) дамжуулна. Хоосон эсвэл олон шүүлтүүр өгвөл мөн 400 буцна.
Буруу UUID (400)
{id} бүхий замууд (GET /invoices/{id}, GET /payments/{id}, DELETE /payments/{id} гэх мэт) ParseUUIDPipe-ээр шалгагдана. Зам дахь утга хүчинтэй UUID биш бол endpoint-ийн дотоод логик ажиллахаас өмнө шууд 400 буцна:
GET /api/v1/payments/not-a-uuid → 400 Bad RequestТөлбөр болон нэхэмжлэлийг дотоод UUID id-аар хаягладаг — refNum биш.
Зөв талбарыг ашиглаж буй эсэхээ шалга.
Төлбөр амжилтгүй (422)
POST /payments хүсэлт зөв боловч төлбөр боловсруулагдаж чадаагүй (жишээ нь нэхэмжлэл хаагдсан, төрийн систем татгалзсан) бол 201 биш, 422 Unprocessable Entity буцна. Бие нь:
{
"success": false,
"refNum": "INV-2026-0001",
"message": "Төлбөр боловсруулах боломжгүй"
}success: false-ийг шалгаж, refNum болон message-ийг лог-доо хадгал. 422 нь хүсэлтийн формат биш, бизнес логикийн татгалзал гэдгийг анхаар — ижил биеэр дахин оролдох нь ихэвчлэн дахин амжилтгүй болно.
Төрийн системийн алдаа (5xx)
Дээд талын (upstream) төрийн систем — алдаа өгвөл GovPay 5xx буцаана. Дотоод шалтгаан клиентэд задрахгүй: танд ерөнхий мессеж ирэх ба бодит шалтгаан GovPay-ийн дотоод лог-д тэмдэглэгдэнэ. Эдгээр нь түр зуурын байж болох тул дахин оролдох нь зүйтэй (доорх Дахин оролдлого хэсгийг үз).
Алдаанд зохицох
Статус кодоор салгах
| Код | Утга | Дахин оролдох уу? |
|---|---|---|
400 | Validation / буруу шүүлтүүр / буруу UUID | Үгүй — хүсэлтээ зас |
401 | API key байхгүй / буруу | Үгүй — key-ээ шалга |
403 | Партнёр идэвхгүй | Үгүй — GovPay-тэй холбогдо |
404 | Олдсонгүй | Үгүй — id/refNum-ээ шалга |
422 | Төлбөр амжилтгүй (бизнес логик) | Үгүй — биеэ зас эсвэл шалга |
429 | Rate limit хэтэрсэн | Тийм — хүлээгээд дахин |
5xx | Дээд талын төрийн систем | Тийм — backoff-той дахин |
4xx (429-ээс бусад) нь клиентийн алдаа — хүсэлтийг засахгүйгээр дахин оролдох нь утгагүй. 429 болон 5xx нь түр зуурын байж болох тул дахин оролдоход тохиромжтой.
Rate limit (429)
API key тус бүрд лимит: 5/сек, 60/мин, 1000/цаг. Хэтэрвэл 429 буцна. Энэ тохиолдолд хүсэлтийн давтамжаа бууруулж, түр хүлээгээд (exponential backoff) дахин оролдоно. Дэлгэрэнгүйг Орчин хуудаснаас үзнэ үү.
Дахин оролдлого (retry)
POST /payments-ийг дахин оролдохдоо үргэлж X-Idempotency-Key ашигла.
Энэ нь сүлжээ тасрах эсвэл timeout болоход давхар төлбөрөөс сэргийлнэ —
ижил key-тэй давтан хүсэлт нь кэшлэгдсэн хариуг ("message": "idempotent")
буцаана.
Дахин оролдох ерөнхий зарчим:
- Зөвхөн
429ба5xx-д автоматаар дахин оролд.4xx-д бүү дахин оролд. - Exponential backoff ашигла (жишээ нь 1с → 2с → 4с), дээд хязгаартай (3-5 удаа).
POST /payments-дX-Idempotency-Key-г хүсэлт болгонд өөрчлөхгүй — анхны UUID-аа дахин оролдлогын турш барь.- Хариу ирээгүй (timeout) тохиолдолд төлбөр амжилттай болсон эсэхийг
GET /payments/{id}эсвэл idempotent дахин оролдлогоор баталгаажуул — нэхэмжлэлийг хоёр дахин бүү төл.
curl -X POST \
-H "X-API-Key: YOUR_KEY" \
-H "X-Idempotency-Key: 7c1a9b2e-3d4f-4a5b-8c6d-9e0f1a2b3c4d" \
-H "Content-Type: application/json" \
-d '{"invoiceId":"5f8d0a3e-1b2c-4d6e-8a9f-0c1d2e3f4a5b"}' \
"https://sandbox-tts.qpay.mn/api/v1/payments"Timeout
Дээд талын төрийн системийн хариу удаашрах магадлалтай тул HTTP клиентдээ боломжийн timeout тавь. Timeout-д орвол хүсэлт амжилтгүй гэж шууд бүү тэмдэглэ — POST /payments дээр idempotency key ашигласан бол аюулгүйгээр дахин оролдож, эсвэл GET /payments/{id}-аар бодит статусыг шалга.
Webhook нь танай endpoint-д хүрэхдээ 5 секундын timeout-той — хурдан 2xx
буцаа, хүнд боловсруулалтыг async хий. Дэлгэрэнгүйг Webhook
болон Гарын үсэг шалгах хуудсаас үз.
Холбоотой хуудсууд
- Алдааны кодууд — бүх статус кодын нэгдсэн жагсаалт.
- Орчин — base URL болон rate limit.
- Төлбөр —
422, idempotency, статусын урсгал. - Webhook — хүргэлтийн timeout болон retry.