Webhook Reliability là cách bảo đảm website nhận và xử lý đúng thông báo tự động từ cổng thanh toán hoặc phần mềm khác. Thông báo không được bỏ sót, xử lý trùng hay làm sai trạng thái đơn hàng khi mạng bị gián đoạn.
Khách đã thanh toán nhưng đơn vẫn chờ? Không nên yêu cầu khách thanh toán lại. Hãy kiểm tra khoản thu và mã giao dịch tại nhà cung cấp thanh toán. Sau đó, nhờ đội kỹ thuật tra thông báo đã được gửi, nhận và xử lý đến bước nào.
Webhook là gì và vì sao đơn hàng có thể cập nhật chậm?
Webhook là thông báo một hệ thống chủ động gửi khi có sự kiện. Ví dụ, cổng thanh toán thông báo tiền đã vào, để website chuyển trạng thái đơn. Đường truyền có thể lỗi, hệ thống nhận bị quá tải hoặc bước cập nhật đơn không hoàn tất.
Ví dụ giả định: lúc 10 giờ khách chuyển tiền thành công, nhưng website vẫn để đơn ở trạng thái chờ. Nhân viên cần đối chiếu số tiền và mã giao dịch với đơn tương ứng. Không kết luận khách chưa trả tiền chỉ từ trạng thái đơn.
| Dấu hiệu | Hành động của chủ doanh nghiệp |
|---|---|
| Đã thu tiền nhưng đơn chưa xác nhận | Tra giao dịch từ nhà cung cấp, không thu lại |
| Đơn bị xử lý hai lần | Kiểm tra kho, email và giao hàng trước khi làm tiếp |
| Đơn có nhưng CRM chưa nhận | Ghi mã đơn, giờ xảy ra và yêu cầu đối chiếu |
| Gửi thông báo thất bại liên tục | Kiểm tra ai đang nhận cảnh báo và xử lý |

Webhook và API khác nhau ở điểm nào?
API giúp hai hệ thống trao đổi dữ liệu. Khi website chủ động hỏi tình trạng đơn, đó là gọi API. Với webhook, nhà cung cấp chủ động gửi thông báo đến website. Khi lỗi mạng, cùng một thông báo có thể được gửi nhiều lần.
Nhà cung cấp có thời gian và số lần gửi lại khác nhau. Vì thế, không dùng lịch của SePay hay Stripe để suy ra WooCommerce cũng hoạt động như vậy.
Webhook trả HTTP 200 có nghĩa đơn đã cập nhật đúng chưa?
Chưa chắc. HTTP 200 hoặc 2xx thường là phản hồi nhận thành công theo quy định của nơi gửi. Đơn hàng vẫn có thể đang chờ bước xử lý nền, hoặc bước cập nhật dữ liệu đã gặp lỗi.
Theo Stripe Webhooks, nơi nhận nên trả lời nhanh rồi xử lý việc nặng ở bước riêng. Để tránh mất dữ liệu, kỹ thuật cần ghi sự kiện hợp lệ vào nơi lưu bền vững trước khi báo đã nhận.
Dành cho kỹ thuật: sáu bước bảo vệ webhook
Bước 1. Xác minh nguồn gửi và chữ ký
Kiểm tra signature (chữ ký), HMAC, thời gian và nội dung gốc (raw body) nếu nhà cung cấp hỗ trợ. Xác minh loại sự kiện và hệ thống thử hoặc thật. Bảo vệ mã bí mật theo quy trình quản lý Secrets & API Key.
Không ghi token, mật khẩu hoặc dữ liệu thanh toán nhạy cảm vào log. Chữ ký không hợp lệ phải bị từ chối trước khi cập nhật đơn hoặc tài khoản.
Bước 2. Lưu sự kiện rồi phản hồi đã nhận
Lưu mã sự kiện, mã giao dịch, loại, nguồn và trạng thái. Sau khi ghi thành công vào nơi lưu an toàn, phản hồi xác nhận (acknowledgement) theo quy định nhà cung cấp.
Queue là hàng đợi xử lý công việc nền. Nhờ vậy nơi nhận không phải giữ kết nối trong lúc cập nhật đơn hoặc gửi email. Queue không tự bảo đảm dữ liệu được xử lý đúng.
Bước 3. Chống xử lý trùng và tác động lặp
Duplicate delivery là thông báo được gửi trùng. Idempotency bảo đảm xử lý lại cùng yêu cầu không tạo kết quả lặp (side effect) như trừ kho hay xác nhận thanh toán hai lần.
Dùng Event ID hoặc khóa giao dịch duy nhất. Phải kiểm tra và cập nhật trạng thái theo cách nguyên tử (atomic) để hai sự kiện đến đồng thời không cùng tạo đơn. AWS Builders’ Library phân tích rủi ro gửi lại yêu cầu.
Một giao dịch có thể sinh nhiều loại sự kiện và nhiều mã Event ID. Vì vậy, ngoài chống trùng từng sự kiện cần kiểm tra trạng thái nghiệp vụ thực tế.
Bước 4. Không để sự kiện cũ ghi đè trạng thái mới
Out-of-order là sự kiện đến sai thứ tự. Ví dụ, thông báo cập nhật cũ đến sau khi đơn đã thanh toán. Kỹ thuật cần kiểm tra loại sự kiện, phiên bản và trạng thái mới nhất trước khi thay đổi dữ liệu.
Theo Shopify và Stripe, không thể mặc định webhook luôn đến đúng thứ tự. Có thể phải tra cứu trạng thái tại hệ thống nguồn trước khi áp dụng thay đổi.
Bước 5. Thử lại có giới hạn và quản lý hàng đợi lỗi
Retry là thử lại sau lỗi tạm thời như timeout hoặc máy chủ quá tải. Nên tăng thời gian chờ giữa các lần thử (backoff) và đặt giới hạn. Không gửi lại vô hạn khi chữ ký sai.
Dead-letter queue giữ các thông báo chưa thể xử lý. Theo dõi queue depth (số thông báo chờ), oldest message (lần chờ lâu nhất), số lần thử và người chịu trách nhiệm.
Nếu công việc nền dừng, xem giám sát Cron và Background Job. Không chỉ theo dõi số lần nhận webhook mà bỏ qua thời gian xử lý.

Bước 6. Chạy lại có kiểm soát và đối soát dữ liệu
Replay là gửi hoặc xử lý lại sự kiện đã có. Chỉ làm sau khi đối chiếu trạng thái hiện tại, tránh trùng và có người phê duyệt. Phát lại sai có thể tạo thêm email, trừ kho hoặc cập nhật đơn nhầm.
Reconciliation là đối soát dữ liệu ở nguồn và đích để phát hiện thiếu, trùng hoặc sai trạng thái. Xem Data Reconciliation website, CRM và ERP. Kể cả khi retry hoạt động, hệ thống vẫn cần cách phát hiện sự kiện bị bỏ lỡ.
Quy định gửi lại có khác nhau giữa các nhà cung cấp không?
Có. SePay công bố lịch retry riêng theo tùy chọn cấu hình. Stripe có quy tắc khác; gửi lại thủ công không nhất thiết hủy lịch thử tự động. Đọc đúng tài liệu phiên bản đang sử dụng.
WooCommerce có thể vô hiệu hóa webhook gửi đi khi gặp nhiều lần lỗi liên tiếp. Cần xem trạng thái và log của WooCommerce. Phải phân biệt webhook do cửa hàng gửi đi và thông báo thanh toán cửa hàng nhận vào.
Cần giám sát sự kiện bằng những thông tin nào?
- Mã giao dịch, Event ID, loại và nhà cung cấp gửi.
- Thời điểm nhận, kết quả kiểm tra chữ ký, HTTP status.
- Số lần retry, độ dài hàng đợi và nguyên nhân thất bại.
- Trạng thái đơn hoặc dữ liệu ở đích sau khi xử lý.
- Người nhận cảnh báo và Correlation ID để nối các bước khi cần.
Nhật ký không được chứa khóa bí mật, mật khẩu hoặc thông tin khách không cần thiết. Nếu có cảnh báo, phải có người kiểm tra kết quả nghiệp vụ chứ không chỉ xem mã HTTP.
Checklist nghiệm thu Webhook Reliability
- Thử sự kiện có chữ ký đúng và sự kiện có chữ ký sai.
- Gửi cùng Event ID hai lần, xác nhận không xử lý trùng.
- Gửi hai sự kiện đồng thời, kiểm tra không có tác động lặp.
- Thử sự kiện out-of-order, không để dữ liệu cũ ghi đè.
- Giả lập timeout, thử retry và dead-letter queue.
- Đối soát nguồn–đích, thử replay trên môi trường thử.
Chủ doanh nghiệp cần bản nghiệm thu dễ hiểu. Hãy hỏi liệu có bỏ sót đơn, phát sinh xử lý trùng hoặc thiếu người nhận cảnh báo hay không. Không dùng thanh toán hoặc hoàn tiền thật để thử bừa.
Câu hỏi thường gặp
Khách đã thanh toán, có nên bảo khách trả lần nữa?
Không. Phải kiểm tra giao dịch tại nhà cung cấp và xác minh trạng thái đơn trước.
Có thể gửi lại webhook bất cứ lúc nào không?
Không. Phải kiểm tra đúng sự kiện, quyền gửi lại và biện pháp chống trùng.
Webhook trả mã HTTP 200 đã hoàn tất chưa?
Chưa chắc. Cần kiểm tra kết quả xử lý đơn, giao hàng hoặc dữ liệu đồng bộ.
Kết luận
Webhook đáng tin cậy phải xác thực, tránh trùng, thử lại an toàn và đối soát dữ liệu. Đây là một phần của Website Integration Reliability. Khi đơn chưa cập nhật, hãy xác nhận khoản thu trước khi tác động lại.
Đoàn Trình Dục là Giảng viên Khoa Công nghệ Thông tin tại Đại học Công nghệ Sài Gòn (STU), với hơn 10 năm kinh nghiệm thực chiến trong các lĩnh vực Mạng máy tính, Marketing Online, SEO và Bảo mật hệ thống.
Với nền tảng sư phạm và kinh nghiệm tư vấn cho nhiều doanh nghiệp, thầy chuyên sâu vào việc xây dựng các giải pháp kỹ thuật số toàn diện và hiệu quả.

