Chuyển tới nội dung chính

Thực thi chuyển đổi

Thực thi chuyển đổi ngoại tệ theo báo giá FIRM đã lấy tại Lấy báo giá FX. quote_id là bắt buộc — không hỗ trợ chuyển đổi không qua báo giá.

Luồng xử lý​

Cơ chế Idempotency​

request_id là idempotency key. Nếu Merchant gửi lại request với cùng request_id (do timeout, retry), hệ thống không tạo lệnh mới mà trả lại kết quả của lệnh ban đầu.

Xử lý timeout:

  • Timeout không rõ kết quả → (1) retry với cùng request_id, hoặc (2) tra cứu qua Tra cứu lệnh chuyển đổi
  • Không được đổi request_id khi retry cho cùng một lệnh

Ràng buộc Quote​

  • Mỗi quote_id chỉ thực thi thành công một lần → gửi quote đã dùng (với request_id khác) → mã 426
  • Quote quá expires_at → mã 425, lấy báo giá mới
  • Quote phải thuộc đúng merchant_code đã lấy báo giá; sai → mã 425

Đường dẫn​

  • URL: /api/v1/fx/convert
  • Method: POST

Request​

Tham sốLoại dữ liệuBắt buộcMô tả
request_idstring(50)CóMã duy nhất định danh request, đóng vai trò idempotency key. Xem mục 3 Giới thiệu
request_timestring(19)CóXem mục 3 Giới thiệu
merchant_codestring(20)CóXem mục 3 Giới thiệu
quote_idstring(50)CóMã báo giá FIRM lấy từ Lấy báo giá FX, còn trong thời hạn hiệu lực (expires_at)
from_currencystring(3)CóĐồng tiền nguồn, phải khớp chính xác với báo giá
from_amountdecimal(18,2)CóSố tiền nguồn muốn chuyển đổi, phải khớp chính xác với from_amount trong báo giá

Cơ chế đối chiếu số tiền (Cross-Check)​

from_currency và from_amount là các trường xác nhận tường minh, bắt buộc khớp chính xác với giá trị trong báo giá.

Không khớp → mã 428, lệnh không được thực thi. Merchant muốn chuyển đổi số tiền khác → lấy báo giá FIRM mới.

Ví dụ Request​

{
"request_id": "MERCHANT1234BK202606050002",
"request_time": "2026-06-05 10:15:45",
"merchant_code": "MERCHANT1234",
"quote_id": "FXQ0605A7K2M9XD41",
"from_currency": "USD",
"from_amount": 10000.00
}

Response​

Tham sốLoại dữ liệuBắt buộcMô tả
response_codeint(4)CóMã kết quả. 200 = thành công (kiểm tra status trong data), mã khác = lỗi
response_messagestring(200)CóMô tả mã kết quả
merchant_codestring(20)CóMã merchant
dataObjectCóChi tiết lệnh chuyển đổi (xem bảng dưới)

Cấu trúc data​

Tham sốLoại dữ liệuMô tả
conversion_idstring(50)Mã lệnh chuyển đổi do Baokim sinh, dùng để tra cứu và đối soát
origin_request_idstring(50)request_id của lệnh gốc (bằng request_id gửi lên; hữu ích khi response từ cơ chế idempotency)
statusstring(20)Trạng thái lệnh: PROCESSING (đang xử lý), SUCCESS (thành công), FAILED (thất bại, không phát sinh biến động)
quote_idstring(50)Mã báo giá đã thực thi
trade_typestring(4)Loại hình giao dịch (SELL/BUY)
currency_pairstring(10)Cặp tiền tệ chuẩn hóa (ví dụ USD/VND)
ratedecimal(18,2)Tỷ giá đã thực thi (đúng bằng tỷ giá trong quote)
from_currencystring(3)Đồng tiền nguồn
from_amountdecimal(18,2)Số tiền nguồn đã trừ
to_currencystring(3)Đồng tiền đích
to_amountdecimal(18,2)Số tiền đích đã ghi có
created_atstring(19)Thời điểm tạo lệnh (GMT+7), định dạng YYYY-MM-DD HH:MM:SS
completed_atstring(19)Thời điểm hoàn tất. Null khi status = PROCESSING.

Ví dụ Response​

{
"response_code": 200,
"response_message": "Success",
"merchant_code": "MERCHANT1234",
"data": {
"conversion_id": "FXC202606051015450001",
"origin_request_id": "MERCHANT1234BK202606050002",
"status": "SUCCESS",
"quote_id": "FXQ0605A7K2M9XD41",
"trade_type": "SELL",
"currency_pair": "USD/VND",
"rate": 26450.00,
"from_currency": "USD",
"from_amount": 10000.00,
"to_currency": "VND",
"to_amount": 264500000,
"created_at": "2026-06-05 10:15:45",
"completed_at": "2026-06-05 10:15:46"
}
}

Lưu ý​

Timeout hoặc mất kết nối khi gọi API này không đồng nghĩa lệnh thất bại. Merchant xử lý theo cơ chế idempotency ở trên, không tự ý coi là FAILED. Sử dụng Tra cứu lệnh chuyển đổi để xác định kết quả cuối cùng.

Mã lỗi​

Mã ResponseThông báo ResponseMô tả
200SuccessXem status trong data để biết kết quả lệnh
101System ErrorLỗi không mong muốn phía Baokim
110Merchant code invalidmerchant_code không xác định
120Invalid signatureHeader Signature không hợp lệ
422Validation ErrorTrường request thiếu hoặc không hợp lệ
425Quote not found, expired, or does not belong to merchantQuote hết expires_at, không tồn tại, hoặc không phải của merchant này
426Quote already usedquote_id này đã được thực thi thành công trước đó (single-use)
427Insufficient balanceKhông đủ tiền để thực thi chuyển đổi
428Amount/currency does not match quotefrom_currency hoặc from_amount không khớp quote
429Too many requestsVượt quá giới hạn tỷ lệ cho Merchant