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

Тулгалт

Энэ хуудсаар

Юу хийх: таны захиалгын бүртгэл, Gerege-ийн intent, тооцоо гурвыг өдөр бүр тулгаж, алдагдсан webhook, гацсан барьцаа, илүү төлбөрийг олох. Хугацаа: ~1 цаг. Хэрэгтэй: client credential (Basic), захиалга бүрт хадгалсан reference ба intent id.

1. Түлхүүр нь reference

Intent бүрт өөрийн захиалга/сагсны дугаарыг reference болго (≤ 64), Idempotency-Key-ийг мөн түүгээр (эсвэл <reference>-<оролдлого>). Тэгвэл:

  • GET /payment-intents?reference=ord_8812 — тэр захиалгын бүх оролдлого (шинэ нь эхэнд).
  • Webhook, GET, тооцооны мөр (intents[].reference) бүгд таны дугаартай буцна.

2. Жагсаалт ба шүүлтүүр

curl -G https://geregeapp.mn/api/v1/miniapp/payment-intents -u "$GEREGE_CLIENT_ID:$GEREGE_CLIENT_SECRET" \
  --data-urlencode status=requires_capture --data-urlencode limit=100
  • status (requires_confirmation, processing, requires_capture, succeeded, partially_refunded, refunded, canceled, expired, failed), reference, limit (1–100, анхдагч 20), after (өмнөх хуудасны сүүлийн id) → {"data": […], "has_more": true}, шинэ нь эхэнд.
  • Түлхүүрийн орчин: test түлхүүр test intent-үүдийг, live — live-ийг.
  • SDK: Node paymentIntents.listAll({status}) (бүх хуудас), Go PaymentIntents.List + After.

3. Өдөр бүрийн шалгалт

Шалгах Хэрхэн Олдвол
Төлөгдсөн ч биелээгүй захиалга status=succeeded (сүүлийн өдрийнх) ↔ таны «төлөгдсөн» webhook алдсан — биелүүл
Биелсэн ч төлөгдөөгүй таны «төлөгдсөн» бүрт GET /payment-intents/{id} succeeded биш бол шалгаж зогсоо
Гацсан барьцаа status=requires_capture бараа өгсөн бол capture, үгүй бол cancel — хүний мөнгийг дэмий барихгүй
Удаан processing status=processing платформ өөрөө дуусгана; цагаас удвал тусламж руу intent id-тай
Нэг захиалгад хоёр төлбөр reference-ээр succeeded > 1 илүүг нь буцаах
Буцаалт refund.succeeded / refund.failed ↔ таны буцаалт failed (settlement_shortfall г.м.) — дахин эсвэл гараар
Тооцоо (тооцоо асаалттай үед) GET /settlements → GET /settlements/{id} (intents, refund_items) мөр бүр таны төлбөртэй

4. Webhook алдагдсан үед

  • Хүргэлт at-least-once, амжилтгүй бол 1м, 5м, 30м, 2ц, 6ц, 12ц, 24ц давтагдана; консолд хүргэлт бүрийн төлөв, «дахин илгээх» (консол).
  • Таны webhook удаан унтарсан бол: дээрх жагсаалтаар (status, reference) нөхнө — webhook бол хурдан зам, жагсаалт бол үнэн.
  • Events API: GET /events?type=&after=<evt id>&created_gte=<RFC 3339>&limit=1..100 → {"data": […], "next_cursor"} (хуучнаас нь, 30 хоног, түлхүүрийн орчноор; scope events:read), GET /events/{id} — webhook-ийн яг тэр body. Алдсан event-ээ after-аар нөхөөд, шийдвэрээ объектыг GET-ээр дахин уншаад гарга. Тайлан CSV (самбар) — «удахгүй».

5. Код

for await (const pi of gerege.paymentIntents.listAll({ status: "succeeded", limit: 100 })) {
  if (Date.parse(pi.created_at) < since) break;              // шинэ нь эхэнд
  const order = await db.orderByReference(pi.reference);
  if (order && !order.paid && pi.amount === order.amount) await fulfil(order, pi.id);
}
after := ""
for {
    page, err := c.PaymentIntents.List(ctx, miniapp.ListPaymentIntentsParams{Status: "requires_capture", Limit: 100, After: after})
    if err != nil || len(page.Data) == 0 {
        break
    }
    for _, pi := range page.Data {
        settleOrRelease(ctx, pi) // таны дүрэм
    }
    if !page.HasMore {
        break
    }
    after = page.Data[len(page.Data)-1].ID
}