使用Google Apps Script对接Independent Reserve API的签名问题求助
Independent Reserve API 对接Google Apps Script修复方案
核心问题修正点
- 签名算法误用:原代码使用普通SHA256哈希密钥,实际API要求用HMAC-SHA256算法,以API密钥为密钥、拼接完整的请求信息为内容生成签名
- 签名字符串拼接不全:业务参数
primaryCurrencyCode、secondaryCurrencyCode、pageIndex、pageSize需要按规则拼入签名计算的字符串中 - 签名输出格式错误:字节转十六进制后需拼接为连续字符串,原代码用逗号分隔不符合校验要求
- nonce逻辑错误:重复定义变量且多余自增,导致签名和请求体中nonce不一致
- 请求参数格式错误:
UrlFetchApp的POST请求参数需要放在payload字段中序列化,不能直接放在options根节点,同时要显式指定请求方法为POST - headers重复定义:两次定义headers导致第一次设置的User-Agent被覆盖
修正后完整代码
function myFunction() { var key = 'api-key'; // 替换为实际API密钥 var secret = 'api-secret'; // 替换为实际API私钥 var url = 'https://api.independentreserve.com/Private/GetOpenOrders'; // 生成符合要求的nonce var nonce = (new Date()).getTime(); // 按官方要求拼接所有参数到签名字符串 var message = [ url, 'apiKey=' + key, 'nonce=' + nonce, 'primaryCurrencyCode=Xbt', 'secondaryCurrencyCode=Usd', 'pageIndex=1', 'pageSize=25' ].join(','); // 生成HMAC-SHA256签名 var hmacBytes = Utilities.computeHmacSha256Signature(message, secret); var signature = hmacBytes .map(function(byte) { var v = byte < 0 ? 256 + byte : byte; return ("0" + v.toString(16)).slice(-2); }).join(''); // 配置请求头 var headers = { "User-Agent": "Independent Reserve Javascript API Client", "Content-Type": "application/json" }; // 构造请求配置 var options = { method: 'POST', headers: headers, muteHttpExceptions: true, payload: JSON.stringify({ "apiKey": key, "nonce": nonce, "signature": signature, "primaryCurrencyCode": "Xbt", "secondaryCurrencyCode": "Usd", "pageIndex": 1, "pageSize": 25 }) }; var response = UrlFetchApp.fetch(url, options); console.info(response.getContentText()); }
内容的提问来源于stack exchange,提问作者Osama Khan
相关产品推荐
相关产品推荐

