Lỗi tích hợp API ngân hàng vào website: tìm đúng bước, sửa đúng lỗi

Debug thanh toán theo từng bước

Những lỗi thường gặp khi tích hợp API ngân hàng vào website hiếm khi chỉ nằm ở một request sai. Khách có thể đã trả tiền nhưng đơn vẫn chờ, máy chủ đã nhận thông báo nhưng chưa ghi được dữ liệu, hoặc giao dịch bị xử lý hai lần sau một lần thử lại. Muốn sửa đúng, cần biết sự cố nằm ở nguồn, đường truyền, bước xác minh hay tác vụ nghiệp vụ.

Một cách điều tra hiệu quả là đi theo mã đơn và định danh nguồn qua từng điểm: yêu cầu được tạo, khách thanh toán, dữ liệu đến, xác minh xong, khoản thu được lưu và hành động sau thanh toán hoàn tất. Mỗi điểm cần bằng chứng riêng. Một dòng thành công trong log không thể đại diện cho toàn bộ chuỗi này.

HTTP thành công nhưng nghiệp vụ chưa hoàn tất

HTTP và nghiệp vụ là hai kết quả
HTTP và nghiệp vụ là hai kết quả

Mã HTTP mô tả kết quả trao đổi ở tầng giao thức; API còn có kết quả nghiệp vụ trong nội dung phản hồi. Ứng dụng phải đọc đúng đặc tả đang dùng, kiểm tra cấu trúc và các trường cần thiết trước khi cập nhật. Không nên chỉ thấy request trả 200 rồi lưu đơn đã thanh toán hoặc lấy một URL rỗng gửi cho khách.

Cũng cần tách tạo yêu cầu với nhận tiền. Một link được tạo thành công chỉ chứng minh yêu cầu thanh toán đã được tiếp nhận theo luồng tương ứng. Trong Collection Link V2 Pay2S, tạo link chưa đồng nghĩa hóa đơn đã phát hành. Nếu website gom tất cả thành một trạng thái thành công, người dùng và đội hỗ trợ sẽ dễ hiểu sai bước còn chờ.

Khi điều tra, ghi kết quả của từng bước với thời điểm và định danh, không chỉ một nhãn OK. Nếu yêu cầu chưa tạo được, xử lý ở luồng tạo. Nếu tiền đã có nhưng tác vụ phía sau lỗi, tiếp tục tác vụ đó. Chạy lại toàn bộ từ đầu thường che nguyên nhân và có thể tạo yêu cầu hoặc hành động trùng.

Sai chữ ký thường bắt đầu từ dữ liệu được biến đổi

Chữ ký đúng cần dữ liệu đúng
Chữ ký đúng cần dữ liệu đúng

Chữ ký phải được tạo và kiểm tra theo đúng bộ khóa, thứ tự trường và cách biểu diễn mà tài liệu quy định. Một chương trình có thể dùng đúng thuật toán nhưng vẫn sai vì dùng khóa cửa hàng khác, thêm xuống dòng, định dạng số với dấu phân cách hoặc lấy chuỗi của luồng tạo đơn để kiểm tra callback.

Đặc tả IPN Pay2S phân biệt chữ ký IPN với các luồng khác. Khi debug, đối chiếu tên trường và giá trị thực nhận bằng dữ liệu thử, giữ nguyên thông tin cần xác minh trước khi chuẩn hóa cho nghiệp vụ. Không in Secret Key vào log để so sánh, và không gửi khóa qua nhóm hỗ trợ.

Với dữ liệu hóa đơn, kiểm tra UTF-8 và quá trình mã hóa theo đặc tả V2. Mã hóa thêm một lần hoặc chuyển đổi ký tự trước khi ký có thể làm dữ liệu khác với phía nhận. Hãy thử tên và nội dung tiếng Việt ngay từ đầu; một bộ dữ liệu toàn ký tự ASCII dễ che lỗi chỉ xuất hiện khi chạy thật.

Điểm cần kiểm tra tiếp là kiểu tiền và trường rỗng. Số và chuỗi số có thể được xử lý khác giữa thư viện, backend và cơ sở dữ liệu. Đừng tự thêm ký hiệu tiền hoặc đổi giá trị rỗng nếu nó còn tham gia xác minh. Sau khi kiểm tra nguồn xong, lớp nghiệp vụ mới chuyển về kiểu dữ liệu nội bộ đã thống nhất.

Đơn vị thời gian cũng cần đọc theo từng luồng. Tài liệu Pay2S hiện phân biệt timestamp của IPN và redirect, nên không nên dùng một hàm chuyển đổi theo giả định chung cho mọi trường. Một giá trị bị hiểu sai có thể thành ngày không hợp lý hoặc rơi khỏi khoảng đối soát. Giữ giá trị nguồn và kiểm tra riêng đơn vị, múi giờ, định dạng trước khi đưa vào báo cáo.

Timeout không có nghĩa yêu cầu chưa được xử lý

Timeout để lại kết quả chưa biết
Timeout để lại kết quả chưa biết

Máy khách có thể ngừng chờ trong khi máy chủ đã tiếp nhận và lưu yêu cầu. Nếu ứng dụng lập tức tạo yêu cầu mới với định danh khác, một thao tác người dùng có thể thành nhiều đơn thanh toán. Cần lưu yêu cầu đang xử lý, phân biệt kết quả chưa biết và thất bại đã được xác nhận.

Cách tra cứu hoặc gửi lại phụ thuộc API cụ thể. Trước khi thiết kế retry, xác nhận quy tắc định danh, khả năng truy vấn kết quả và chính sách chống trùng của dịch vụ. Không tự coi mọi POST là an toàn để gọi lại, cũng không giả định đổi request ID sẽ khắc phục một lỗi mạng mà không tạo tác dụng phụ.

Ở phía website, vô hiệu hóa thao tác gửi lặp trong lúc xử lý là một lớp hỗ trợ, nhưng backend vẫn phải bảo vệ khi có hai request đồng thời. Người dùng có thể tải lại trang hoặc dùng hai thiết bị. Quy tắc phải nằm ở dữ liệu và trạng thái xử lý, thay vì chỉ trông vào một nút bấm được khóa trên giao diện.

Trang cảm ơn hiển thị thành công trước khi máy chủ xác nhận

Một lỗi nguy hiểm là lấy tham số URL hoặc thao tác phía trình duyệt làm căn cứ duy nhất để cấp sản phẩm. Dữ liệu khách gửi cần được xác minh; người mua cũng có thể đóng trang trước khi quay lại. Website phải có cách cập nhật kết quả ở máy chủ theo đặc tả luồng đã tích hợp, rồi để giao diện đọc trạng thái đã lưu.

Tài liệu Payment Notification Pay2S nêu vai trò hiển thị của redirect và hướng cập nhật bền vững qua máy chủ. Bài phân biệt redirect với IPN trên hoadontudong.com.vn giúp đội sản phẩm và kỹ thuật thống nhất điều này.

Giao diện nên thể hiện trạng thái đang xác nhận khi chưa có kết quả đáng tin. Nếu tiền đã được nhận nhưng đơn chưa cập nhật, cần thông tin tra cứu để hỗ trợ, không bảo khách chuyển lại toàn bộ. Kiểm tra cả việc người dùng quay lại trước thông báo máy chủ và thông báo đến khi người dùng đã rời trang.

Webhook tới được nhưng kết quả vẫn mất

Lưu bền vững rồi tiếp tục
Lưu bền vững rồi tiếp tục

Endpoint có thể nhận request rồi lỗi khi ghi dữ liệu, hoặc phản hồi thành công trước khi lưu bền vững. Với tác vụ bất đồng bộ, cần lưu yêu cầu và trạng thái đủ để tiếp tục sau khi tiến trình dừng. Nếu chỉ đưa công việc vào bộ nhớ rồi trả thành công, lần khởi động lại có thể làm mất tác vụ.

Ngược lại, xử lý quá nhiều công việc trước khi phản hồi dễ tạo timeout và lần gửi lại. Đội triển khai cần đọc yêu cầu phản hồi của đúng nguồn, lưu phần cần thiết rồi theo dõi các tác vụ dài ở hàng đợi. Việc nguồn thấy phản hồi thành công không thay thế kiểm tra kết quả giao hàng, cấp quyền hoặc ghi ERP.

Khi không thấy thông báo, kiểm tra URL thực tế, HTTPS, DNS, đường dẫn, quyền truy cập và tầng proxy. Một endpoint hoạt động từ máy lập trình chưa chắc được nguồn gọi tới trong môi trường thật. Nhật ký cần tách không đến được máy chủ với đã đến nhưng bị từ chối xác thực hoặc lỗi xử lý.

Hướng dẫn nhận webhook giao dịch ngân hàng giúp chuẩn bị điểm quan sát đầu vào. Đừng thử sửa bằng cách tắt xác thực hoặc mở quyền rộng khi chưa biết nguyên nhân. Dùng môi trường thử và thông tin lỗi đã che dữ liệu để xác định lớp đang chặn request.

Hai tiến trình cùng xác nhận một giao dịch

Kiểm tra giao dịch chưa tồn tại rồi ghi sau đó có thể thất bại khi hai tiến trình làm đồng thời. Cả hai đều thấy chưa có và cùng chạy tác vụ. Ràng buộc duy nhất cùng thao tác dữ liệu nhất quán giúp chọn một lần ghi hợp lệ. Các lần nhận tiếp theo cần biết trạng thái trước để tiếp tục hoặc phản hồi, không cộng lại khoản thu.

Tác vụ phía sau cũng cần khóa theo nghiệp vụ. Một giao dịch không được ghi hai lần nhưng chương trình giao hàng vẫn có thể tạo hai lệnh nếu mỗi lần thử lại dùng mã mới. Bài vận hành và chống xử lý trùng bổ sung cách nhìn từ khoản thu tới tác vụ cuối.

Cũng phải phân biệt bản tin lặp với hai khoản chuyển thật. Khóa chỉ theo số tiền sẽ làm mất giao dịch của khách khác; khóa chỉ theo mã đơn có thể bỏ khoản trả thêm hợp lệ. Thiết kế cần định danh giao dịch nguồn và bảng phân bổ riêng, rồi quyết định hành động ở cấp đơn theo quy tắc được phép.

Dùng nhật ký điều tra thay vì đoán theo màn hình

Log tối thiểu nên nối mã đơn nội bộ, định danh nguồn, bước xử lý, thời điểm và mã lỗi phù hợp. Dữ liệu nhạy cảm cần được che và quyền xem được giới hạn. Không ghi toàn bộ body mặc định nếu có thông tin cá nhân hoặc khóa; chỉ giữ phần cần thiết cho mục đích vận hành theo chính sách của doanh nghiệp.

Mẫu dưới là log nội bộ minh họa, không phải response của Pay2S. Nó cho thấy giao dịch đã được xác minh nhưng tác vụ cập nhật đơn vẫn chờ, giúp người trực biết phần nào cần tiếp tục.

{
  "internalOrderId": "ORDER_DEMO_001",
  "sourceEventId": "EVENT_DEMO_001",
  "stage": "update_order",
  "verificationStatus": "verified",
  "businessActionStatus": "pending",
  "attempt": 2,
  "observedAt": "2026-01-01T00:00:00Z"
}

Khi hỗ trợ, bắt đầu từ mã đơn và khoảng thời gian, rồi kiểm tra từng bước theo log. Không gửi thêm giao dịch thật chỉ để xem hệ thống có chạy hay không. Mô phỏng thanh toán đơn demo Pay2S có lựa chọn gửi lại IPN, hữu ích để kiểm tra hành vi khi nhận lặp trong phạm vi demo.

Sau khi sửa, khoanh khoảng thời gian và danh sách đối tượng bị ảnh hưởng trước khi phục hồi. Đơn đã nhận tiền nhưng còn chờ khác với đơn đã giao mà phản hồi bị mất. Chạy lại có chọn lọc và ghi kết quả từng đối tượng, thay vì phát lại toàn bộ lịch sử. Nếu xuất hiện thêm chênh lệch, cần điều kiện dừng để không biến một sửa lỗi nhỏ thành nhiều tác vụ trùng.

Bộ nghiệm thu cần có chữ ký sai, tiền không khớp, hai request đồng thời, timeout, mất kết nối và tiến trình dừng giữa các bước. Dùng checklist thử trước khi chạy thật cho phần thanh toán, rồi bổ sung các tác vụ đặc thù của website. Kết quả tốt là đội vận hành chỉ ra được giao dịch đang ở đâu và khôi phục đúng bước, thay vì phải yêu cầu khách thử chuyển thêm.

Leave your comment