Webhook คืออะไร และทำไมระบบรับชำระเงินควรใช้
อ่าน 1 นาที
ไม่มีรูปภาพ
ถ้าคุณเคยให้เว็บของร้านวนถามระบบชำระเงินทุก ๆ ไม่กี่วินาทีว่า "ลูกค้าจ่ายหรือยัง" แล้วรู้สึกว่ามันเปลืองและช้า webhook คือคำตอบของปัญหานี้ บทความนี้อธิบายหลักการแบบเข้าใจง่าย และเน้นสิ่งที่ฝั่งผู้รับต้องระวังเพื่อให้ปลอดภัย
Webhook คืออะไร
Webhook คือการที่ระบบหนึ่งส่งคำขอ HTTP มาหาอีกระบบหนึ่งเองเมื่อมีเหตุการณ์เกิดขึ้น เปรียบเหมือนการให้ร้านขนส่งโทรบอกเมื่อพัสดุถึง แทนที่เราจะโทรถามทุกห้านาที ในงานชำระเงิน เมื่อสลิปของลูกค้าผ่านการตรวจ ระบบจะส่งเหตุการณ์ เช่น invoice.paid ไปยัง URL ที่ร้านกำหนดไว้
ทำไมระบบรับชำระควรใช้
| วิธี | ข้อดี | ข้อเสีย |
|---|---|---|
| วนถามสถานะ (polling) | ทำง่าย ไม่ต้องเปิดรับคำขอจากภายนอก | เปลืองทรัพยากร และมีความหน่วงตามรอบที่ถาม |
| Webhook | ได้ข่าวทันทีที่เหตุการณ์เกิด | ต้องป้องกัน endpoint ให้ดี และต้องรับมือกรณีส่งไม่ถึง |
| ผสมทั้งสอง | เร็วและมีตัวสำรอง | ต้องกันการประมวลผลซ้ำ |
ในทางปฏิบัติแนวทางที่ดีคือผสมกัน ใช้ webhook เป็นทางหลักเพื่อความเร็ว และมีงานตรวจตามรอบเป็นตัวสำรองเผื่อ webhook หายระหว่างทาง ปลั๊กอินของ PPay ใช้แนวทางนี้ คือ webhook ตอนลูกค้ากลับร้าน และงานตรวจทุก 5 นาที
ข้อควรระวังด้านความปลอดภัย
URL ของ webhook เป็นประตูที่เปิดรับคำขอจากอินเทอร์เน็ต ใครก็ลองยิงเข้ามาได้ ฝั่งผู้รับจึงต้องไม่เชื่อเนื้อหาที่ส่งมาทันที
1. ตรวจลายเซ็น
ผู้ส่งที่ดีจะแนบลายเซ็น (เช่นแบบ HMAC) ที่คำนวณจากเนื้อหาและความลับที่ใช้ร่วมกัน ฝั่งรับต้องคำนวณซ้ำและเทียบ หากไม่ตรงให้ปฏิเสธ ควรเปรียบเทียบด้วยฟังก์ชันที่ปลอดภัยต่อการโจมตีด้านเวลา
2. ตรวจเวลา
คำขอเก่าที่ถูกดักไว้แล้วส่งซ้ำ (replay) เป็นความเสี่ยงที่พบได้ ปลั๊กอินของ PPay ตรวจว่าเวลาของเหตุการณ์ไม่เก่าเกิน 5 นาที
3. ยืนยันซ้ำจากต้นทาง
แม้ลายเซ็นถูก ก็ควรเรียก API ไปอ่านสถานะจริงอีกรอบก่อนปล่อยของ และเทียบยอดว่าไม่น้อยกว่ายอดที่ต้องจ่าย วิธีนี้ทำให้ต่อให้ความลับรั่ว ผู้โจมตีก็ยังหลอกให้ร้านปล่อยของได้ยากขึ้น
4. ทำให้ประมวลผลซ้ำได้อย่างปลอดภัย
เหตุการณ์เดียวอาจมาถึงมากกว่าหนึ่งครั้ง เช่น ส่งซ้ำเพราะรอบแรกตอบช้า ระบบต้องออกแบบให้การทำซ้ำไม่ทำให้ตัดสต็อกสองครั้งหรือบันทึกยอดสองรอบ เช่น ใช้ล็อกหรือเช็กสถานะออเดอร์ก่อนทำงาน
5. อย่าเปิดเผยความลับ
Webhook Secret ต้องไม่อยู่ในโค้ดฝั่งเบราว์เซอร์หรือที่เก็บโค้ดสาธารณะ ดูแนวทางเพิ่มเติมได้ใน บทความเรื่องการจัดการ API key
ตอบกลับอย่างไรให้เหมาะสม
- ตอบรหัส 200 เมื่อรับและประมวลผลสำเร็จ
- ถ้าเหตุการณ์ไม่ใช่ของระบบคุณ ตอบ 200 แล้วข้ามได้ เพื่อไม่ให้ผู้ส่งลองใหม่ไม่รู้จบ
- ถ้าลายเซ็นไม่ถูกต้อง ให้ปฏิเสธด้วยรหัสในกลุ่ม 4xx
- ทำงานหนักแบบไม่รอ ให้ตอบเร็วแล้วไปประมวลผลต่อเบื้องหลัง
ข้อจำกัดที่ควรรู้กับ PPay
บัญชี PPay หนึ่งบัญชีตั้ง Webhook ได้ 1 URL หากคุณมีหลายเว็บ ควรเลือกเว็บหลักไว้รับ และให้เว็บอื่นพึ่งการตรวจตามรอบ ซึ่งปลั๊กอินของ PPay รองรับอยู่แล้ว
สรุป
Webhook ทำให้ร้านรู้เรื่องการชำระเงินเร็วขึ้น แต่ต้องมาพร้อมการตรวจลายเซ็น ตรวจเวลา และยืนยันซ้ำจากต้นทาง รายละเอียดรูปแบบเหตุการณ์และการตรวจลายเซ็นของ PPay ดูได้ที่ เอกสาร API หรือถ้าไม่อยากเขียนเอง ดูทางเลือกแบบปลั๊กอินที่ หน้าปลั๊กอิน