Khi checkout WooCommerce bị lỗi, cửa hàng trông như vẫn mở nhưng không ai thanh toán được. Nút “Place order” xoay mãi, một lỗi hiện ra, hoặc khách được báo không có phương thức thanh toán. Mỗi giờ trôi qua là doanh số thật bị mất, nên đáng để lần theo các nguyên nhân đúng thứ tự.
Hướng dẫn này gồm những kiểm tra mà chuyên viên WooCommerce của chúng tôi làm trước tiên. Hầu hết lỗi checkout chỉ do một vài nguyên nhân: bộ nhớ đệm, xung đột plugin hoặc theme, cài đặt cổng thanh toán, hoặc lỗi PHP.
Làm việc an toàn: hãy thử trên bản staging nếu hosting có, hoặc ít nhất sao lưu trước. Dùng chế độ test của cổng thanh toán để không tạo giao dịch thật khi đang kiểm tra.
Các triệu chứng thanh toán thường gặp và ý nghĩa của chúng
- Nút “Place order” xoay và không có gì xảy ra: lỗi JavaScript hoặc PHP, thường do xung đột plugin hoặc trang thanh toán bị cache.
- “There are no payment methods available”: cổng thanh toán bị tắt, bị giới hạn theo quốc gia hoặc tiền tệ, hoặc không tải được.
- “No shipping options were found”: vùng vận chuyển không bao phủ địa chỉ của khách.
- “Sorry, your session has expired”: vấn đề cache hoặc cookie trên trang giỏ hàng và thanh toán.
- Đã trừ tiền nhưng đơn vẫn “Pending payment”: cổng thanh toán không gọi được tới website của bạn để xác nhận (sự cố webhook hoặc IPN).
Bước 1: Đọc log của WooCommerce
Vào WooCommerce → Status → Logs. Tìm log tên fatal-errors và log từ cổng thanh toán của bạn (Stripe, PayPal và các cổng khác tự ghi log riêng). Log fatal error thường nêu đúng file plugin bị sập, giúp bạn đỡ mất hàng giờ.
Cũng mở WooCommerce → Status và kéo xuống cuối. WooCommerce liệt kê mọi outdated template files trong theme. Template thanh toán lỗi thời là nguyên nhân kinh điển khiến thanh toán hỏng sau bản cập nhật WooCommerce.
Bước 2: Kiểm tra console của trình duyệt
Mở trang thanh toán, nhấn F12 (hoặc chuột phải và chọn Inspect), rồi mở tab Console. Thử đặt một đơn thử. Lỗi màu đỏ ở đây cho thấy script bị hỏng. Tên file trong lỗi thường cho biết plugin nào gây ra.
Bước 3: Loại trang giỏ hàng, thanh toán và tài khoản khỏi cache
Trang giỏ hàng, thanh toán và My Account không bao giờ được phục vụ từ cache trang. Bản đã cache mang token bảo mật hết hạn và dữ liệu phiên của người mua khác, khiến thanh toán hỏng.
- Trong plugin cache (LiteSpeed Cache, WP Rocket, W3 Total Cache và các plugin tương tự), đảm bảo
/cart/,/checkout/và/my-account/được loại trừ. Hầu hết plugin làm điều này tự động, nhưng slug trang tùy chỉnh thì phải thêm bằng tay. - Nếu bạn dùng Cloudflare hoặc CDN khác có cache toàn trang, hãy thêm quy tắc bỏ qua cho cùng các trang đó và cho các request có cookie
woocommerce_items_in_cart. - Tắt tùy chọn “delay” hoặc “defer” của JavaScript cho script thanh toán nếu plugin tối ưu của bạn có các tùy chọn đó.
Bước 4: Kiểm tra xung đột plugin và theme
Cài plugin miễn phí Health Check & Troubleshooting và bật Troubleshooting Mode. Plugin này tắt các plugin và chuyển sang theme mặc định chỉ cho phiên trình duyệt của bạn, nên khách không bị ảnh hưởng.
- Chỉ bật WooCommerce và cổng thanh toán của bạn, rồi chuyển sang theme Storefront.
- Thử thanh toán. Nếu chạy được, vấn đề là plugin khác hoặc theme của bạn.
- Bật lại từng plugin một, thử thanh toán sau mỗi lần, cho đến khi hỏng lại.
Bước 5: Kiểm tra checkout block so với shortcode cổ điển
Cửa hàng WooCommerce mới dùng Checkout block theo mặc định. Một số cổng thanh toán cũ, trình chỉnh trường thanh toán và extension chỉ hỗ trợ checkout cổ điển. Nếu tính năng của extension bị thiếu hoặc thanh toán lỗi sau khi thêm extension, hãy xem tài liệu của nó về tương thích block.
Để chuyển lại checkout cổ điển, sửa trang Checkout và thay Checkout block bằng shortcode [woocommerce_checkout]. Làm tương tự với giỏ hàng bằng [woocommerce_cart] nếu cần.
Bước 6: Xem lại cài đặt cổng thanh toán
- Xác nhận cổng đang bật và chế độ test đã tắt trên website thật (và đang bật khi bạn kiểm tra).
- Nhập lại API key. Key của chế độ test không dùng được ở chế độ live, và ngược lại.
- Kiểm tra giới hạn quốc gia và tiền tệ. Một số cổng tự ẩn với loại tiền không được hỗ trợ.
- Kiểm tra webhook. Trong Stripe hoặc PayPal, đảm bảo URL webhook trỏ tới tên miền hiện tại (kể cả
https://) và các lần gửi gần đây đều thành công. Webhook thất bại là lý do đơn kẹt ở “Pending payment”.
Nếu một phương thức thanh toán hoàn toàn không hiện ở trang thanh toán, xem hướng dẫn cổng thanh toán WooCommerce không hiện.
Bước 7: Kiểm tra vùng vận chuyển, SSL và lỗi PHP
- Vận chuyển: trong WooCommerce → Settings → Shipping, đảm bảo có vùng và phương thức cho mọi quốc gia bạn bán hàng. Vùng “Rest of the world” sẽ bắt phần còn lại.
- SSL: trang thanh toán phải tải hoàn toàn qua HTTPS. Cảnh báo mixed-content (hình hoặc script tải qua HTTP) có thể khiến trường thanh toán không tải được.
- Lỗi PHP: nếu các log ở trên trống, hãy bật debug log của WordPress (
WP_DEBUG_LOG) trong thời gian ngắn và thử đặt thêm một đơn thử.
Ngăn sự cố thanh toán
- Thử một đơn thật sau mỗi lần cập nhật WooCommerce, theme hoặc plugin thanh toán.
- Giữ các bản ghi đè template của theme luôn cập nhật, hoặc tránh ghi đè template thanh toán.
- Dùng website staging cho các bản cập nhật trên cửa hàng đông khách.
- Thiết lập giám sát uptime và đơn hàng để bạn biết sự cố trước khi khách phàn nàn.
Đang mất doanh số ngay lúc này? Dịch vụ WooCommerce Fix của chúng tôi xử lý sự cố checkout, giỏ hàng và thanh toán, rồi kiểm tra toàn bộ đường mua hàng. Giá cố định $45, được xác nhận trước khi chúng tôi bắt đầu, kèm Service Guarantee của chúng tôi. Yêu cầu sửa WooCommerce.
Câu hỏi thường gặp
Vì sao thanh toán hỏng sau một bản cập nhật?
Bản cập nhật WooCommerce, theme hoặc plugin thanh toán có thể khiến code cũ hoặc bản ghi đè template không còn tương thích. Trang WooCommerce → Status cho thấy template lỗi thời, còn log cho thấy fatal error.
Cache có thật sự làm hỏng thanh toán WooCommerce không?
Có. Trang thanh toán bị cache chứa token bảo mật đã hết hạn và có thể trộn phiên của người mua. Trang giỏ hàng, thanh toán và tài khoản luôn phải được loại khỏi cache trang.
Khách đã bị trừ tiền nhưng đơn hiện “Pending payment”. Chuyện gì đã xảy ra?
Nhà cung cấp thanh toán đã nhận tiền nhưng không thông báo được cho website của bạn. Hãy kiểm tra cài đặt webhook hoặc IPN của cổng và nhật ký gửi của nó, đồng thời đảm bảo không có plugin bảo mật hoặc tường lửa nào chặn các request đó.




