Утасгүй турших¶
Хүний талыг (claim, «Төлөх», «Болих», хугацаа дуусах) консолоос тоглуулж, бодит урсгалын яг ижил event-үүдийг өөрийн
webhook дээр авах — утас, мөнгөгүйгээр. Хугацаа: 10 минут. Хэрэгтэй: консолд апп, test орчны webhook endpoint
(Локал webhook), test түлхүүр, miniapp.develop эрх (симуляцад).
1. Test intent үүсгэх¶
POST /api/v1/miniapp/dev/apps/{id}/test-intents — body нь payments API-ийнх
(Payment intent): amount, description, reference, expires_in, capture_method,
metadata, мөн presentment, terminal_id, sub_merchant_id, return_url, min_age, capture_within.
presentment |
Хэнийх | Хариу |
|---|---|---|
app (орхивол) |
консолд нэвтэрсэн таны нэр дээр, таны user_ref-тэй |
intent |
qr · redirect · terminal |
хэнийх ч биш — тест хэрэглэгч эсвэл симуляц claim хийтэл | intent + pay_url |
Claimless test intent нь таны backend test түлхүүрээр үүсгэхтэй яг ижил шалгалтаар (терминал, дэд худалдагч,
return host, terminal_busy) явна. Idempotency-Key сонголттой — өгөхгүй бол дуудлага бүр шинэ intent
(201; ижил key + ижил body → 200). app test intent-д capture_within, min_age хадгалагдахгүй (manual-ийн
цонх 7 хоног) — богино цонхыг claimless test intent эсвэл test түлхүүрээр шалгана.
Жагсаалт: GET /dev/apps/{id}/test-intents?cursor= — шинэ нь эхэнд, 20-оор, {items, next_cursor}.
2. Хүний үйлдлийг симуляц хийх¶
POST /api/v1/miniapp/dev/apps/{id}/test-intents/{pi}/simulate {"action": "…", "test_user_id": "…"?} —
хариу нь үйлдлийн дараах intent (webhook-ийн data.object-той ижил хэлбэр), 200.
action |
Юу хийх | Бодит урсгалын аль хэсэг | Event |
|---|---|---|---|
claim |
claimless intent-ийг тест хэрэглэгчийн нэр дээр авна | хүн QR / NFC уншуулав (POST /payments/claim) — ижил хамгаалалт: 90 с, хүнд 3 нээлттэй claim |
payment_intent.claimed |
confirm |
«Төлөх» — тест дүн үр дүнг шийднэ | төлөх цонхны баталгаажуулалт | .succeeded · .requires_capture · .failed · .canceled |
decline |
«Болих» — хүний цуцлалт (барьцааг суллахгүй) | хүний cancel | payment_intent.canceled |
expire |
хугацааг одоо болгоно: төлөгдөөгүй intent expired; барьцаатай нь capture-ийн цонх хаагдана |
reconcile job-ийн хугацаа дуусгалт | .expired (claimless) · .canceled status: "expired" (app) |
test_user_id— тест хэрэглэгч эсвэл апп-ын эзэн; орхивол дуудагч өөрөө (тэд байх ёстой).confirm,declineнь claim хийгдсэн intent-д (apptest intent аль хэдийн таных).- Симуляц бүр төлбөрийн түүхэд «консол хүнийг тогловоо» гэж бичигдэнэ — хүн хийсэн мэт харагдахгүй.
- Event-үүд шууд илгээгдэнэ (бодит урсгалын адил). Хуучин
POST …/test-intents/{pi}/confirmroute ажилласаар, гэхдээ түүний event хүргэлтийн job-оор (минутын дотор) явна —simulateconfirm-ийг хэрэглэнэ үү.
Sticker-т утас хүргэх — simulate-tap¶
POST /api/v1/miniapp/dev/apps/{id}/terminals/{tid}/simulate-tap {"test_user_id": "…"?} — тест хэрэглэгчийн утас
sticker-т хүрсэн мэт: терминалын нээлттэй test сагсыг claim хийнэ (live сагсыг хэзээ ч биш). Терминалд test
сагс алга бол 404 nothing_pending.
3. Жишээ: вендинг машины бүтэн урсгал¶
# Консолын session-ээр ($GEREGE_SESSION), app id = $APP, терминал = $TID
# 1. Терминалд manual test сагс
curl -sS "$GEREGE/dev/apps/$APP/test-intents" -H "Authorization: Bearer $GEREGE_SESSION" \
-H 'Content-Type: application/json' -H 'Idempotency-Key: sim-basket-1' \
-d "{\"amount\": 3500, \"description\": \"Ус 0.5л\", \"presentment\": \"terminal\", \"terminal_id\": \"$TID\",
\"capture_method\": \"manual\", \"capture_within\": 120}" | jq '{id, status, pay_url}'
# 2. Утас sticker-т хүрэв → payment_intent.claimed
curl -sS -X POST "$GEREGE/dev/apps/$APP/terminals/$TID/simulate-tap" -H "Authorization: Bearer $GEREGE_SESSION"
# 3. «Төлөх» → payment_intent.requires_capture
curl -sS "$GEREGE/dev/apps/$APP/test-intents/$PI/simulate" -H "Authorization: Bearer $GEREGE_SESSION" \
-H 'Content-Type: application/json' -d '{"action": "confirm"}' | jq '{status, capture_before}'
# 4. Таны backend (test түлхүүр) гаргасан бол capture → payment_intent.succeeded
curl -sS -X POST "https://geregeapp.mn/api/v1/miniapp/payment-intents/$PI/capture" \
-u "$GEREGE_CLIENT_ID:$GEREGE_CLIENT_SECRET" | jq .status
$GEREGE = https://geregeapp.mn/api/v1/miniapp. Гараагүй тохиолдлыг шалгах бол 4-ийн оронд cancel, эсвэл
{"action": "expire"} (capture-ийн цонх дуусав → payment_intent.expired, failure_code: "authorization_expired").
4. Алдаа¶
| HTTP | code |
Хэзээ |
|---|---|---|
| 400 | validation_error |
талбар буруу; action нь claim/confirm/decline/expire биш; test_user_id UUID биш |
| 400 | idempotency_key_invalid |
test intent: Idempotency-Key 1–128 хэвлэгдэх ASCII биш |
| 403 | permission_required |
симуляцад miniapp.develop эрх алга (permission) |
| 409 | live_intent |
live intent — симуляц мөнгөнд хэзээ ч хүрэхгүй |
| 409 | not_a_test_user |
test_user_id (эсвэл та) апп-ын тест хэрэглэгч, эзэн биш |
| 409 | not_claimless |
claim нь app intent дээр |
| 409 | not_claimed |
confirm / decline нь хэн ч claim хийгээгүй intent дээр |
| 409 | not_expirable |
intent хугацаа дуусах төлөвт алга (payment_intent хавсарна) |
| 409 | already_claimed (retry_after) · already_processed · not_claimable · terminal_disabled · merchant_unavailable · idempotency_conflict · terminal_busy |
бодит claim, баталгаажуулалт, үүсгэлтийн ижил шалтгаан |
| 404 | nothing_pending |
simulate-tap: терминалд нээлттэй test сагс алга |
| 410 | expired |
claim — хугацаа дууссан |
| 429 | too_many_open_claims |
тест хэрэглэгчид баталгаажаагүй 3 claim бий |
Бүрэн жагсаалт: Алдааны код.