
สรุปคำตอบ
Webhook และ Callback คือกลไกที่ Payment Gateway ส่งผลการชำระเงินมาที่เว็บ WooCommerce โดยอัตโนมัติแบบเบื้องหลัง เพื่อให้เว็บอัปเดตสถานะ Order เป็น Processing หรือ Completed ได้เอง Callback URL คือ URL บนเว็บที่ให้ Gateway เก็บไว้ (เรียกอีกชื่อว่า IPN) ส่วน Webhook คือกลไกเดียวกันที่ระบบสมัยใหม่อย่าง Omise หรือ Stripe ใช้ Push Event แบบ Real-time ถ้า Webhook ล้มเหลว Order จะค้าง Pending แม้ลูกค้าจ่ายเงินแล้ว สาเหตุที่พบบ่อยคือ URL ตั้งผิด SSL มีปัญหา Firewall บล็อก หรือ WC-API ไม่ทำงาน
เมื่อลูกค้าจ่ายเงินผ่านเว็บ WooCommerce ของคุณ มีกระบวนการเบื้องหลังที่ทำงานอยู่ตลอดเวลาโดยที่คุณอาจไม่เคยสังเกตเห็น หนึ่งในนั้นคือ Webhook และ Callback ซึ่งเป็นกลไกสำคัญที่ทำให้ระบบชำระเงินรู้ว่าการโอนเงินสำเร็จหรือล้มเหลว และอัปเดตสถานะ Order ให้อัตโนมัติ ถ้าระบบนี้มีปัญหา คุณจะเจออาการเช่น ลูกค้าจ่ายเงินแล้วแต่ Order ยังค้างสถานะ “Pending” หรือไม่มีอีเมลยืนยันส่งออกไป ซึ่งเชื่อมโยงโดยตรงกับปัญหา WooCommerce Checkout ไม่ได้ กดสั่งซื้อไม่ทำงาน ที่พบบ่อยมากในไทย
Webhook และ Callback คืออะไร ต่างกันอย่างไร
ทั้งสองคำนี้หมายถึงการที่ระบบภายนอก (เช่น Payment Gateway) ส่งข้อมูลมาหาเว็บของคุณโดยอัตโนมัติ แต่มีความแตกต่างเล็กน้อย (ตามนิยามในเอกสาร Webhooks ของ Omise webhook คือ HTTP POST ที่ส่งจากเซิร์ฟเวอร์ของ Gateway ไปยัง HTTPS endpoint ที่คุณกำหนดเมื่อเกิดเหตุการณ์ในบัญชี):
- Callback URL คือ URL บนเว็บคุณที่คุณส่งให้ Payment Gateway เก็บไว้ เมื่อธุรกรรมเสร็จสิ้น Gateway จะ POST ข้อมูลผลการชำระเงินมาที่ URL นี้ทันที เรียกอีกชื่อว่า IPN (Instant Payment Notification) ส่วน Return URL เป็นคนละอย่าง คือหน้าที่ลูกค้าถูกพากลับมาหลังจ่ายเงิน ฝั่ง WooCommerce การรับ callback ทำผ่าน hook แบบ WC-API ตามคู่มือ Payment Gateway API ของ WooCommerce
- Webhook คือกลไกเดียวกัน แต่มักใช้กับระบบที่ทันสมัยกว่า เช่น Omise, Stripe หรือ 2C2P โดย Gateway จะ Push เหตุการณ์ (Event) ต่าง ๆ มาให้เว็บคุณแบบ Real-time
ใน WooCommerce ปลั๊กอิน Omise รุ่นปัจจุบันรับ webhook ที่ REST route https://yoursite.com/wp-json/omise/webhooks (URL นี้แสดงในช่อง Webhook endpoint ของหน้า Settings ของปลั๊กอิน ดูซอร์สโค้ดหน้าตั้งค่า และซอร์สโค้ดของ route) ส่วนรูปแบบ wc-api ที่พบในคู่มือเก่าคือ https://yoursite.com/?wc-api=WC_Gateway_Paypal ส่วน URL ของปลั๊กอิน PromptPay เจ้าอื่นต่างกันไปตามปลั๊กอิน ให้คัดลอกจากหน้าตั้งค่าของปลั๊กอินนั้นโดยตรง

ทำไม Webhook ถึงล้มเหลว — สาเหตุที่พบบ่อย
เมื่อ Webhook ไม่ทำงาน ผลคือ Order ค้าง Pending ไม่อัปเดตเป็น Processing หรือ Complete ซึ่งสาเหตุหลักมีดังนี้:
- URL ไม่ถูกต้อง — ตั้งค่า Callback URL ผิดใน Dashboard ของ Payment Gateway เช่น URL มี typo หรือลืมใส่ https
- SSL/TLS ไม่ถูกต้อง — Omise กำหนดให้ endpoint ของ webhook เป็น HTTPS ที่มี SSL Certificate ถูกต้อง (เอกสาร Webhooks ของ Omise) Gateway เจ้าอื่นควรเช็กในเอกสารของเจ้านั้น หาก Certificate หมดอายุหรือ Self-signed อาจถูกปฏิเสธ
- Firewall หรือ Security Plugin บล็อก — Wordfence หรือ Cloudflare อาจตีความ Request จาก Gateway ว่าเป็น Bot แล้วบล็อก IP ซึ่ง Omise เผยแพร่ IP ของเซิร์ฟเวอร์ webhook ไว้ในเอกสารเพื่อให้นำไป allowlist
- เว็บล่มหรือช้าเกินไป — ถ้าเว็บตอบสนองช้ากว่า Timeout ของ Gateway Webhook จะถูกมองว่า Failed Stripe แนะนำให้ endpoint ตอบ 2xx ทันทีก่อนทำงานหนัก ส่วน Omise ระบุว่าการตอบที่ไม่ใช่ 2xx อาจถูกนับเป็นส่งไม่สำเร็จ และไม่รับประกันการส่งซ้ำอัตโนมัติ
- WC-API ไม่ทำงาน — Permalink ไม่ได้ตั้งค่า หรือ REST API ถูก Disable โดยปลั๊กอิน ทำให้ URL
/?wc-api=...ไม่ตอบสนอง
วิธีตรวจสอบ Webhook/Callback เบื้องต้น
ก่อนแก้ไข ให้ตรวจสอบว่าปัญหาอยู่ที่ไหนก่อน:
- ดู WooCommerce Order Notes — เข้า WooCommerce > Orders > เปิด Order ที่มีปัญหา > ดูส่วน “Order Notes” ด้านขวา ถ้าไม่มีบันทึกใด ๆ จาก Gateway แสดงว่า Webhook ยังไม่เคยเข้ามาถึงเว็บ
- เช็ค WooCommerce Status Log — ไปที่ WooCommerce > Status > Logs เลือก Log ของ Plugin ชำระเงินที่ใช้ (เช่น omise, gbprimepay) ซึ่งตามคู่มือ Logging ของ WooCommerce ไฟล์ Log แยกตามแหล่งที่มาและวันที่ จะเห็น Request/Response ที่รับมา
- ทดสอบ Callback URL ด้วย Browser — ถ้า Gateway รับ callback ผ่าน wc-api ให้เปิด URL เช่น
https://yoursite.com/?wc-api=WC_Gateway_Paypalในเบราว์เซอร์ ถ้าได้ Error 404 แสดงว่า WC-API ไม่ทำงาน (route ของ Omise คือ/wp-json/omise/webhooksซึ่งรับคำขอแบบ POST จึงให้ดูผลการส่งใน Dashboard ของ Omise แทนการเปิดด้วยเบราว์เซอร์) ให้ไป Settings > Permalinks > Save เพื่อ Flush Rewrite Rules - ตรวจสอบ Gateway Dashboard — เข้า Portal ของ Omise, GBPrimePay หรือ 2C2P แล้วดูหัวข้อ Webhook Events หรือ Transaction Log จะเห็นว่า Gateway ส่ง Webhook ออกไปหรือยัง และได้ Response อะไรกลับ
หากปัญหาอยู่ที่ Order ไม่อัปเดตสถานะ แนะนำให้อ่านต่อที่ Omise / Opn Payment ไม่อัปเดตสถานะ Order ทำยังไง ซึ่งครอบคลุมกรณีนี้โดยตรง

วิธีแก้ไขปัญหา Webhook ทีละขั้นตอน
1. Flush Permalink
ไป WordPress Admin > Settings > Permalinks > กดปุ่ม “Save Changes” โดยไม่ต้องเปลี่ยนค่าอะไร วิธีนี้บังคับให้ WordPress สร้าง Rewrite Rules ใหม่ ซึ่งเอกสารของ WordPressระบุว่าแค่เปิดหน้า Permalinks ก็เป็นการ flush ให้แล้ว วิธีนี้แก้ปัญหา 404 บน WC-API ได้ในหลายเคสที่เราเจอ
2. ตรวจสอบและอัปเดต Callback URL ใน Gateway
เปิด Plugin Settings ของ Payment Gateway ใน WooCommerce (WooCommerce > Settings > Payments) แล้วคัดลอก Webhook URL หรือ Callback URL ที่ระบุไว้ จากนั้นเข้า Portal ของ Gateway แล้วตรวจสอบว่า URL ที่บันทึกไว้ตรงกันทุกตัวอักษร
3. Whitelist IP ของ Gateway ใน Firewall
ถ้าใช้ Wordfence หรือ Cloudflare ให้ค้นหา IP Range ของ Gateway (มักระบุไว้ใน Documentation ของ Gateway) แล้ว Whitelist ไว้ใน Firewall Rules เพื่อป้องกันไม่ให้ Webhook ถูกบล็อก ถ้าเปิด Bot Fight Mode บน Cloudflare อยู่ Cloudflare ระบุว่าข้ามด้วยกฎ WAF ไม่ได้ ต้องใช้ Super Bot Fight Mode ที่รองรับกฎแบบ Skip แทน
4. ทดสอบด้วย Webhook.site
ไปที่ webhook.site แล้วคัดลอก URL ชั่วคราวที่สร้างให้ นำไปใส่เป็น Callback URL ในระบบ Gateway แทน จากนั้นลองทำ Test Transaction ดู ถ้า Webhook มาถึง Webhook.site แปลว่า Gateway ส่งได้ปกติ แต่ปัญหาอยู่ที่เว็บของคุณ
5. ตรวจสอบ PHP Error Log
ให้เปิด Debug Log ตามคู่มือ Debugging in WordPress โดยเพิ่มบรรทัดนี้ใน wp-config.php:
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true);
แล้วดูไฟล์ wp-content/debug.log เพื่อหา PHP Fatal Error ที่เกิดขึ้นเมื่อ Webhook เข้ามา
ปัญหา Webhook มักส่งผลต่อ WooCommerce Order ไม่เข้า และ WooCommerce Email ไม่ส่ง ไปพร้อมกัน เพราะทั้งสองอย่างนี้ถูก Trigger จากเหตุการณ์เดียวกันคือการเปลี่ยนสถานะ Order
การป้องกันปัญหา Webhook ในระยะยาว
- ต่ออายุ SSL Certificate ก่อนหมด และทดสอบว่า HTTPS ทำงานถูกต้องเสมอ
- หลังอัปเดต WordPress, WooCommerce หรือ Plugin ชำระเงิน ให้ทำ Test Transaction จริงทุกครั้ง
- ตั้ง Monitoring เว็บ (เช่น UptimeRobot) เพื่อให้รู้ทันทีเมื่อเว็บล่ม ซึ่งจะทำให้ Webhook Miss
- เปิด Log ของ Plugin ชำระเงินไว้ตลอด แล้วเข้าไปตรวจสอบสัปดาห์ละครั้ง
- ถ้ามีปัญหาเรื่อง Performance ให้แก้ไขด้วย เพราะ Cart และ Checkout ที่โหลดช้า อาจทำให้ Webhook Timeout ได้เช่นกัน
เมื่อไหร่ควรเรียกผู้เชี่ยวชาญ
ถ้าคุณทำตามขั้นตอนข้างต้นครบแล้วแต่ปัญหายังไม่หาย หรือถ้า Gateway Log แสดงว่าส่ง Webhook สำเร็จ (Status 200) แต่ Order ยังไม่อัปเดต อาจมีปัญหาเชิงลึกในระดับ PHP หรือ Database Transaction ที่ต้องการการตรวจสอบโดยตรง ทีม บริการแก้ปัญหา WooCommerce ของเราพร้อมช่วยตรวจสอบ Webhook Log, Config และ Server Environment ให้ครบถ้วนภายในวันเดียว
คำถามที่พบบ่อย
Webhook กับ Return URL ต่างกันอย่างไร?
Return URL คือหน้าที่ลูกค้าถูก Redirect กลับมาหลังจ่ายเงิน ส่วน Webhook (หรือ Callback URL) คือ URL ที่ Gateway ส่งข้อมูลผลธุรกรรมมาให้เว็บโดยตรงแบบเบื้องหลัง ไม่เกี่ยวกับการกระทำของลูกค้า ดังนั้นแม้ลูกค้าปิดเบราว์เซอร์ก่อนถูก Redirect Webhook ก็ยังทำงานได้ตามปกติ
Order ค้าง Pending หมายความว่า Webhook ล้มเหลวเสมอไปหรือเปล่า?
ไม่เสมอไป Order ค้าง Pending อาจเกิดจากลูกค้ากดยกเลิกการชำระ, การเชื่อมต่อหลุดกลางคัน, หรือการตั้งค่า Payment Method ให้ใช้ Manual Payment อยู่แล้ว แต่ถ้าลูกค้าจ่ายเงินสำเร็จและตัดเงินออกไปแล้ว Order ยังค้าง Pending นั่นมักเป็นสัญญาณชัดว่า Webhook มีปัญหา
ทดสอบ Webhook ได้อย่างไรโดยไม่ต้องจ่ายเงินจริง?
Payment Gateway ส่วนใหญ่มี Sandbox หรือ Test Mode ให้ใช้งาน เพียงสลับปลั๊กอินไปโหมด Test แล้วใช้ Test Card หรือ Test QR ที่ Gateway กำหนด จากนั้นดูผลใน WooCommerce Order Notes และ Gateway Dashboard เพื่อยืนยันว่า Webhook ส่งและรับสำเร็จ
Cloudflare ทำให้ Webhook พัง ได้จริงหรือ?
ได้จริง Cloudflare มี Bot Fight Mode และ WAF Rules ที่อาจบล็อก Request จาก IP ของ Payment Gateway ได้ Bot Fight Mode ตั้งข้ามด้วย WAF Rule ไม่ได้ ถ้าเปิดอยู่ให้ปิดแล้วทดสอบใหม่ ถ้าใช้ Super Bot Fight Mode หรือ WAF Rules ให้สร้าง Custom Rule แบบ Skip สำหรับ URL ของ Webhook เช่น URI Path contains wc-api
ลูกค้าจ่ายเงินแล้วแต่ Order ยังค้าง Pending แก้ยังไง?
เริ่มจากดู Order Notes และ WooCommerce → Status → Logs ว่ามีข้อมูลจาก Gateway เข้ามาหรือไม่ จากนั้นกด Save Changes ที่ Settings → Permalinks เพื่อ Flush Rewrite Rules ตรวจว่า Callback URL ใน Portal ของ Gateway ตรงกับที่ Plugin ระบุ และ Whitelist IP ของ Gateway ใน Firewall
Webhook ล้มเหลวทำให้อีเมลยืนยันคำสั่งซื้อไม่ส่งได้ไหม?
ได้ เพราะอีเมลยืนยันของ WooCommerce ถูก Trigger จากการเปลี่ยนสถานะ Order เมื่อ Webhook ไม่เข้ามา สถานะไม่เปลี่ยน อีเมลจึงไม่ถูกส่งไปด้วย
แหล่งอ้างอิง
- Omise. (ม.ป.ป.). Webhooks. สืบค้นเมื่อ 3 พฤศจิกายน 2026, จาก https://docs.omise.co/api-webhooks
- Omise. (ม.ป.ป.). class-omise-rest-webhooks-controller.php (ซอร์สโค้ดปลั๊กอิน Omise for WooCommerce). สืบค้นเมื่อ 3 พฤศจิกายน 2026, จาก https://github.com/omise/omise-woocommerce/blob/master/includes/class-omise-rest-webhooks-controller.php
- Omise. (ม.ป.ป.). omise-page-settings.php (ซอร์สโค้ดปลั๊กอิน Omise for WooCommerce). สืบค้นเมื่อ 3 พฤศจิกายน 2026, จาก https://github.com/omise/omise-woocommerce/blob/master/includes/admin/views/omise-page-settings.php
- WooCommerce. (ม.ป.ป.). Payment Gateway API. สืบค้นเมื่อ 3 พฤศจิกายน 2026, จาก https://developer.woocommerce.com/docs/features/payments/payment-gateway-api/
- Stripe. (ม.ป.ป.). Webhooks. สืบค้นเมื่อ 3 พฤศจิกายน 2026, จาก https://docs.stripe.com/webhooks
- Cloudflare. (ม.ป.ป.). Get started with Bot Fight Mode. สืบค้นเมื่อ 3 พฤศจิกายน 2026, จาก https://developers.cloudflare.com/bots/get-started/bot-fight-mode/
- Cloudflare. (ม.ป.ป.). Configure a custom rule with the Skip action. สืบค้นเมื่อ 3 พฤศจิกายน 2026, จาก https://developers.cloudflare.com/waf/custom-rules/skip/
- WordPress.org. (ม.ป.ป.). Settings Permalinks Screen. สืบค้นเมื่อ 3 พฤศจิกายน 2026, จาก https://wordpress.org/documentation/article/settings-permalinks-screen/
- WordPress.org. (ม.ป.ป.). Debugging in WordPress. สืบค้นเมื่อ 3 พฤศจิกายน 2026, จาก https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/
- WooCommerce. (ม.ป.ป.). Logging. สืบค้นเมื่อ 3 พฤศจิกายน 2026, จาก https://developer.woocommerce.com/docs/best-practices/data-management/logging/
