Ruby - Binance API: подпись подписывается неправильно

Я пытаюсь подключиться к Binance API.

https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md

Мне отказывают в доступе. Я подозреваю, что проблема может быть не в "подписи"

Если у кого-то есть опыт подписания запросов на отдых в Binance, будет признателен пункт в правильном направлении, в котором я ошибаюсь.

error {"code": - 1022, "msg": "Подпись для этого запроса недействительна."}

  def get_time
    endpoint = "/api/v1/time"
    uri = @url + endpoint
    uri = URI(uri)
    response = Net::HTTP.get(uri)
    data = JSON.parse(response)
    data["serverTime"]
  end

  def get_amount
    query = URI.encode_www_form("timestamp"=> get_time)
    signature = sig(query)
    query = URI.encode_www_form("timestamp"=> get_time, "signature" => signature)
    endpoint = "/api/v3/account"
    uri = @url + endpoint + '?' + query

    uri = URI(uri)
    req = Net::HTTP::Get.new(uri)
    req['X-MBX-APIKEY'] = @api_key

    res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') do |http|
      http.request(req)
    end

    puts "Sig: #{signature}"
    puts "www: #{uri}" 
    res.body
  end

  def sig(query)
    digest = OpenSSL::Digest::SHA256.new
    OpenSSL::HMAC.hexdigest(digest, @api_secret, query)
  end

person seamus    schedule 06.05.2019    source источник
comment
Возможно, вам нужно передать rcvdWindow параметр запроса? github.com/ binance-exchange / binance-official-api-docs / blob /   -  person lacostenycoder    schedule 07.05.2019
comment
rcvdwindow: необязательный параметр, но я также попытался включить его. Тот же результат.   -  person seamus    schedule 07.05.2019


Ответы (1)


Похоже, вы дважды звоните get_time, так что это может быть вашей проблемой, поскольку подписанная документация запроса указывает, что подпись должна содержать все параметры запроса и объединить тело запроса. Когда вы вызываете get_time во второй раз, метка времени изменилась ПОСЛЕ того, как вы создали подпись с первой меткой времени.

Попробуйте вместо этого

  def get_amount
    timestamp = get_time
    query = URI.encode_www_form("timestamp"=> timestamp)
    signature = sig(query)
    query = URI.encode_www_form("timestamp"=> timestamp, "signature" => signature)
    endpoint = "/api/v3/account"
    uri = @url + endpoint + '?' + query

    uri = URI(uri)
    req = Net::HTTP::Get.new(uri)
    req['X-MBX-APIKEY'] = @api_key

    res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') do |http|
      http.request(req)
    end

    puts "Sig: #{signature}"
    puts "www: #{uri}" 
    res.body
  end

Кстати, ваш метод get_time может состоять из одной строки:

def get_time
  (Time.now.to_f * 1000).to_i.to_s
end
person lacostenycoder    schedule 07.05.2019