บทความทั้งหมด
เหตุการณ์ SMS และเสียงไหลเข้ามาเป็น Webhook สู่ handler สำหรับพัฒนาบนเครื่องโลคัล
Twiliowebhook debuggingSMSlocal testing

ทดสอบ Webhook ของ Twilio บนเครื่องโลคัล: คู่มือฉบับสมบูรณ์

การทดสอบ Webhook ของ Twilio บนเครื่องโลคัล ช่วยให้คุณรับการตอบกลับ SMS, คอลแบ็กเสียง และการอัปเดตสถานะข้อความบนเครื่องของคุณได้ Twilio ส่ง Webhook เป็นคำขอ HTTP POST พร้อม payload แบบ form-encoded — localhost ของคุณต้องมี URL HTTPS สาธารณะเพื่อรับมันระหว่างพัฒนา

ทำไมคอลแบ็กของ Twilio จึงต้องมี URL สาธารณะ

เมื่อมีคนส่ง SMS มายังหมายเลข Twilio ของคุณหรือจบสายโทร Twilio จะ POST ข้อมูลเหตุการณ์ไปยัง URL Webhook ที่ตั้งค่าไว้ ที่อยู่โลคัลอย่าง http://localhost:3000/sms เข้าถึงไม่ได้จากโครงสร้างพื้นฐานของ Twilio ทันเนล localhost เชื่อมช่องว่างนั้นด้วย endpoint HTTPS สาธารณะ

ประเภท Webhook ของ Twilio ที่ควรทดสอบบนเครื่องโลคัล

  • SMS ขาเข้า: เมื่อผู้ใช้ส่งข้อความมายังหมายเลข Twilio ของคุณ
  • คอลแบ็กสถานะ SMS: การยืนยันการส่ง (sent, delivered, failed)
  • คอลแบ็กเสียง: คำขอ TwiML เมื่อสายเชื่อมต่อหรือเข้าสู่เมนู
  • ข้อความ WhatsApp: Webhook ขาเข้าและสถานะของ WhatsApp Business API
  • Conversations API: เหตุการณ์เพิ่มข้อความและผู้เข้าร่วม

ทีละขั้นตอน: ทดสอบ Webhook ของ Twilio บนเครื่องโลคัล

  1. เริ่มแอปโลคัลที่มี route Webhook ของ Twilio (เช่น /sms/inbound)
  2. รัน npx portpreview 3000 เพื่อสร้าง URL HTTPS สาธารณะ
  3. ใน Twilio Console ตั้งค่า URL Webhook ของหมายเลขโทรศัพท์เป็น URL ทันเนลบวก path ของ route
  4. ตั้งค่าเมธอด HTTP (โดยทั่วไปคือ POST) และตรวจสอบว่า content type ตรงกับ handler ของคุณ
  5. ส่ง SMS ทดสอบหรือโทรทดสอบเพื่อทริกเกอร์ Webhook
  6. ตรวจคำขอที่จับไว้ — Twilio ส่ง payload แบบ form-encoded ไม่ใช่ JSON
  7. ยืนยันว่า handler ตรวจสอบลายเซ็น Twilio และคืนค่า TwiML ที่ถูกต้องหรือการตอบกลับ 2xx

ตรวจสอบลายเซ็นคำขอของ Twilio บนเครื่องโลคัล

Twilio เซ็นทุกคำขอด้วย header X-Twilio-Signature ที่คำนวณจาก URL เต็มและพารามิเตอร์ POST โดยใช้ auth token ของคุณ handler ของคุณควร:

  • ใช้ URL สาธารณะที่ตรงเป๊ะ (รวมถึง hostname ของทันเนล) ในการตรวจสอบลายเซ็น
  • ส่งพารามิเตอร์ POST ทั้งหมดเข้าสู่ฟังก์ชันตรวจสอบ
  • ปฏิเสธคำขอที่มีลายเซ็นไม่ถูกต้อง แม้ระหว่างการทดสอบโลคัล

เมื่อ URL ทันเนลเปลี่ยนระหว่างเซสชัน ให้อัปเดตทั้ง URL Webhook ใน Twilio Console และ URL ที่ใช้ตรวจสอบให้ตรงกัน

เคล็ดลับการดีบักเฉพาะ Twilio

payload แบบ form-encoded

ต่างจาก Stripe หรือ GitHub Twilio ส่งข้อมูล application/x-www-form-urlencoded ตรวจสอบให้แน่ใจว่า handler parse body แบบฟอร์มได้ถูกต้อง ไม่ใช่แค่ JSON

การตอบกลับ TwiML

handler ของเสียงและ SMS ต้องคืนค่า XML TwiML ที่ถูกต้อง ทดสอบการจัดรูปแบบการตอบกลับบนเครื่องโลคัลก่อนที่ Twilio จะทำเครื่องหมายการส่งว่าล้มเหลว

พฤติกรรม timeout

Twilio คาดหวังการตอบกลับภายใน 15 วินาทีสำหรับ Webhook ส่วนใหญ่ handler ที่ช้าทำให้เกิดการลองใหม่และการส่งซ้ำ — ใช้ การรีเพลย์ Webhook เพื่อทดสอบการจัดการการลองใหม่

ห่วงโซ่คอลแบ็กสถานะ

ฟลว์ SMS มักเชื่อม Webhook ขาเข้ากับคอลแบ็กสถานะ ทดสอบทั้งสอง endpoint บนเครื่องโลคัลโดยตั้งค่า route หรือ path ของทันเนลแยกกัน

การทดสอบ Twilio บนเครื่องโลคัล กับ Twilio CLI

Twilio CLI สามารถจำลองคำขอขาเข้าด้วย twilio phone-numbers:update และปลั๊กอินทันเนลโลคัล ทันเนล localhost เฉพาะที่มีการจับคำขอให้การมองเห็นทุกคอลแบ็กอย่างต่อเนื่อง ความสามารถรีเพลย์ และเวิร์กโฟลว์ที่สเกลข้ามหลายผู้ให้บริการ ไม่ใช่แค่ Twilio

สำหรับรูปแบบการดีบัก Webhook ทั่วไป อ่าน วิธีดีบัก Webhook บนเครื่องโลคัล

เข้าร่วม waitlist ของ PortPreview สำหรับการทดสอบ Webhook ของ Twilio และหลายผู้ให้บริการจากทันเนลเดียว

คำถามที่พบบ่อย

จะทดสอบ Webhook ของ Twilio บน localhost ได้อย่างไร?
เริ่มทันเนล localhost ด้วย PortPreview ตั้งค่า URL Webhook ของหมายเลข Twilio เป็น URL HTTPS ของทันเนล แล้วส่ง SMS ทดสอบหรือโทรเพื่อทริกเกอร์คอลแบ็ก
Twilio ส่ง Webhook เป็น JSON หรือ form-encoded?
Twilio ส่ง payload แบบ application/x-www-form-urlencoded ไม่ใช่ JSON ตรวจสอบให้แน่ใจว่า handler โลคัล parse body แบบฟอร์มและตรวจสอบ header X-Twilio-Signature
ทำไมการตรวจสอบลายเซ็น Twilio จึงล้มเหลวเมื่อใช้ทันเนล?
ลายเซ็นของ Twilio รวม URL เต็มของคำขอ หากโค้ดตรวจสอบใช้ localhost แทน URL ทันเนล หรือ URL ทันเนลเปลี่ยนไป การตรวจลายเซ็นจะล้มเหลว