lib/reapal/http/decode.rb in reapal-0.9.0 vs lib/reapal/http/decode.rb in reapal-0.9.1
- old
+ new
@@ -1,22 +1,52 @@
# coding: utf-8
module Reapal
module Http
module Decode
+ # 解析异步通知的数据
+ #
+ # @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]
+ #
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))
- data[:resData] = Utils.symbolize_keys(JSON.parse(data[:resData]))
+ 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. 验签,错误时候 sign 是没有值的
- if data[:resData][:errorCode] || (data[:sign] && Sign::MD5.verify?(data[:resData].to_json, config[:md5_key], data[:sign]))
+ if Sign::MD5.verify?(sign_str, config[:md5_key], data[:sign])
data[:data_valid] = true
else
data[:data_valid] = false
end