Python调用OKx V5 API获取余额遇Invalid Sign(50113)错误求助
解决OKx API 50113 "Invalid Sign" 错误的排查方案
以下是针对该错误的核心排查点,结合OKx API签名规则逐一验证:
1. 签名生成逻辑是否严格匹配规则
OKx签名的核心公式为:sign = base64(hmac-sha256(secret, timestamp + method + requestPath + body))
需确保以下细节完全符合要求:
- timestamp:必须是UTC时区的ISO8601格式,比如
2024-05-20T12:34:56.789Z,不能使用本地时间或格式错误的时间字符串 - method:必须大写(
GET/POST),小写会直接导致签名不匹配 - requestPath:需包含完整的接口路径(开头带斜杠),比如
/api/v5/account/balance,不能省略斜杠或拼接查询参数 - body处理:
- GET请求时,body必须是空字符串
"",查询参数仅放在URL的query部分,不能写入body - POST请求时,body必须是无额外空格/换行的压缩JSON字符串(比如用
json.dumps(data, separators=(',', ':'))生成,不能用带缩进的格式化JSON)
- GET请求时,body必须是空字符串
2. 请求头字段是否完全正确
检查请求头的几个关键字段:
OK-ACCESS-TIMESTAMP:必须和签名时使用的timestamp完全一致,不能有任何修改OK-ACCESS-SIGN:直接使用签名生成的base64字符串,无需额外编码或转义OK-ACCESS-PASSPHRASE:直接使用你设置的passphrase,无需URL编码(即使包含特殊字符)
3. API环境是否匹配
确认使用的域名与API环境一致:
- 实盘:
https://www.okx.com - 模拟盘:
https://testnet.okx.com
域名错误会导致签名验证失败。
正确签名生成示例代码
import hmac import hashlib import base64 import time import requests import json # 配置参数 API_KEY = "your_api_key" API_SECRET = "your_api_secret" PASSPHRASE = "your_passphrase" BASE_URL = "https://www.okx.com" # 模拟盘替换为https://testnet.okx.com def generate_okx_sign(timestamp, method, request_path, body): # 拼接签名原始字符串 message = timestamp + method + request_path + body # HMAC-SHA256加密并base64编码 signature = hmac.new( API_SECRET.encode('utf-8'), message.encode('utf-8'), hashlib.sha256 ).digest() return base64.b64encode(signature).decode('utf-8') def fetch_account_balance(): # 获取合规的UTC时间戳 timestamp = time.strftime("%Y-%m-%dT%H:%M:%S.%f", time.gmtime())[:-3] + "Z" method = "GET" request_path = "/api/v5/account/balance" body = "" # GET请求body为空 # 生成签名 sign = generate_okx_sign(timestamp, method, request_path, body) headers = { "OK-ACCESS-KEY": API_KEY, "OK-ACCESS-SIGN": sign, "OK-ACCESS-TIMESTAMP": timestamp, "OK-ACCESS-PASSPHRASE": PASSPHRASE, "Content-Type": "application/json" } response = requests.get(f"{BASE_URL}{request_path}", headers=headers) print(response.json()) return response.json() # 测试调用 fetch_account_balance()
对比你的代码,重点检查签名生成的每一步是否与上述示例一致,尤其是时间格式、请求方法大小写、body内容的处理。
内容的提问来源于stack exchange,提问作者James_Semaj
相关产品推荐
相关产品推荐

