调用Bithumb /info/orders API遇5100认证错误,求代码排查方案
解决Bithumb API调用返回5100(Bad Request.(Auth Data))错误的方案
错误码5100表明鉴权数据不符合平台要求,以下是针对你代码的具体修改方案和问题分析:
问题分析与核心修改点
Nonce生成逻辑不可靠
原代码通过分割microtime字符串生成nonce,容易出现格式错误。Bithumb要求nonce是递增的整数,直接用毫秒级时间戳生成更稳定且符合规则。签名拼接规则错误
原代码错误地将endpoint加入到请求参数列表中,Bithumb的签名规则是将endpoint(如/info/orders)、urlencoded的请求参数、nonce用chr(1)(SOH控制字符)分隔,而非把endpoint作为参数的一部分。请求数据与签名参数不一致
原代码传递字典作为请求数据,虽然requests会自动编码,但手动生成urlencoded字符串并传递,能确保和签名使用的参数完全一致,避免编码差异导致的鉴权失败。签名生成步骤冗余
原代码对hmac的hex结果重复编码,直接基于hmac的二进制摘要生成base64即可,完全符合Bithumb的签名要求。
修改后的完整代码
import time import base64 import hmac, hashlib import urllib.parse import requests class XCoinAPI: api_url = "https://api.bithumb.com" def __init__(self, api_key, api_secret): self.api_key = api_key self.api_secret = api_secret def get_nonce(self): # 生成毫秒级时间戳作为nonce,确保递增且格式合规 return str(int(time.time() * 1000)) def xcoinApiCall(self, endpoint, rgParams): # 1. 生成urlencoded格式的请求参数字符串 str_data = urllib.parse.urlencode(rgParams) # 2. 获取合法的nonce值 nonce = self.get_nonce() # 3. 构造签名原始字符串:endpoint + SOH + 参数串 + SOH + nonce sign_raw = f"{endpoint}{chr(1)}{str_data}{chr(1)}{nonce}" sign_raw_bytes = sign_raw.encode('utf-8') # 4. 生成HMAC-SHA512签名并做base64编码 secret_bytes = self.api_secret.encode('utf-8') hmac_result = hmac.new(secret_bytes, sign_raw_bytes, hashlib.sha512).digest() api_sign = base64.b64encode(hmac_result).decode('utf-8') headers = { "Accept": "application/json", "Content-Type": "application/x-www-form-urlencoded", "Api-Key": self.api_key, "Api-Nonce": nonce, "Api-Sign": api_sign } url = f"{self.api_url}{endpoint}" # 传递urlencoded字符串作为请求数据,确保和签名用的参数完全一致 r = requests.post(url, headers=headers, data=str_data) return r.json() # 替换为你的真实API密钥 a = XCoinAPI(api_key="YOUR_ACTUAL_API_KEY", api_secret="YOUR_ACTUAL_API_SECRET") # 注意:order_currency需为Bithumb支持的币种代码(示例用LTC,你之前的LN可能无效) aa = a.xcoinApiCall("/info/orders", {"order_currency": "LTC", "payment_currency": "BTC"}) print(aa)
额外注意事项
- 确认API密钥和密钥完全正确,且已在Bithumb后台开启
/info/orders接口的访问权限 order_currency必须是平台支持的有效币种代码,无效代码也会触发请求失败- Nonce必须严格递增且不重复,使用毫秒时间戳可天然满足这一要求
内容的提问来源于stack exchange,提问作者석장원
相关产品推荐
相关产品推荐

