Xử lý Timeout
Khuyến nghị
Các nguyên tắc dưới đây là khuyến nghị chung, suy ra từ cơ chế Idempotency (
request_id) đã mô tả tại trang Bảo mật — phần lớn tài liệu gốc của t ừng nhóm API (VA, BNPL, Installment, Thẻ quốc tế, Master Basic/Pro, Master VA, Master Thẻ tín dụng) không có mục Xử lý timeout riêng, nên đây chưa phải spec chính thức được dev xác nhận cho từng API.
Client nên đặt timeout hợp lý để tránh hai tình huống cực đoan:
- Chờ vô hạn — gây treo ứng dụng nếu server không phản hồi.
- Cắt quá sớm — huỷ request khi server đang xử lý bình thường (đặc biệt với các API thanh toán cần thời gian xử lý với ngân hàng).
Khuyến nghị: đặt timeout 30–60 giây cho các API tạo giao dịch.
Yêu cầu về timeout
Khi gặp timeout, không được retry mù quáng (blind retry). Thay vào đó:
- Gọi API tra cứu giao dịch (Get Transaction Status) để kiểm tra xem giao dịch đã được tạo hay chưa.
- Chỉ tạo lại giao dịch nếu xác nhận giao dịch chưa tồn tại.
Khóa Idempotency
request_id là Idempotency key bắt buộc với tất cả API tạo giao dịch (Create Payment). Khi retry sau timeout, Merchant giữ nguyên request_id cũ để Baokim nhận ra đây là request đã xử lý và trả về kết quả cũ thay vì tạo giao dịch mới — giúp tránh duplicate charge.
Thử lại APIs
Các API có thể retry an toàn (idempotent by nature):
GETtra cứu trạng thái giao dịchGETlấy danh sách ngân hàng / gói vay
Các API không nên retry mù quáng:
- Tất cả API tạo giao dịch (Create Payment, tạo đơn hàng, tạo VA...) nếu không có
request_idmới hoặc chưa kiểm tra trạng thái trước.
Lưu ý riêng cho QRPay/QRGlobal
Khi MERCHANT gọi API QRPay mà không nhận được phản hồi:
-
Không tự kết luận giao dịch thất bại. Trạng thái cuối cùng luôn căn cứ theo Webhook thông báo giao dịch hoặc kết quả tra cứu.
-
Với API Tạo mã QR: gọi API Tra cứu giao dịch theo
mrc_order_idđể xác nhận đơn đã được khởi tạo hay chưa trước khi gọi lại. Nếu gọi lại vớimrc_order_idđã tồn tại, hệ thống trả về mã lỗi 707. -
Với API Hoàn tiền (luồng bất đồng bộ): nếu không nhận được phản hồi tiếp nhận, gọi lại với
request_idmới; hệ thống đảm bảo không xử lý trùng yêu cầu hoàn tiền vượt quá số tiền có thể hoàn của giao dịch gốc. -
Không nhận được Webhook sau thời gian chờ dự kiến: MERCHANT chủ động gọi API Tra cứu giao dịch để đồng bộ trạng thái.
Lưu ý riêng cho Deeplink
Khi MERCHANT gọi API Deeplink mà không nhận được phản hồi:
- Không tự kết luận giao dịch thất bại. Trạng thái cuối cùng luôn căn cứ theo thông báo kết quả từ Baokim.
- Với API Tạo Deeplink: không retry ngay lập tức. Kiểm tra xem
request_idđã được xử lý chưa trước khi gọi lại. Nếu retry, sử dụng cùngrequest_idcũ để tránh tạo trùng giao dịch. - Deeplink có thời hạn (
expired_at): nếu Deeplink đã hết hạn mà người dùng chưa thanh toán, cần tạo lại Deeplink mới vớirequest_idmới. - Với API Lấy danh sách ngân hàng (GET): có thể retry an toàn vì là API tra cứu thuần tuý.