You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:09:54