ภาพรวมของ Webhook

Webhook อีเวนต์ API การเชื่อมต่อเรียลไทม์
บทความนี้เหมาะสำหรับใคร
เหมาะสำหรับนักพัฒนาที่ใช้ Webhook ของ ReceiptRoller เป็นครั้งแรก บทความนี้อธิบายว่า Webhook คืออะไร มีอีเวนต์ใดถูกส่งบ้าง และการเลือกใช้ระหว่าง Webhook กับ API (polling)

Webhook คือกลไกที่เมื่อเกิดอีเวนต์ฝั่ง ReceiptRoller เช่น「มีการซื้อสำเร็จ」หรือ「สินค้าคงคลังเปลี่ยนแปลง」ระบบจะส่งคำขอ HTTPS แบบเรียลไทม์ไปยัง URL ที่ลงทะเบียนไว้ (เซิร์ฟเวอร์ของคุณ) เมื่อเทียบกับ「polling」ที่ฝั่งแอปเรียก API เป็นระยะ Webhook มี latency ต่ำกว่า สื่อสารโดยเปล่าประโยชน์น้อยกว่า และเหมาะกับการเชื่อมต่อระบบแบบขับเคลื่อนด้วยอีเวนต์

การเลือกใช้ระหว่าง Webhook และ API (polling)

วัตถุประสงค์ แนะนำ เหตุผล
ต้องการรับรู้การซื้อทันทีที่เกิดขึ้น Webhook การแจ้งเตือนมาถึงภายในไม่กี่วินาที
ต้องการดึงประวัติการซื้อในอดีตเป็นรายการ API แบ่งหน้าได้ ดึงซ้ำได้ง่าย
ต้องการซิงค์ทันทีตามการเปลี่ยนแปลงสินค้าคงคลัง Webhook ภาระต่ำกว่า polling
ต้องการรวมยอดแบบ batch รายวัน API ระบุช่วงเวลาแล้วดึงได้อย่างเสถียร
ต้องการป้องกันการตกหล่นโดยสมบูรณ์ ใช้ทั้งสองอย่าง Webhook สำหรับทันที และ API ดึงซ้ำเพื่อเติมเต็ม

ในการใช้งานจริง การใช้ Webhook + การดึง API ซ้ำเป็นระยะ ควบคู่กันปลอดภัยที่สุด แม้ Webhook จะถูกส่งตามหลักการ แต่การตกหล่นเนื่องจากปัญหาเครือข่ายหรือฝั่งผู้รับล่มก็ไม่ได้เป็นศูนย์เสมอไป

ชนิดอีเวนต์หลัก

อีเวนต์หลักที่ถูกส่ง ณ เมษายน 2026 มีดังนี้ (แบ่งตามหมวดหมู่) รายละเอียดโปรดดูส่วน Webhook ของ API reference (Swagger)

หมวดการซื้อ・ใบเสร็จ

  • receipt.issued — ออกใบเสร็จแล้ว
  • receipt.voided — ยกเลิกใบเสร็จแล้ว
  • receipt.refunded — ดำเนินการคืนเงินแล้ว

หมวดสินค้า・สินค้าคงคลัง

  • product.created / product.updated / product.deleted
  • inventory.changed — จำนวนสินค้าคงคลังเปลี่ยนแปลง
  • inventory.low_stock — สินค้าคงคลังต่ำกว่าเกณฑ์

หมวดคูปอง・โฆษณา

  • coupon.redeemed — มีการใช้คูปอง
  • campaign.started / campaign.ended
  • ad.click — มีการคลิกโฆษณา (ส่งแบบ batch รวมยอด)

หมวดลูกค้า・SNS

  • customer.opted_in — ยินยอมรับการสื่อสารการตลาด
  • sns.post_published — เผยแพร่โพสต์ SNS แล้ว

แต่ละอีเวนต์จะถูกสมัครรับโดยการเลือก「ชื่ออีเวนต์ที่ต้องการรับ」ตอนลงทะเบียน subscription การไม่สมัครรับอีเวนต์ที่ไม่จำเป็นจะช่วยลดภาระของฝั่งผู้รับได้

รูปแบบการส่ง

Webhook จะถูกส่งในรูปแบบต่อไปนี้

  • เมธอด:HTTPS POST (ไม่รองรับ HTTP)
  • Content-Typeapplication/json
  • เนื้อหา (body):JSON payload ที่มีข้อมูลอีเวนต์
  • Header ลายเซ็นX-RR-Signature (HMAC-SHA256)
  • Event IDX-RR-Event-Id (ใช้เป็นคีย์ idempotency)
  • Timeout:ฝั่งผู้รับต้องคืน 2xx ภายใน 10 วินาที

ตัวอย่าง payload (receipt.issued)

{
  "event_id": "evt_01HV5K3M2N9PQR",
  "event_type": "receipt.issued",
  "occurred_at": "2026-04-27T10:15:23.000Z",
  "store_id": "str_abc123",
  "data": {
    "receipt_id": "rcp_xyz789",
    "total_amount": 3850,
    "currency": "JPY",
    "issued_at": "2026-04-27T10:15:22.500Z",
    "items_count": 4
  }
}

ฝั่งผู้รับจะแยกสาขาการประมวลผลด้วย event_type และใช้แต่ละฟิลด์ภายใน data เพื่ออัปเดตระบบของตน หากต้องการข้อมูลรายละเอียด ให้ใช้ receipt_id ดึงข้อมูลตัวจริงผ่าน API payload ของ Webhook จะมีเพียงข้อมูลสรุปแบบเบาเท่านั้น

แนวคิดเรื่องการรับประกันการส่ง

Webhook ของ ReceiptRoller ใช้การรับประกันการส่งแบบ at-least-once (อย่างน้อยหนึ่งครั้ง) กล่าวคือ อีเวนต์เดียวกันอาจมาถึงตั้งแต่ 2 ครั้งขึ้นไปได้ ฝั่งผู้รับจำเป็นต้องทำidempotencyโดยใช้ event_id

  • บันทึก event_id ที่ประมวลผลแล้ว และเมื่อตรวจพบว่าซ้ำให้เพิกเฉย
  • เขียนการประมวลผลให้เป็น idempotent (ให้ผลลัพธ์เหมือนกันแม้ใช้ข้อมูลเดียวกัน 2 ครั้ง)
  • ไม่รับประกันลำดับ (อีเวนต์ที่เกิดทีหลังอาจมาถึงก่อนได้)

รายละเอียดโปรดดู การออกแบบการส่งซ้ำ ลำดับ และ idempotency

ค่าบริการและแพลน

การใช้ Webhook ไม่มีค่าบริการเพิ่มเติม สามารถใช้ได้ตั้งแต่แพลน Starter ขึ้นไป จำนวนการส่งต่อเดือนและจำนวน URL ที่เชื่อมต่อมีขีดจำกัดตามนโยบายการใช้งานที่เป็นธรรม แต่ในขอบเขตการดำเนินงานร้านค้าทั่วไปมักไม่ถึงขีดจำกัด

คู่มือที่เกี่ยวข้อง

วันที่เผยแพร่: 2569-04-27 วันที่อัปเดต: 2569-07-05
แท็ก
API (22) OAuth (15) Android (10) iOS (9) Webhook (8) api (7) oauth (5) getting-started (4) การลงทะเบียนแอป (4) การแก้ปัญหา (4)
บทความที่เกี่ยวข้อง