调用Crypto.com API v2的private/user-balance时遇10004 BAD_REQUEST错误求助
问题排查与解决办法
核心错误原因
你遇到的10004 BAD_REQUEST错误,大概率由两个问题导致:
- 端点路径错误:
user-balance属于Crypto.com私有API范畴,正确的端点路径应为private/user-balance,而非直接使用/user-balance。 - 签名Payload不符合规则:你的代码生成了
paramString但未将其加入签名Payload,Crypto.com私有API要求必须把请求参数的键值对按字典序拼接后,追加到签名Payload中(即使参数为空,也要保留该逻辑)。
再次确认API权限
虽然你提到调整过权限,但请二次核对:
- 登录Crypto.com后台进入API密钥管理页
- 确保密钥勾选了「Account Balance」相关权限
- 若修改权限,需重新生成密钥并替换代码中的
API_KEY和SECRET_KEY
修正后的代码
以下是适配user-balance接口的完整代码,同时优化了签名逻辑的通用性:
import time import hmac import hashlib import requests import json # 替换为你的实际配置 API_KEY = "your_api_key" SECRET_KEY = "your_secret_key" BASE_URL = "https://api.crypto.com/v2/" def get_user_balance(): req = { "id": 3, # 建议每次请求使用唯一ID,可递增 "method": "private/user-balance", "api_key": API_KEY, "params": {}, # 如需指定币种,可添加如{"currency": "BTC"} "nonce": int(time.time() * 1000) } paramString = "" if "params" in req and req["params"]: # 按参数键的字典序排序后拼接,符合Crypto.com签名要求 sorted_params = sorted(req["params"].items()) for key, value in sorted_params: paramString += key paramString += str(value) # 签名Payload必须包含 method + id + api_key + paramString + nonce sigPayload = req['method'] + str(req['id']) + req['api_key'] + paramString + str(req['nonce']) req['sig'] = hmac.new( bytes(str(SECRET_KEY), 'utf-8'), msg=bytes(sigPayload, 'utf-8'), digestmod=hashlib.sha256 ).hexdigest() # 拼接正确的端点路径 response = requests.post(BASE_URL + req["method"], json=req, headers={'Content-Type': 'application/json'}) return json.loads(response.text) balance = get_user_balance() print(balance)
关键调整说明
- 端点修正:使用
private/user-balance作为请求方法和路径,与API文档保持一致 - 签名逻辑完善:将
paramString加入签名Payload,同时对参数按字典序排序,避免因参数顺序导致签名无效 - 请求ID优化:每次请求使用唯一ID(如递增),避免重复ID引发的请求失败
内容的提问来源于stack exchange,提问作者chrismountzou
相关产品推荐
相关产品推荐

