Webhooks & รายงานการส่ง
การส่งสำเร็จหมายถึง "รับไว้เพื่อส่ง" ไม่ใช่ "ส่งถึงแล้ว" รายงานการส่ง (DR) จะมาถึงแบบ asynchronous ในรูปแบบ webhook โดยอ้างอิงจาก transaction_uuid ที่คุณกำหนดบนข้อความ
รับรายงานการส่ง
ชี้ HTTPS endpoint สาธารณะมายัง MessageEagle และจัดการ callback:
ts
app.post("/webhooks/messageeagle", (req, res) => {
const { transaction_uuid, status } = req.body;
// 1. ตอบรับเร็ว — ส่ง 2xx ก่อนทำงานหนัก
res.sendStatus(200);
// 2. ค้นหาข้อความเดิมด้วย transaction_uuid และอัปเดตสถานะ
queue.enqueue({ transaction_uuid, status });
});ออกแบบให้รองรับกรณียาก
Webhook ส่งแบบ at-least-once ออกแบบ handler ทุกตัวให้รองรับสิ่งนี้
- อัปเดตแบบ idempotent ใช้
transaction_uuidเป็น key — การรับ DR เดิมสองครั้ง ต้องไม่มีผลใด ๆ เพิ่มเติม ควรใช้ UPSERT แทน INSERT - ตอบรับก่อน ประมวลผลทีหลัง ส่ง
2xxทันที แล้วทำงานจริงใน queue handler ที่ช้าทำให้เกิดการส่ง webhook ซ้ำ - รองรับการมาผิดลำดับ
deliveredอาจมาก่อนsentใช้ลำดับความสำคัญของสถานะ ไม่ใช่แบบ last-write-wins
ยืนยันแหล่งที่มา
ตรวจสอบ signature ของ request (หรือ shared secret) ก่อนเชื่อถือ payload อย่าดำเนินการกับ webhook body ที่ยังยืนยันตัวตนไม่ได้
รูปแบบสถานะ
| สถานะ | ความหมาย |
|---|---|
queued | รับไว้แล้ว รอการส่งออก |
sent | ส่งถึง carrier แล้ว |
delivered | ยืนยันว่าถึงมือถือแล้ว |
failed | carrier ปฏิเสธหรือส่งไม่ได้ |
expired | หมดเวลา TTL ก่อนส่งถึง (เช่น มือถือติดต่อไม่ได้) |
การสิ้นสุดของ Voice
Voice session ก็ emit callback เมื่อสิ้นสุดเช่นกัน — การบันทึกเสียง transcript บันทึก DTMF และค่าใช้จ่ายจะไปปรากฏที่ VoiceSession ใช้ GET /organization/{organizationId}/webhook-deliveries เป็น fallback หาก callback หาย — ดู การส่ง Webhook
