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

Posted

技术标签:

【中文标题】Ruby - Binance API:签名未正确签名【英文标题】:Ruby - Binance API: Signature is not signing correctly 【发布时间】:2019-09-24 13:47:35 【问题描述】:

我正在尝试连接到 Binance API。

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

我被拒绝访问。我怀疑问题可能不是 'signature'

如果有人有向 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

【问题讨论】:

也许你需要传递rcvdWindow查询参数? github.com/binance-exchange/binance-official-api-docs/blob/… rcvdwindow:可选参数,但我也尝试包含它。结果相同。 【参考方案1】:

似乎您调用了两次get_time,所以这可能是您的问题,因为signed request documentation 表示签名应该包含您的所有查询参数和连接的请求正文。当您第二次调用 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

【讨论】:

以上是关于Ruby - Binance API:签名未正确签名的主要内容,如果未能解决你的问题,请参考以下文章

如何验证对 Binance API 的 cURL 请求?

Python 通过 requests 调用 Binance API

pay支付参数验签失败咋回事

pdf电子签名怎么签?

Binance api 密钥和秘密查询字符串格式错误

如何使用 Binance API,通过股票代码简单 GET 价格