Yêu cầu ký

View as Markdown

Định dạng yêu cầu

Vị tríLĩnh vựcBắt buộcMô tả
Tiêu đềX-API-KEYĐúng vậyapiKey trả về khi API Key được tạo
Truy vấntimestampĐúng vậyDấu thời gian mili giây Unix
Truy vấnsignatureĐúng vậyHMAC- Chữ kýSHA256 , chuỗi lục giác chữ thường
Thân xeJSONTùy thuộc vào endpointPOST / PUT / DELETE cơ quan yêu cầu

Tải trọng chữ ký

payload = queryStringWithoutSignature + requestBody
signature = HMAC-SHA256(apiSecret, payload)

Các quy tắc chính:

  • timestamp phải là dấu thời gian Unix mili giây. Cửa sổ dung sai máy chủ là ±10 giây.
  • signature được đặt trong chuỗi truy vấn URL , nhưng không được bao gồm trong payload chữ ký.
  • Máy chủ xác minh chuỗi truy vấn gốc sau khi xóa signature; không thay đổi thứ tự tham số truy vấn.
  • Thứ tự tham số truy vấn dùng để ký phải khớp với URL yêu cầu thực tế.
  • Nếu có phần thân yêu cầu, chuỗi JSON dùng để ký phải khớp chính xác với phần thân được truyền thực tế.
  • Các đường dẫn liên quan đến thứ tự thực hiện kiểm tra lại chữ ký. Việc sử dụng lại cùng một chữ ký trong thời gian ngắn sẽ trả về Signature replay detected.

Thời gian máy chủ

1GET /v1/time

Ví dụ phản hồi:

1{
2 "code": 0,
3 "message": "success",
4 "data": {
5 "timestamp": 1780473256,
6 "timestampMs": 1780473256708,
7 "iso": "2026-06-03T07:54:16Z",
8 "timezone": "UTC"
9 },
10 "requestId": "req-7cad3113"
11}

Khách hàng nên tính toán timeOffsetMs = serverTimestampMs - localTimestampMs, sau đó sử dụng timestamp = nowMs + timeOffsetMs cho các yêu cầu đã ký tiếp theo. Nếu máy chủ trả về Timestamp outside of tolerance window, hãy ngay lập tức đồng bộ lại thời gian và tạo lại chữ ký.

Ví dụ về ký hiệu GET

Yêu cầu thực tế:

GET /v1/private/order/current?symbol=BTCUSDT&timestamp=1772710377808&signature=...

Tải trọng chữ ký:

symbol=BTCUSDT&timestamp=1772710377808

Ví dụ về ký hiệu POST

Yêu cầu thực tế:

POST /v1/private/order/place?timestamp=1772710377808&signature=...

Nội dung yêu cầu:

1{"symbol":"BTCUSDT","type":"LIMIT","side":"BUY","price":"85000","quantity":"0.1","timeInForce":"GTC","makerOnly":true,"clientOrderId":"ext-1772710377808-001"}

Tải trọng chữ ký:

timestamp=1772710377808{"symbol":"BTCUSDT","type":"LIMIT","side":"BUY","price":"85000","quantity":"0.1","timeInForce":"GTC","makerOnly":true,"clientOrderId":"ext-1772710377808-001"}

Ví dụ về ký Python

1import hashlib
2import hmac
3import json
4import time
5from urllib.parse import urlencode
6
7import requests
8
9BASE_URL = "https://api.6mm.com"
10API_KEY = "YOUR_API_KEY"
11API_SECRET = "YOUR_API_SECRET"
12TIME_OFFSET_MS = 0
13
14def sign(payload: str) -> str:
15 return hmac.new(
16 API_SECRET.encode("utf-8"),
17 payload.encode("utf-8"),
18 hashlib.sha256,
19 ).hexdigest()
20
21def sync_time_offset():
22 global TIME_OFFSET_MS
23 before = int(time.time() * 1000)
24 resp = requests.get(f"{BASE_URL}/v1/time", timeout=5)
25 after = int(time.time() * 1000)
26 resp.raise_for_status()
27
28 server_ts = int(resp.json()["data"]["timestampMs"])
29 local_midpoint = (before + after) // 2
30 TIME_OFFSET_MS = server_ts - local_midpoint
31
32def signed_request(method: str, path: str, params=None, body=None):
33 params = dict(params or {})
34 params["timestamp"] = str(int(time.time() * 1000) + TIME_OFFSET_MS)
35
36 query_string = urlencode(params)
37 body_string = ""
38 if body is not None:
39 body_string = json.dumps(body, separators=(",", ":"), ensure_ascii=False)
40
41 signature = sign(query_string + body_string)
42 url = f"{BASE_URL}{path}?{query_string}&signature={signature}"
43 headers = {
44 "X-API-KEY": API_KEY,
45 "Content-Type": "application/json",
46 }
47 resp = requests.request(method, url, headers=headers, data=body_string if body is not None else None, timeout=10)
48 resp.raise_for_status()
49 return resp.json()
50
51sync_time_offset()
52print(signed_request("GET", "/v1/private/order/current", {"symbol": "BTCUSDT"}))