Crypto.com交易所API请求出现40101认证失败错误的排查与解决
Crypto.com交易所API请求出现40101认证失败错误的排查与解决
最近我在测试Crypto.com交易所的基础交易脚本时,反复碰到了40101认证失败的错误,每次请求返回的内容都是:
API Response: {'code': 40101, 'message': 'Authentication failure'}
Buy Order Response: {'code': 40101, 'message': 'Authentication failure'}
我试过重新生成多组API密钥,也确认了密钥复制完全正确,但问题还是没解决。后来我意识到问题肯定出在HMAC签名的生成逻辑上——它不符合Crypto.com API的要求。
最初的错误签名生成逻辑
我一开始是直接对整个请求payload做JSON序列化后生成签名,代码如下:
def generate_signature(payload: dict) -> str: """Generates HMAC signature for authentication.""" message = json.dumps(payload, separators=(',', ':'), sort_keys=True) return hmac.new(API_SECRET.encode(), message.encode(), hashlib.sha256).hexdigest()
但Crypto.com的API对签名的构造有特殊要求,不是简单的JSON字符串哈希,而是需要按照特定的字段顺序和格式拼接内容。
修正后的正确签名生成逻辑
后来我重新按照Crypto.com的API规范调整了签名生成函数,问题就解决了。这个函数会严格按照API要求拼接签名原始串:
def generate_signature(request_body: dict, secret_key: str) -> str: """Generates a valid HMAC SHA256 signature according to Crypto.com API documentation.""" # Extract necessary fields method = request_body["method"] req_id = str(request_body["id"]) api_key = request_body["api_key"] nonce = str(request_body["nonce"]) # Convert 'params' to a correctly formatted string def params_to_str(params, level=0): if params is None: return "" if isinstance(params, dict): return "".join( key + params_to_str(params[key], level + 1) for key in sorted(params.keys()) ) if isinstance(params, list): return "".join(params_to_str(item, level + 1) for item in params) return str(params) param_string = params_to_str(request_body.get("params", {})) # Construct the final signature payload sig_payload = method + req_id + api_key + param_string + nonce # Generate HMAC-SHA256 signature signature = hmac.new( secret_key.encode(), sig_payload.encode(), hashlib.sha256 ).hexdigest() return signature
关键说明
这个修正后的函数核心逻辑是:
- 从请求体中提取
method、id、api_key、nonce这些必填字段 - 递归处理
params参数,把它转换成排序后无分隔符的字符串(字典按键排序,列表直接拼接元素) - 按照
method + 请求ID + API密钥 + 参数字符串 + nonce的顺序拼接成签名原始串 - 用API密钥对这个原始串做HMAC-SHA256哈希,得到最终的签名
替换成这个签名函数后,我的API请求就成功通过认证了,再也没出现40101的错误。
备注:内容来源于stack exchange,提问作者Some_acctg_guy
相关产品推荐
相关产品推荐

