在Google Sheets调用Bybit API获取平仓PnL列表时遭遇签名错误
解决Bybit API签名错误问题(Google Sheets函数)
以下是你代码里的核心问题和修复方案:
签名字符串拼错了
Bybit V3 API要求签名字符串是时间戳 + API密钥 + 接收窗口 + 接口路径(含查询参数,不带域名),你之前用了完整URL,这会导致签名不匹配。改成只用endpoint部分拼接:var strForSign = timeStamp + key + recv_widow + endpoint;签名没做Base64编码
Utilities.computeHmacSha256Signature返回的是字节数组,必须转成Base64字符串才能被Bybit识别。把注释掉的那行启用,替换当前的签名值:'X-BAPI-SIGN': Utilities.base64Encode(signature),冗余参数可以去掉
GET请求不需要设置contentType,删掉这个参数避免干扰。
修复后的完整代码:
function bybitpnl() { var timeStamp = new Date().getTime().toString(); var host = 'https://api.bybit.com'; var endpoint = '/contract/v3/private/position/closed-pnl?symbol=ETHUSDT'; var key = 'xxxxxxxxxxx'; var secret = 'xxxxxxxxxxxx'; var recv_widow = '5000'; // 按Bybit规则拼接签名字符串 var strForSign = timeStamp + key + recv_widow + endpoint; Logger.log(strForSign); // 生成HMAC-SHA256签名并转Base64 var signatureBytes = Utilities.computeHmacSha256Signature(strForSign, secret); var signature = Utilities.base64Encode(signatureBytes); var options = { method: "GET", headers: { 'X-BAPI-SIGN-TYPE': '2', 'X-BAPI-API-KEY': key, 'X-BAPI-TIMESTAMP': timeStamp, 'X-BAPI-SIGN': signature, 'X-BAPI-RECV-WINDOW': recv_widow } }; var url = host + endpoint; var requestDetails = UrlFetchApp.getRequest(url, options); Logger.log(requestDetails); try { var result = UrlFetchApp.fetch(url, options); Logger.log(result.getContentText()); } catch (e) { Logger.log("请求错误: " + e.toString()); } };
另外注意:如果还是报错,检查下本地时间和Bybit服务器时间的误差不要超过5秒(你设置的recv_widow是5000ms),误差太大也会触发签名错误。
内容的提问来源于stack exchange,提问作者Dustin Parris
相关产品推荐
相关产品推荐

