google-apps-script - 使用 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);
}
解决方案
未经测试的建议,我建议在您的代码中更改此位(在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,
},
};
由于以下原因:
尽管您传递
body
给SignAndCallAPI
函数并body
在 HMAC 计算中使用,但您似乎并未实际包含body
在发送到服务器的 POST 请求中。我期待将其视为对象payload
属性的值options
。UrlFetchApp
文档(https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetchurl,-params)似乎表明Content-Type
应该在contentType
你的对象的属性中指定options
(而不是显式包括Content-Type
标题)。我没有详细查看 Coinbase API 文档(https://docs.pro.coinbase.com/#place-a-new-order),但
body
看起来还可以。您还需要确保CB-ACCESS-SIGN
请求标头的 HMAC 计算如文档(https://docs.pro.coinbase.com/#signing-a-message)中所述。
推荐阅读
- javascript - 来自 JSON API 的 VueJs2 HTTP 获取请求
- php - 使用 strpos 定位特定子字符串并存储以下 (PHP)
- spring - 无论如何都不是事务性的spring方法
- python - 传递字符串或值以用作回调以获取值
- firebase - AngularFireStorage - 如何为项目列表设置 downloadURL
- android - 在Android中为没有busybox的端口查找pid
- mysql - 如何在foreingkey django上返回关系名称
- c# - C# Microsoft Access 数据库连接错误
- android - 排球错误:Looper.prepare()
- php - Typo3 - 将 GET 值保存到会话