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