Ruby -Binance API:签名未正确签名



我正在尝试连接到binance api。

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

我被拒绝访问。我怀疑这个问题可能不是'签名'

如果任何人都有签署休息请求的经验,那么朝着我出错的正确方向的一个点会不胜感激。

错误{"代码":-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

似乎您正在两次调用 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方法可能是1行:

def get_time
  (Time.now.to_f * 1000).to_i.to_s
end

最新更新