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

ColdFusion调用ByBit买卖API遭遇签名错误求助

问题分析与解决方案

核心错误点及修正方案

你的代码存在几个关键问题,直接导致了签名验证失败:

  1. 变量名不匹配
    生成签名的变量是HMAC,但请求头中引用的是lhmac,两者完全不一致,这是最直接的错误。

  2. 时间戳不一致
    多次调用unixdatetimeNow.getTime()可能产生毫秒级差异,导致签名中的时间戳和请求头的时间戳不匹配。需将时间戳提前存储为变量复用。

  3. API字段名错误
    ByBit现货API的下单接口中,订单数量字段是qty而非orderQty(orderQty为合约API字段),字段名错误会导致请求体与签名串中的body内容不匹配。

  4. JSON序列化差异
    ColdFusion的serializeJSON默认会对对象键进行字母排序,而ByBit要求签名串中的原始请求体必须和实际发送的body完全一致(包括字段顺序),自动序列化会破坏这种一致性。

修正后的完整代码

apiKey = _key;
    apiSecret = _s;

    // 提前存储时间戳,避免多次调用产生差异
    timestamp = unixdatetimeNow.getTime();
    recvWindow = 5000;

    // 手动构建JSON字符串,严格控制字段顺序和格式
    newbody = '{"symbol":"' & symb & '","qty":"' & qty & '","side":"' & side & '","orderType":"' & type & '"}';

    // 按规则构建签名串:timestamp + apiKey + recvWindow + raw_request_body
    str_to_sign = timestamp & apiKey & recvWindow & newbody;

    // 生成小写十六进制格式的HMAC-SHA256签名
    signature = lcase(hmac(str_to_sign, apiSecret, "HMACSHA256"));
</cfscript>

<cfhttp url="#base_api##req_path#" method="POST" result="result" charset="utf-8">
    <cfhttpparam type="body" value="#newbody#">
    <cfhttpparam type="HEADER" name="Content-Type" value="application/json">
    <cfhttpparam type="header" name="X-BAPI-SIGN-TYPE" value="2"> 
    <cfhttpparam type="header" name="X-BAPI-API-KEY" value="#apiKey#"> 
    <cfhttpparam type="header" name="X-BAPI-RECV-WINDOW" value="#recvWindow#"> 
    <cfhttpparam type="header" name="X-BAPI-SIGN" value="#signature#"> 
    <cfhttpparam type="header" name="X-BAPI-TIMESTAMP" value="#timestamp#"> 
</cfhttp>

额外验证步骤

  • 打印str_to_sign和newbody,确认两者中的请求体部分完全一致。
  • 检查时间戳是否为毫秒级Unix时间戳(ByBit要求的格式)。
  • 确认API密钥具备现货交易权限,且密钥未泄露或篡改。

内容的提问来源于stack exchange,提问作者Merle_the_Pearl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:50:28