Ủy quyền

Các phương thức API được bảo vệ yêu cầu ủy quyền bằng chữ ký HMAC-SHA256.

Required headers

Mỗi yêu cầu phải chứa ba header bắt buộc:

X-Timestamp
Unix timestamp tính bằng giây
X-Signature
Chữ ký yêu cầu HMAC-SHA256 ở định dạng hex
X-Client-Id
ID merchant của bạn

Signature generation

Chữ ký được tạo dựa trên timestamp và nội dung yêu cầu.

Định dạng:

{timestamp}.{canonicalBody}

Format description

timestamp
Thời gian Unix hiện tại tính bằng giây
canonicalBody
Nội dung JSON của yêu cầu được chuẩn hóa

Thuật toán chữ ký:

  • Lấy thời gian Unix hiện tại tính bằng giây
  • Lấy nội dung yêu cầu
  • Chuyển JSON sang định dạng canonical
  • Tạo chuỗi: timestamp + "." + canonicalBody
  • Ký chuỗi bằng HMAC-SHA256 với api_secret
  • Truyền timestamp và chữ ký trong header của yêu cầu

Yêu cầu quan trọng:

  • Không được truyền api_secret trong yêu cầu
  • api_secret chỉ được lưu ở phía máy chủ của merchant
  • Chữ ký phải được tính riêng cho từng yêu cầu
  • X-Timestamp phải khớp với thời điểm tạo chữ ký
  • Nội dung yêu cầu gửi tới API phải khớp hoàn toàn với nội dung dùng để tính chữ ký
  • Với yêu cầu không có body, chuỗi được ký có dạng: {timestamp}

Ví dụ:

Authorization errors

401 Invalid X-Timestamp

{
  "status": 401,
  "message": "Invalid X-Timestamp"
}

401 Expired X-Timestamp

{
  "status": 401,
  "message": "Expired X-Timestamp"
}

401 Invalid X-Signature

{
  "status": 401,
  "message": "Invalid X-Signature"
}

401 Invalid token

{
  "status": 401,
  "message": "Invalid token"
}

401 Merchant secret not configured

{
  "status": 401,
  "message": "Merchant secret not configured"
}

500 Internal Server Error

{
  "status": 500,
  "message": "Internal Server Error"
}