Module: Reapal::Http::Decode

Defined in:
lib/reapal/http/decode.rb

Class Method Summary collapse

Class Method Details

.decode_notify_data(encryptkey_arg, data_arg, config) ⇒ Hash

解析异步通知的数据

Parameters:

  • encryptkey_arg (String)

    加密字符串

  • data_arg (String)

    加密数据

  • config (hash)

    配置信息

Returns:

  • (Hash)

    结果集

    • :version [String] api 版本

    • :service [String] 富民服务

    • :sign [String] 签名

    • :signType [String] 签名类型

    • :data_valid [Boolean] 是否通过验签

    • :resData: 如果返回正确结果

      * :orderNo [String] 发标订单号
      * :resultCode [String] 结果代码
      * 等其他各自业务参数
      
    • :resError: 如果返回错误结果

      * :service [String]
      * :orderNo [String]
      * :errorCode [String]
      * :errorMsg [String]
      


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/reapal/http/decode.rb', line 30

def self.decode_notify_data(encryptkey_arg, data_arg, config)
  # 1. 拿到用来加密的16位随机字符串
  random_key = Encrypt::RSA.decrypt(encryptkey_arg,
                                    config[:private_key])

  # 2. 用16位随机字符串解密返回的数据
  data_string = Encrypt::AES.decrypt(data_arg, random_key)

  data = Utils.symbolize_keys(JSON.parse(data_string))
  if !data[:resData].nil?
    data[:resData] = Utils.symbolize_keys(JSON.parse(data[:resData]))
    sign_str = data[:resData].to_json
  elsif !data[:resError].nil?
    data[:resError] = Utils.symbolize_keys(JSON.parse(data[:resError]))
    sign_str = data[:resError].to_json
  end

  # 3. 验签
  if data[:sign].nil? # sign 有的时候有,有的时候没有(已经发现错误信息返回时候有这种现象)
    data[:data_valid] = true
  else
    if Sign::MD5.verify?(sign_str, config[:md5_key], data[:sign])
      data[:data_valid] = true
    else
      data[:data_valid] = false
    end
  end

  data
end