module Rwepay::Common
Public Class Methods
configs_check(configs = {}, requires = [])
click to toggle source
# File lib/Rwepay/common.rb, line 9 def self.configs_check(configs = {}, requires = []) requires.each do |require| unless configs.include? require raise "Rwepay Error, configs required hash symbol :#{require}" end end configs end
creat_notify_sign_string(params = {})
click to toggle source
# File lib/Rwepay/common.rb, line 98 def self.creat_notify_sign_string(params = {}) key = params['key'] result_string = '' sign_params = params.sort sign_params.each do |key, value| unless value.nil? or value == '' or key.to_s == 'key' or key.to_s == 'xml' or key.to_s == 'sign' or key.to_s == 'action'or key.to_s == 'controller' result_string += (key.to_s + '=' + value.to_s + '&') end end "#{result_string}key=#{key}" end
create_pay_sign_string(sign_params = {}, sort = true)
click to toggle source
# File lib/Rwepay/common.rb, line 39 def self.create_pay_sign_string(sign_params = {}, sort = true) result_string = '' key = sign_params[:key] #是否排序 if sort sign_params = sign_params.sort end sign_params.each{|key,value| result_string += (key.to_s + '=' + value.to_s + '&') } result_string[0, result_string.length - 1] end
create_sign_string(sign_params = {}, sort = true)
click to toggle source
# File lib/Rwepay/common.rb, line 22 def self.create_sign_string(sign_params = {}, sort = true) #对原串进行签名,注意这里不要对任何字段进行编码。这里是将参数按照key=value进行字典排序后组成下面的字符串,在这个字符串最后拼接上key=XXXX。由于这里的字段固定,因此只需要按照这个顺序进行排序即可。 result_string = '' key = sign_params[:key] #是否排序 if sort sign_params = sign_params.sort end sign_params.each{|key,value| result_string += (key.to_s + '=' + value.to_s + '&') if key.to_s != 'key' } "#{result_string}key=#{key}" end
get_nonce_str()
click to toggle source
# File lib/Rwepay/common.rb, line 18 def self.get_nonce_str SecureRandom.hex 16 end
get_order_query(options = {}, access_token)
click to toggle source
# File lib/Rwepay/common.rb, line 160 def self.get_order_query(options = {}, access_token) package = "out_trade_no=#{options[:out_trade_no]}&partner=#{options[:partner_id]}" md5_package_sign = md5_sign "#{package}&key=#{options[:partner_key]}" for_sign_data = { :appid => options[:app_id], :appkey => options[:app_key], :package => "#{package}&sign=#{md5_package_sign}", :timestamp => get_timestamps } result_string = '' sign_params = for_sign_data.sort sign_params.each{|key,value| result_string += (key.to_s + '=' + value.to_s + '&') } result_string = result_string[0, result_string.length - 1] for_sign_data[:app_signature] = sha1_sign result_string for_sign_data[:sign_method] = 'sha1' for_sign_data.delete :appkey begin conn = Faraday.new(:url => "https://api.weixin.qq.com/pay/orderquery?access_token=#{access_token}") response = conn.post do |req| req.body = for_sign_data.to_json.gsub(/\\u([0-9a-z]{4})/) {|s| [$1.to_i(16)].pack("U")} end response = JSON.parse response.body if response['errcode'] == 0 return true, response else return false, response end rescue => err return false, err end end
get_package(sign_params = {})
click to toggle source
get_package
:bank_type, :body, :fee_type, :input_charset, :notify_url, :out_trade_no, :partner, :spbill_create_ip, :total_fee, :key
# File lib/Rwepay/common.rb, line 79 def self.get_package(sign_params = {}) for_sign_string = create_sign_string sign_params md5_signed_string = md5_sign for_sign_string result_params = result_params_filter sign_params "#{result_params}&sign=#{md5_signed_string}" end
get_timestamps()
click to toggle source
# File lib/Rwepay/common.rb, line 94 def self.get_timestamps Time.now.to_i.to_s end
md5_sign(for_sign_string)
click to toggle source
# File lib/Rwepay/common.rb, line 54 def self.md5_sign(for_sign_string) Digest::MD5.hexdigest(for_sign_string).upcase end
notify_sign(sign_params = {})
click to toggle source
# File lib/Rwepay/common.rb, line 111 def self.notify_sign(sign_params = {}) for_sign_string = creat_notify_sign_string sign_params md5_signed_string = md5_sign for_sign_string md5_signed_string end
pay_sign(sign_params = {})
click to toggle source
sign_string :appid, :appkey, :noncestr, :package, :timestamp
# File lib/Rwepay/common.rb, line 88 def self.pay_sign(sign_params = {}) for_sign_string = create_pay_sign_string sign_params sha1_signed_string = sha1_sign for_sign_string sha1_signed_string end
result_params_filter(sign_params, sort = true)
click to toggle source
# File lib/Rwepay/common.rb, line 62 def self.result_params_filter(sign_params, sort = true) result_string = '' #是否排序 if sort sign_params = sign_params.sort end sign_params.each{|key,value| encode_value = URI.escape(value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")) result_string += (key.to_s + '=' + encode_value + '&') if key.to_s != 'key' } #去掉末尾的& result_string = result_string[0, result_string.length - 1] return result_string end
send_deliver_notify(options = {}, access_token)
click to toggle source
# File lib/Rwepay/common.rb, line 118 def self.send_deliver_notify(options = {}, access_token) for_sign_data = { :appid => options[:app_id], :appkey => options[:app_key], :openid => options[:open_id], :transid => options[:trans_id], :out_trade_no => options[:out_trade_no], :deliver_timestamp => options[:deliver_timestamp], :deliver_status => options[:deliver_status], :deliver_msg => options[:deliver_msg] } result_string = '' sign_params = for_sign_data.sort sign_params.each{|key,value| result_string += (key.to_s + '=' + value.to_s + '&') } result_string = result_string[0, result_string.length - 1] for_sign_data[:app_signature] = sha1_sign result_string for_sign_data[:sign_method] = 'sha1' for_sign_data.delete :appkey begin conn = Faraday.new(:url => "https://api.weixin.qq.com/pay/delivernotify?access_token=#{access_token}") response = conn.post do |req| req.body = for_sign_data.to_json.gsub(/\\u([0-9a-z]{4})/) {|s| [$1.to_i(16)].pack("U")} end response = JSON.parse response.body if response['errcode'] == 0 return true, nil else return false, response end rescue => err return false, err end end
sha1_sign(for_sign_string)
click to toggle source
# File lib/Rwepay/common.rb, line 58 def self.sha1_sign(for_sign_string) Digest::SHA1.hexdigest(for_sign_string) end