การทดสอบ Webhook ของ Stripe บนเครื่องโลคัล ช่วยให้คุณตรวจสอบ handler ของเหตุการณ์การชำระเงินบนเครื่องตัวเองก่อนปล่อยขึ้นโปรดักชัน คุณรันแอปบนเครื่องโลคัล เปิดให้เข้าถึงผ่าน URL HTTPS สาธารณะ และรับเหตุการณ์ทดสอบจริงของ Stripe โดยที่การตรวจสอบลายเซ็นยังทำงานครบถ้วน
ทำไม Webhook ของ Stripe จึงต้องมี URL สาธารณะ
Stripe ส่งเหตุการณ์ Webhook ผ่านอินเทอร์เน็ตสาธารณะไปยัง URL ปลายทางที่ตั้งค่าไว้ ที่อยู่อย่าง 127.0.0.1:3000 เซิร์ฟเวอร์ของ Stripe เข้าถึงไม่ได้ การพัฒนาบนเครื่องโลคัลจึงต้องมีตัวเชื่อม ทันเนล localhost จะแมป URL HTTPS สาธารณะเข้ากับโพรเซสบนเครื่องของคุณโดยไม่ต้องแก้เราเตอร์หรือไฟร์วอลล์
สิ่งที่ต้องเตรียมก่อนทดสอบ
- บัญชี Stripe ในโหมดทดสอบ
- แอปบนเครื่องโลคัลที่มี route สำหรับ Webhook (เช่น
/api/webhooks/stripe) - Webhook signing secret ของ Stripe ที่ตั้งไว้ในตัวแปรสภาพแวดล้อม
- เครื่องมือทันเนลที่รักษา header ของคำขอไว้สำหรับการตรวจสอบลายเซ็น
ทีละขั้นตอน: ทดสอบ Webhook ของ Stripe บนเครื่องโลคัลด้วย PortPreview
- รันแอปพลิเคชันบนเครื่องโลคัลที่พอร์ตที่ต้องการ
- รัน
npx portpreview 3000เพื่อสร้าง URL HTTPS สาธารณะ - ใน Stripe Dashboard ไปที่ Developers → Webhooks แล้วเพิ่ม URL ทันเนลพร้อม path ของ Webhook
- เลือกเหตุการณ์ที่ต้องการทดสอบ (เช่น
checkout.session.completed,invoice.paid) - ส่งเหตุการณ์ทดสอบจาก Dashboard หรือ CLI ของ Stripe แล้วตรวจดูการส่งแต่ละครั้ง
- ยืนยันว่า handler ตอบกลับ 2xx และการตรวจสอบลายเซ็นผ่าน
PortPreview บันทึก header, body และสถานะการตอบกลับ ทำให้คุณดีบักการส่งที่ล้มเหลวได้โดยไม่ต้องเดาจาก log ของเซิร์ฟเวอร์เพียงอย่างเดียว
ตรวจสอบลายเซ็น Webhook ของ Stripe บนเครื่องโลคัล
อย่าปิดการตรวจสอบลายเซ็นระหว่างพัฒนาเด็ดขาด Stripe เซ็นทุก payload ด้วย secret ของ Webhook คุณ และ handler ควรตรวจสอบ header Stripe-Signature ให้เหมือนกับบนโปรดักชันทุกประการ เครื่องมือทันเนลที่รักษา header เดิมไว้จะช่วยให้คุณทดสอบเส้นทางโค้ดจริง
ข้อผิดพลาดด้านลายเซ็นที่พบบ่อยระหว่างทดสอบโลคัล:
- ใช้ Webhook secret ผิดตัว (secret จาก Dashboard เทียบกับ secret จาก CLI)
- อ่าน body JSON ที่ parse แล้วก่อนการตรวจสอบ แทนที่จะใช้ body ดิบของคำขอ
- นาฬิกาคลาดเคลื่อนเกินช่วงที่ Stripe ยอมรับ
เหตุการณ์ที่ควรทดสอบบนเครื่องโลคัล
Checkout และการสมัครสมาชิก
ทดสอบ checkout.session.completed, customer.subscription.created และ invoice.payment_failed เพื่อยืนยันการจัดสรรสิทธิ์ การให้สิทธิ์เข้าถึง และตรรกะการทวงชำระ
ฟลว์ Connect และมาร์เก็ตเพลส
หากคุณใช้ Stripe Connect ให้ตรวจสอบเหตุการณ์อัปเดตบัญชีและการแจ้งเตือนการโอนด้วยบัญชีเชื่อมต่อทดสอบก่อนเปิดใช้งานจริง
Idempotency และการลองใหม่
Stripe จะลองส่งซ้ำเมื่อการส่งล้มเหลว ใช้ การรีเพลย์ Webhook เพื่อยืนยันว่า handler ประมวลผลเหตุการณ์ซ้ำได้อย่างปลอดภัย
Stripe CLI กับทันเนล localhost
Stripe CLI ส่งต่อเหตุการณ์ได้ด้วย stripe listen --forward-to ซึ่งเหมาะกับการตรวจสอบเร็วๆ ส่วนทันเนล localhost ให้ URL สาธารณะที่เสถียร นำไปวางใน Dashboard แชร์กับทีม และใช้ได้กับหลายผู้ให้บริการ ไม่ใช่แค่ Stripe หลายทีมใช้ทั้งสองอย่าง: CLI สำหรับการพัฒนาเร็วๆ และทันเนลสำหรับการทดสอบแบบ integration ที่สะท้อนการตั้งค่าโปรดักชัน
เมื่อไรควรย้ายจากโลคัลไป staging
การทดสอบโลคัลครอบคลุมตรรกะของ handler การ parse payload และการตรวจสอบลายเซ็น ให้ย้ายไป staging สำหรับการตรวจสอบเฉพาะสภาพแวดล้อม เช่น secret ที่จัดการแบบ managed การ migrate ฐานข้อมูล และ pipeline release แบบ end-to-end สำหรับงานฟีเจอร์การชำระเงินประจำวัน การทดสอบ Webhook ของ Stripe บนเครื่องโลคัลช่วยลดเวลาวนรอบจากนาทีเหลือวินาที
อ่านคู่มือฉบับเต็มเรื่อง การดีบัก Webhook บนเครื่องโลคัล หรือ เข้าร่วม waitlist ของ PortPreview สำหรับเวิร์กโฟลว์ทันเนลที่เน้น Webhook
