Агуулгыг алгасах

Утасгүй турших

Хүний талыг (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-д (app test intent аль хэдийн таных).
  • Симуляц бүр төлбөрийн түүхэд «консол хүнийг тогловоо» гэж бичигдэнэ — хүн хийсэн мэт харагдахгүй.
  • Event-үүд шууд илгээгдэнэ (бодит урсгалын адил). Хуучин POST …/test-intents/{pi}/confirm route ажилласаар, гэхдээ түүний event хүргэлтийн job-оор (минутын дотор) явна — simulate confirm-ийг хэрэглэнэ үү.

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 бий

Бүрэн жагсаалт: Алдааны код.