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

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

关键说明

这个修正后的函数核心逻辑是:

  1. 从请求体中提取method、id、api_key、nonce这些必填字段
  2. 递归处理params参数,把它转换成排序后无分隔符的字符串(字典按键排序,列表直接拼接元素)
  3. 按照method + 请求ID + API密钥 + 参数字符串 + nonce的顺序拼接成签名原始串
  4. 用API密钥对这个原始串做HMAC-SHA256哈希,得到最终的签名

替换成这个签名函数后,我的API请求就成功通过认证了,再也没出现40101的错误。

备注:内容来源于stack exchange,提问作者Some_acctg_guy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:28:05