Xác minh webhook HMAC-SHA256 và chống replay 300 giây: code mẫu

Chuyện khách chuyển khoản xong mà đơn vẫn chờ thanh toán

Bạn có bao giờ nhận được tin nhắn kiểu “tiền em chuyển rồi mà sao chưa giao hàng?” chưa? Đội ngũ bên mình gặp chuyện này khá thường xuyên. Có lần, một cửa hàng phụ kiện nhà thông minh nhờ chúng tôi hỗ trợ. Họ phải mở sao kê ra dò từng dòng, mất gần cả buổi sáng chỉ để đối chiếu vài chục đơn.

Nghe thì nhỏ, nhưng chuyện này làm chậm cả chuỗi xử lý đơn. Người bán tốn công đối chiếu thủ công. Khách thì sốt ruột. Sự sốt ruột ấy rất dễ biến thành mất niềm tin, nhất là khi khách đã trả tiền mà vẫn phải chờ.

Thông thường có ba cách xử lý. Cách đầu là nhân viên đối chiếu bằng tay. Cách thứ hai là tự viết script đọc sao kê. Cách cuối là thuê một dịch vụ bên thứ ba lo việc này. Mỗi cách đều có chỗ hợp lý riêng, và dưới đây chúng ta sẽ đi qua từng cách.

Tự xây tích hợp hay thuê dịch vụ có sẵn

Tự xây nghĩa là bạn trực tiếp kết nối với ngân hàng. Bạn tự nhận tín hiệu tiền về và tự cập nhật trạng thái đơn hàng. Ưu điểm là bạn nắm toàn quyền. Nhược điểm là mọi lỗi, mọi lỗ hổng bảo mật và mọi sự cố kết nối đều thuộc trách nhiệm của bạn.

Thuê dịch vụ thì nhẹ gánh hơn nhiều. Nhà cung cấp lo phần kết nối ngân hàng, còn bạn chỉ nhận thông báo và xử lý đơn. Triển khai nhanh hơn hẳn. Đổi lại, khi họ gặp sự cố thì bạn cũng phải chờ họ khắc phục.

Vậy nên chọn hướng nào? Theo kinh nghiệm của đội ngũ, câu trả lời phụ thuộc vào ba điều: khối lượng giao dịch, việc bạn có người làm kỹ thuật hay không, và mức độ bạn thoải mái khi phụ thuộc vào bên ngoài.

Một số lựa chọn đang có trên thị trường Việt Nam

Hiện có vài cái tên được nhiều người nhắc tới như SePay, Casso và PayOS. Mỗi bên tính phí một kiểu và hỗ trợ danh sách ngân hàng khác nhau. Đừng chọn chỉ vì nghe quen tai.

Đội ngũ bên mình từng dùng thử MONA Pay một thời gian. Gói miễn phí cho 500 giao dịch mỗi tháng đủ để một cửa hàng nhỏ chạy thử nghiệm. Các gói trả phí có mức 99.000đ, 299.000đ, 799.000đ và 1.990.000đ. Điểm dễ chịu là không thu theo phần trăm giá trị đơn và không giữ tiền của người bán. Tuy nhiên, bảng giá có thể thay đổi, nên bạn nên xem thông tin mới nhất tại trang chính thức trước khi quyết định.

Dù chọn dịch vụ nào, hãy đối chiếu lại thông tin trước khi áp dụng. Giá và danh sách ngân hàng hỗ trợ thay đổi khá thường xuyên.

Điểm yếu của từng lựa chọn cần nhìn thẳng

Phần này nhiều người hay bỏ qua, nhưng theo kinh nghiệm của chúng tôi, đây lại là phần quan trọng nhất. Không có lựa chọn nào hoàn hảo, và mỗi hướng đều có cái giá riêng phải trả.

Khi dùng dịch vụ bên ngoài, sự cố phía họ cũng trở thành sự cố của bạn. Gói miễn phí thường có giới hạn, và khi lưu lượng tăng lên thì chi phí cũng tăng theo. Độ phủ ngân hàng cũng không đồng đều, nên hãy kiểm tra ngân hàng bạn đang nhận tiền có nằm trong danh sách hỗ trợ không.

Ngoài ra, dữ liệu giao dịch sẽ đi qua một bên thứ ba. Với doanh nghiệp có yêu cầu bảo mật cao, điều này cần được cân nhắc kỹ trước khi đưa vào vận hành.

Webhook và cách xác minh an toàn khi tự xây

Webhook là gì? Đơn giản, đó là một thông điệp mà ngân hàng hoặc đối tác gửi đến hệ thống của bạn mỗi khi có tiền về. Vấn đề là bất kỳ ai biết địa chỉ đó đều có thể gửi một thông điệp giả mạo. Vì vậy, bạn bắt buộc phải kiểm tra tính xác thực của nó.

Cách phổ biến nhất là xác minh chữ ký HMAC-SHA256. Bên gửi ký nội dung bằng một khóa bí mật. Phía bạn dùng đúng khóa đó để tính lại chữ ký và so khớp. Nếu khớp thì thông điệp là thật. Nếu không khớp thì loại bỏ ngay, không xử lý gì thêm.

Còn chống tấn công replay thì sao? Kẻ xấu có thể ghi lại một thông điệp hợp lệ rồi gửi lặp lại nhiều lần. Cách xử lý đơn giản là kiểm tra dấu thời gian trong thông điệp và chỉ chấp nhận những thông điệp trong vòng 300 giây. Quá thời gian đó thì bỏ qua.

Đừng quên lưu lại mã giao dịch đã xử lý. Webhook có thể được gửi lại nhiều lần vì lý do mạng hoặc hệ thống. Nếu không kiểm tra trùng lặp, tiền có thể bị cộng hai lần. Bạn có thể tham khảo code mẫu Node.js và PHP trong phần hướng dẫn xác minh webhook của API ngân hàng MONA Pay để đối chiếu với cách làm của mình.

Có một ví dụ thực tế. Một cửa hàng của khách từng bỏ qua bước chống replay. Kết quả là một thông điệp cũ bị gửi lại trong giờ cao điểm đã kích hoạt thêm một đơn hàng không có thật. Từ chuyện đó, đội ngũ luôn kiểm tra cả chữ ký lẫn dấu thời gian trước khi xử lý bất cứ điều gì.

Chi phí thực tế khi vận hành

Khi so sánh các phương án, đừng chỉ nhìn giá gói. Chi phí thật gồm ba phần: tiền dịch vụ theo gói và theo số giao dịch, chi phí nhân sự vận hành, và thời gian xử lý khi có lỗi xảy ra.

Cách ước lượng đơn giản là lấy số giao dịch dự kiến mỗi tháng nhân với mức phí của từng gói, rồi cộng thêm chi phí người làm nếu bạn tự xây. Có trường hợp tự xây rẻ hơn, nhưng cũng có trường hợp đắt hơn nhiều.

Những sai lầm hay gặp khi triển khai

Đội ngũ bên mình đã thấy nhiều nhóm vấp phải cùng một số lỗi. Phổ biến nhất là tin tưởng webhook mà không xác minh chữ ký. Kế đến là không xử lý trường hợp gửi lại nhiều lần, dẫn đến cộng tiền trùng.

Có nhóm chỉ thử nghiệm trên môi trường giả lập rồi đưa thẳng lên thật. Họ không làm đối soát, và phải đến khi số liệu lệch mới phát hiện ra vấn đề. Đây là bài học bạn nên tránh ngay từ đầu.

Lỗi cuối là không có kế hoạch dự phòng khi dịch vụ bên thứ ba gặp sự cố. Hãy tự hỏi trước: nếu hệ thống dừng hai ngày, bạn sẽ đối soát thủ công ra sao và ai sẽ làm việc đó?

Quy trình thử nghiệm trước khi bật cho khách thật

Đừng vội mở cho khách thật dùng ngay. Hãy bắt đầu bằng số tiền nhỏ và chuyển thử từ nhiều ngân hàng khác nhau. Mục tiêu là xác nhận mỗi ngân hàng đều được nhận đúng, đúng số tiền và đúng nội dung.

Sau khoảng một tuần, đối chiếu sao kê với hệ thống. Ghi lại hai chỉ số: tỷ lệ xác nhận đúng và thời gian xác nhận trung bình. Hai con số này sẽ cho bạn biết hệ thống đã đủ tin cậy để dùng thật hay chưa.

Câu hỏi thường gặp

Tự xây có an toàn hơn dùng dịch vụ bên thứ ba không?

Không hẳn. Tự xây chỉ an toàn khi bạn làm đúng bước xác minh chữ ký và chống replay. Nếu làm sơ sài, dịch vụ bên ngoài thường an toàn hơn vì họ đã có quy trình sẵn.

Gói miễn phí 500 giao dịch mỗi tháng có đủ cho cửa hàng nhỏ không?

Với nhiều cửa hàng nhỏ thì đủ. Nhưng hãy đếm lại số đơn chuyển khoản thật mỗi tháng trước khi quyết định, đừng ước chừng.

Webhook bị gửi lại thì xử lý thế nào?

Lưu mã giao dịch đã xử lý. Khi nhận lại đúng mã đó, bỏ qua và không cộng tiền thêm lần nữa.

Làm sao biết dịch vụ nào hỗ trợ ngân hàng của mình?

Xem danh sách ngân hàng trên trang chính thức của từng nhà cung cấp, sau đó thử chuyển khoản nhỏ để kiểm chứng thực tế.

This entry was posted in Uncategorized. Bookmark the permalink.