我真的很难理解js的行为。
var rp = require('request-promise');
var crypto = require('crypto');
var options = {
method : 'GET',
uri : "https://api.binance.com/api/v1/order",
qs: {
signature : hash,
timestamp : Date.now(),
symbol : 'LTCBTC'
},
headers: {
'X-MBX-APIKEY' : 'PUBLICKEY'
},
json : true
};
var hash= crypto.createHmac('sha256', options.toString())
.update('SECRETKEY')
.digest('hex');
//console.log(hash);
rp(options)
.then(function (Bbody) {
console.log(Bbody);
})
.catch(function (err) {
console.log(err);
});
如果我使用hash
函数并将其放在options
之前
(显然)说
TypeError:无法读取未定义的属性'toString'
但是如果我按照共享代码中的说明放置,则会出现此错误:
StatusCodeError:400-{“代码”:-1102,“ msg”:“必填参数'signature'未发送,为空/空或格式错误。”}
这是请求的输出:
options:
{ method: 'GET',
uri: 'https://api.binance.com/api/v1/order',
qs:
{ signature: undefined,
timestamp: 1540392736646,
symbol: 'LTCBTC' },
headers:
{ 'X-MBX-APIKEY':
'PUBLICKEY' },
json: true,
callback: [Function: RP$callback],
transform: undefined,
simple: true,
resolveWithFullResponse: false,
transform2xxOnly: false },
如果我取消注释console.log()
,则在请求被拒绝之前,我会获得正确的哈希值打印在视频上作为第一个输出。仍然电话无法接听。
我曾经用作文档:
this node documentation for the crypto library
and this npm doc to promisify api calls
P.S。 :PUBLICKEY
和SECRETKEY
是占位符,但是在我的测试中,我使用了正确的字符串。
答案 0 :(得分:2)
JavaScript中有一个叫做variable hoisting的东西。基本上,JavaScript会将hash
变量的声明秘密地移动为var hash;
到脚本的开头。在构造options
变量时,hash
仍未定义。
除了变量提升之外,我认为您将无法生成应包含相同哈希值的JavaScript对象的哈希。根据{{3}},您需要执行以下步骤:
symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559
https://api.binance.com/api/v3/order?symbol=LTCBTC&side=BUY&type=LIMIT&...&signature=<your sha256 here>
)&