Webhook များ
အော်ဒါ၊ လက်ကျန် ဒါမှမဟုတ် ပို့ဆောင်မှု ပြောင်းတဲ့အခါ သင့် server ကို လက်မှတ်ထိုးထားတဲ့ စာ ပို့ပေးပါတယ်။
Webhook ဆိုတာ သင့် server ပေါ်က HTTPS လိပ်စာ တစ်ခုပါ။ ဆိုင်မှာ တစ်ခုခု ဖြစ်တဲ့အခါ FOM က အသေးစိတ်နဲ့ POST တစ်ခု ပို့ပေးလို့ သင့် tool တွေက ထပ်ခါထပ်ခါ မေးနေစရာ မလိုပါ။
Endpoint ထည့်ခြင်း
ဆက်တင် → Developers ရဲ့ Webhook များ အောက်မှာ Endpoint ထည့်ရန် ကို နှိပ်ပါ။ URL ကို ထည့်ပါ (https:// နဲ့ စပြီး အင်တာနက်ကနေ ရောက်နိုင်ရပါမယ်)၊ ပို့စေချင်တဲ့ event တွေကို အမှန်ခြစ်ပါ။ နောက်မှာ ပြတဲ့ လက်မှတ် secret ကို ကူးယူပါ - whsec_ နဲ့ စပြီး တစ်ကြိမ်သာ ပြပါတယ်။ ဆိုင်တစ်ဆိုင်မှာ endpoint ၁၀ ခုအထိ ရှိနိုင်ပါတယ်။
ping event ပို့ပြီး server ဘယ်လို ဖြေလဲ ကြည့်ဖို့ စမ်းသပ် ပို့ရန် ကို နှိပ်ပါ။
Event များ
| Event | ပို့တဲ့အချိန် | data |
|---|---|---|
order.created | FOM ထဲ ဒါမှမဟုတ် API ကနေ အော်ဒါ ဖန်တီးတဲ့အခါ | { "order": … } |
order.status_changed | အော်ဒါ အခြေအနေ ပြောင်းတဲ့အခါ | { "order": … } |
stock.low | Variant လက်ကျန်က သတ်မှတ်ထားတဲ့ နည်းသော အဆင့် (မသတ်မှတ်ရင် 0) အထိ ကျတဲ့အခါ | { "variant_id": "…", "product": … } |
delivery.updated | ပို့ဆောင်မှု ဖန်တီးတဲ့အခါ ဒါမှမဟုတ် ပြောင်းတဲ့အခါ | { "delivery": … } |
ping | စမ်းသပ် ပို့ရန် နှိပ်တဲ့အခါ | { "message": "…" } |
order၊ product နဲ့ delivery မှာ API နဲ့ field တွေ အတူတူပါ - order၊ product နဲ့ delivery object တွေကို ကြည့်ပါ။ Event ဖြစ်ခဲ့တဲ့ အချိန်က အခြေအနေအတိုင်း ပြပါတယ်။
POST /fom-webhooks HTTP/1.1
Content-Type: application/json
User-Agent: FOM-Webhooks/1.0
FOM-Event: order.created
FOM-Delivery: cmw9u2k0a0001…
FOM-Signature: t=1795680000,v1=5f2b8c…
{
"id": "cmw9u1z4e0000…",
"type": "order.created",
"created_at": "2026-11-25T08:00:00.000Z",
"shop_id": "…",
"data": { "order": { "id": "…", "order_no": "ORD-0319", "status": "new", … } }
}မြန်မြန် ဖြေပါ
- ၁၀ စက္ကန့် အတွင်း 2xx status တစ်ခုခုနဲ့ ဖြေပါ။ ကြာတဲ့ အလုပ်တွေကို queue လို နောက်မှ လုပ်ပါ။
- တခြား status၊ အချိန်ကုန်တာ ဒါမှမဟုတ် redirect ကို မအောင်မြင်ဘူးလို့ ယူဆပါတယ်။
- Endpoint တစ်ခုအတွက် event တွေက ဖြစ်ခဲ့တဲ့ အစီအစဉ်အတိုင်း ရောက်ပါတယ်။ အရင်တစ်ခု အောင်မြင်တဲ့အထိ ဒါမှမဟုတ် လက်လျှော့တဲ့အထိ နောက်တစ်ခုက စောင့်ပါတယ်။
- Event တစ်ခုတည်း တစ်ကြိမ်ထက် ပိုရောက်နိုင်ပါတယ်။ လုပ်ပြီးသားကို ကျော်ဖို့ ၎င်းရဲ့
idကို သုံးပါ။
ပြန်ကြိုးစားခြင်း
မအောင်မြင်တဲ့ ပို့မှုကို ၁ မိနစ်၊ ၅ မိနစ်၊ ၃၀ မိနစ်၊ ၂ နာရီ၊ ၆ နာရီနဲ့ ၂၄ နာရီ ကြာပြီးနောက် ပြန်ကြိုးစားပြီး နောက်ဆုံးမှာ မအောင်မြင် လို့ မှတ်ပါတယ်။ Endpoint ပေါ်က ပို့မှုများ ကိုနှိပ်ရင် ပို့မှုတိုင်း၊ server ရဲ့ အဖြေကို ကြည့်ပြီး ပြန်ပို့ရန် နဲ့ ပြန်ပို့နိုင်ပါတယ်။ ပို့မှုတွေကို ရက် ၃၀ သိမ်းထားပါတယ်။
ဆက်တိုက် ၅၀ ကြိမ် မအောင်မြင်ရင် FOM က endpoint ကို ပိတ်ပြီး ပိုင်ရှင်ကို အသိပေးပါတယ်။ Server ကို ပြင်ပြီး ဖွင့်ရန် ကို နှိပ်ပါ။
လက်မှတ်ကို စစ်ပါ
တခြားသူ အတုအယောင် event တွေ မပို့နိုင်အောင် စာတိုင်းကို မယုံခင် စစ်ပါ။ FOM-Signature မှာ အချိန် t နဲ့ လက်မှတ် v1 ပါပါတယ် - t၊ အစက် တစ်ခုနဲ့ request body အကြမ်း ကို လက်မှတ် secret နဲ့ HMAC-SHA256 လုပ်ထားတာကို hex နဲ့ ပြတာပါ။
- JSON အဖြစ် မပြောင်းခင် body အကြမ်းကို ဖတ်ပါ။
HMAC-SHA256(secret, t + "." + body)ကို တွက်ပြီးv1နဲ့ constant time နဲ့ နှိုင်းယှဉ်ပါ။- Replay တွေကို တားဖို့
tက ယခုအချိန်နဲ့ ၅ မိနစ်ထက် ကွာရင် ငြင်းပါ။
import { createHmac, timingSafeEqual } from "node:crypto"
export function verifyFomSignature(rawBody, header, secret) {
const parts = Object.fromEntries(
header.split(",").map((part) => part.trim().split("="))
)
const t = Number(parts.t)
if (!parts.v1 || Math.abs(Date.now() / 1000 - t) > 300) return false
const expected = createHmac("sha256", secret)
.update(`${t}.${rawBody}`)
.digest()
const given = Buffer.from(parts.v1, "hex")
return given.length === expected.length && timingSafeEqual(given, expected)
}
// Express: keep the raw body.
app.post("/fom-webhooks", express.raw({ type: "application/json" }), (req, res) => {
if (!verifyFomSignature(req.body, req.get("FOM-Signature") ?? "", process.env.FOM_WEBHOOK_SECRET)) {
return res.sendStatus(400)
}
const event = JSON.parse(req.body)
res.sendStatus(200)
})TypeScript SDK မှာ constructWebhookEvent အဖြစ် ပါပြီးသားပါ။
Secret ပြောင်းခြင်း
ဥပမာ secret ပေါက်ကြားသွားရင် endpoint ပေါ်က Secret အသစ် ကိုနှိပ်ပြီး လက်မှတ် secret အသစ် ပြုလုပ်ပါ။ အဟောင်းက ချက်ချင်း ရပ်သွားလို့ server ကို ချက်ချင်း update လုပ်ပါ။