首页 > 解决方案 > 使用 Google Apps 脚本通过 Coinbase Pro API 发布请求

问题描述

我正在使用 Coinbase Pro API,虽然它适用于 GET 请求,但当我尝试使用 POST 请求下订单时,我得到了“无效签名”。我怀疑这可能与消息的“正文”有关,因为这是与“正文”为空的 GET 的唯一区别。

我想知道是否有人可以帮助我。

function SellMarket (product,amount) {
  var requestPath = '/orders';
  var method = 'POST';
  var body = JSON.stringify({
    "type": "market",
    "side": "buy",
    "product_id": product,
    //"size": amount,
    'size': '1.0'
  });
  
  Logger.log('Sell - Body = '+body); 

  var responseJson = SignAndCallAPI(method, requestPath, body);
  Logger.log('Sell Executed = '+responseJson); 
}  


function SignAndCallAPI(method, requestPath, body) {

  var timestamp = Math.floor(Date.now() / 1000).toString();
  var what = Utilities.base64Decode(Utilities.base64Encode(timestamp + method + requestPath + body));
  var decodedsecret = Utilities.base64Decode(globalvars_CB.secret);
  
  var hmac = Utilities.base64Encode(Utilities.computeHmacSha256Signature(what, decodedsecret));
     
  var options = {
    'method' : method,
    'muteHttpExceptions' : true,     
    'headers' : {
      'Content-Type': 'application/json',
      'CB-ACCESS-KEY' : globalvars_CB.apikey,
      'CB-ACCESS-SIGN' : hmac,
      'CB-ACCESS-TIMESTAMP' : timestamp,
      'CB-ACCESS-PASSPHRASE' :  globalvars_CB.passphrase,
     }
  }  
      
  var responseJson = UrlFetchApp.fetch(globalvars_CB.uri+requestPath, options);
  
  return(responseJson);  

}

标签: google-apps-scriptcoinbase-api

解决方案


未经测试的建议,我建议在您的代码中更改此位(在SignAndCallAPI函数中):

var options = {
  'method' : method,
  'muteHttpExceptions' : true,     
  'headers' : {
    'Content-Type': 'application/json',
    'CB-ACCESS-KEY' : globalvars_CB.apikey,
    'CB-ACCESS-SIGN' : hmac,
    'CB-ACCESS-TIMESTAMP' : timestamp,
    'CB-ACCESS-PASSPHRASE' :  globalvars_CB.passphrase,
  }
}

至:

const options = {
  method: method,
  payload: body,
  contentType: 'application/json',
  muteHttpExceptions: true,     
  headers: {
    'CB-ACCESS-KEY': globalvars_CB.apikey,
    'CB-ACCESS-SIGN': hmac,
    'CB-ACCESS-TIMESTAMP': timestamp,
    'CB-ACCESS-PASSPHRASE':  globalvars_CB.passphrase,
  },
}; 

由于以下原因:

  1. 尽管您传递bodySignAndCallAPI函数并body在 HMAC 计算中使用,但您似乎并未实际包含body在发送到服务器的 POST 请求中。我期待将其视为对象payload属性的值options

  2. UrlFetchApp文档(https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetchurl,-params)似乎表明Content-Type应该在contentType你的对象的属性中指定options(而不是显式包括Content-Type标题)。

  3. 我没有详细查看 Coinbase API 文档(https://docs.pro.coinbase.com/#place-a-new-order),但body看起来还可以。您还需要确保CB-ACCESS-SIGN请求标头的 HMAC 计算如文档(https://docs.pro.coinbase.com/#signing-a-message)中所述。


推荐阅读