module Reapal::Http::Decode

Public Class Methods

decode_notify_data(encryptkey_arg, data_arg, config) click to toggle source

解析异步通知的数据

@param encryptkey_arg [String] 加密字符串 @param data_arg [String] 加密数据 @param config [hash] 配置信息

@return [ 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]
# 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