module RockFintech::Sign

Public Class Methods

sign(data, config) click to toggle source
# File lib/rock_fintech/sign/sign.rb, line 5
def self.sign(data, config)
  serialize_str = serialize(data)
  Sign::MD5.sign(serialize_str, Sign::MD5.sign(config[:rft_key], config[:rft_secret]))
end
verify(data, config) click to toggle source
# File lib/rock_fintech/sign/sign.rb, line 10
def self.verify(data, config)
  sign_str = data.delete(:sign)
  self.sign(data, config) == sign_str
end

Private Class Methods

serialize(data_in) click to toggle source
# File lib/rock_fintech/sign/sign.rb, line 17
def self.serialize(data_in)
  data = Marshal.load( Marshal.dump(data_in) ) # deep clone, not affect original data
  data = Hash[data.sort]     # key 按照 alphabet 排序

  data.each{ |k, v|
    if v.kind_of?(Hash)      # 如果是 hash 接着 serialize
      data[k] = serialize(v)
    elsif v.kind_of?(Array)
      if v[0].kind_of?(Hash) # 如果是 hash 数组对元素接着 serialize
        v.each_with_index{ |ele, index|
          ele.delete('sign')
          ele.delete(:sign)
          ele = Hash[ele.sort]
          v[index] = ele.map{|k,v| "#{k}=#{v}"}.join('&')
        }
        data[k] = v.join('&')
      else                   # 如果是普通元素数组
        data[k] = v.join('&')
      end
    end
  }
  data.map{|k,v| "#{k}=#{v}"}.join('&')
end