class SuningPay::Util

Constants

DEFAULT_ERR_MSG

Public Class Methods

get_summary(params) click to toggle source

生成md5摘要信息

# File lib/suning_pay/util.rb, line 9
def self.get_summary(params)
  #排序
  data_hash = sorted_hash(params)
  #拼接
  data_arr = []
  data_hash.each do |k,v|
    data_arr << k.to_s + '=' + v.to_s
  end
  data_str = data_arr.join('&')
  #MD5摘要
  data_md5 =  Digest::MD5.hexdigest(data_str).upcase
  data_md5
end
send_post(func_name, func_params_hash, api_code=SuningPay::API_CODE_PAY) click to toggle source

发送请求

# File lib/suning_pay/util.rb, line 41
def self.send_post(func_name, func_params_hash, api_code=SuningPay::API_CODE_PAY)
  api_url = ''

  case api_code
    when SuningPay::API_CODE_PAY
      api_url = SuningPay.api_base_url  + func_name
    when SuningPay::API_CODE_Q_PAY
      api_url = SuningPay.api_query_base_url + func_name
    when SuningPay::API_CODE_TRANSFER
      api_url = SuningPay.api_tranfer_url + func_name
    when SuningPay::API_CODE_TRANSFER_CARD
      api_url = SuningPay.api_card_tranfer_url + func_name
    else
      api_url = SuningPay.api_base_url + func_name
  end

  #对params就行摘要并签名
  summary = get_summary(func_params_hash)
  #加签名的查询参数
  func_params = signature_param(func_params_hash, summary)
  conn = Faraday.new(:url => api_url)

  response = conn.post '', func_params
  html_response = response.body

  if SuningPay.debug_mode
    log_file = File.join(Rails.root, "log", "suning_pay.log")
    logger = Logger.new(log_file)
    logger.info('--------------SUNING PAY DEBUG--------------')
    logger.info("URL:#{api_url.to_s}")
    logger.info("PARAMS:#{func_params.to_s}")
    logger.info("RESPONSE:#{html_response.force_encoding('UTF-8')}")
  end

  begin
    msg = JSON.parse(html_response)
  rescue JSON::ParserError => e
    msg = JSON.parse(DEFAULT_ERR_MSG)
  end
  msg
end
signature_param(prams, summary) click to toggle source

生成带摘要签名的查询参数

# File lib/suning_pay/util.rb, line 24
def self.signature_param(prams, summary)
  #私钥加密
  private_key = SuningPay.api_client_private_key
  sign = private_key.sign('sha1',summary.force_encoding("utf-8"))
  #Base64编码后取出后'-'
  signature = Base64.urlsafe_encode64(sign).gsub!(/=+$/, "")
  data_sign = {:signature => signature, :signAlgorithm => 'RSA'}
  params_signed = prams.merge(data_sign)
  params_signed
end
sorted_hash(in_hash) click to toggle source

排序

# File lib/suning_pay/util.rb, line 36
def self.sorted_hash(in_hash)
  return in_hash.sort{|a,b| a.to_s <=> b.to_s  }
end