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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:06:02