обещанный вызов GET для остальных API: не может получить действительную подпись - PullRequest
0 голосов
/ 24 октября 2018

Мне действительно трудно понять поведение 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 one

, то там будет (очевидно)

TypeError: Не удается прочитатьсвойство 'toString' не определено

, но если я поставлю его, как в коде, которым я поделился, я получу эту ошибку:

StatusCodeError: 400 - {"code":-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(), я получу правильный хеш, напечатанный на видео в качестве первого вывода, до отклонения запроса.Тем не менее звонок не может поймать его.

Я использовал в качестве документов:

документация API binance

документация этого узла для библиотеки шифрования

и этот документ npm для обещания вызовов API

PS: PUBLICKEY и SECRETKEY являются заполнителями, но в своих тестах я использовал правильные строки.

1 Ответ

0 голосов
/ 24 октября 2018

В JavaScript есть что-то, называемое переменным перемещением .По сути, JavaScript тайно перемещает объявление вашей переменной hash в начало скрипта как var hash;.Когда вы создаете переменную options, hash по-прежнему не определено.

Кроме поднятия переменной, я не думаю, что вы сможете создать хеш объекта JavaScript, который долженсодержит в себе одно и то же хеш-значение.В соответствии с https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md#signed-endpoint-examples-for-post-apiv1order, вам необходимо выполнить следующие шаги:

  1. принять все входные параметры для вашего запроса (символ, сторона, ..., метка времени)и объединить их в строку запроса, например, symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559
  2. вычислить HMAC SHA256 подпись из строки запроса
  3. сделать запрос в одном из следующих двухспособы:
    • включить все ваши входные параметры и подпись в качестве параметров запроса в URL (например: https://api.binance.com/api/v3/order?symbol=LTCBTC&side=BUY&type=LIMIT&...&signature=<your sha256 here>)
    • включить всеВаши входные параметры и подпись в теле запроса, еще раз объединенные с использованием &
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...