ColdFusion调用ByBit买卖API遭遇签名错误求助
问题分析与解决方案
核心错误点及修正方案
你的代码存在几个关键问题,直接导致了签名验证失败:
变量名不匹配
生成签名的变量是HMAC,但请求头中引用的是lhmac,两者完全不一致,这是最直接的错误。时间戳不一致
多次调用unixdatetimeNow.getTime()可能产生毫秒级差异,导致签名中的时间戳和请求头的时间戳不匹配。需将时间戳提前存储为变量复用。API字段名错误
ByBit现货API的下单接口中,订单数量字段是qty而非orderQty(orderQty为合约API字段),字段名错误会导致请求体与签名串中的body内容不匹配。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
相关产品推荐
相关产品推荐

