umf_pay_service_ruby 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,260 @@
1
+ # UmfRegexUtil
2
+ # author : zhaoyingxin
3
+
4
+
5
+ # 订单查询数据字段
6
+ PLATTOMER_QUERYTRANS_FIELD = "merId,goodsId,orderId,merDate,payDate,amount,amtType,bankType,mobileId,gateId,transType,transState,settleDate,bankCheck,merPriv,retCode,version,sign"
7
+ # 商户撤销交易数据字段
8
+ PLATTOMER_REVOKE_FIELD = "merId,amount,retCode,retMsg,version,sign"
9
+ # 商户退费交易数据字段
10
+ PLATTOMER_REFUND_FIELD = "merId,refundNo,amount,retCode,retMsg,version,sign"
11
+ # 后台直连数据字段
12
+ PLATTOMER_DIRECTREQPAY_FIELD = "merId,goodsId,orderId,merDate,retCode,retMsg,version,sign"
13
+ # 2011-10-14 add by xiajiajia
14
+ # 一般支付请求
15
+ PAY_REQ_RULE = "service,charset,mer_id,sign_type,version,order_id,mer_date,amount,amt_type,notify_url,goods_inf"
16
+ # IVR支付方式下单
17
+ PAY_REQ_IVR_CALL_RULE = "service,charset,mer_id,sign_type,version,order_id,mer_date,amount,amt_type"
18
+ # IVR转呼方式下单
19
+ PAY_REQ_IVR_TCALL_RULE = "service,charset,mer_id,sign_type,version,order_id,mer_date,amount,amt_type"
20
+ # 商户查询订单状态
21
+ QUERY_ORDER_RULE = "service,charset,sign_type,mer_id,version,mer_date"
22
+ # 商户撤销交易
23
+ MER_CANCEL_RULE = "service,charset,sign_type,mer_id,version,order_id,mer_date,amount"
24
+ # 商户退费
25
+ MER_REFUND_RULE = "service,charset,sign_type,mer_id,version,refund_no,order_id,mer_date,org_amount" #,refund_amount
26
+ # 下载对账文件
27
+ DOWNLOAD_SETTLE_FILE_RULE = "service,sign_type,mer_id,version,settle_date"
28
+ # 分账前端支付请求
29
+ PAY_REQ_SPLIT_FRONT_RULE = "service,charset,mer_id,sign_type,version,order_id,mer_date,amount,amt_type"
30
+ # 分账后端支付请求
31
+ PAY_REQ_SPLIT_BACK_RULE = "service,charset,mer_id,sign_type,version,order_id,mer_date,amount,amt_type"
32
+ # 分账退费
33
+ SPLIT_REFUND_REQ_RULE = "service,charset,mer_id,sign_type,version,refund_no,order_id,mer_date,refund_amount,org_amount,sub_mer_id,sub_order_id"
34
+ # 直连网银
35
+ PAY_REQ_SPLIT_DIRECT_RULE = "service,charset,mer_id,sign_type,version,order_id,mer_date,amount,amt_type"
36
+ # 交易结果通知
37
+ PAY_RESULT_NOTIFY_RULE = "service,charset,mer_id,sign_type,version,trade_no,order_id,mer_date,pay_date,amount,amt_type,pay_type,settle_date,trade_state"
38
+ # 分账结果通知
39
+ SPLIT_REQ_RESULT_RULE = "service,charset,mer_id,sign_type,version,order_id,mer_date,is_success"
40
+ # 分账退费结果通知
41
+ SPLIT_REFUND_RESULT_RULE = "service,charset,sign_type,mer_id,version,refund_no,order_id,mer_date"#,refund_amount,org_amount,refund_amt,sub_mer_id,sub_order_id,sub_refund_amt,is_success
42
+ # 信用卡直连
43
+ CREDIT_DIRECT_PAY_RULE = "service,charset,mer_id,sign_type,version,order_id,mer_date,amount,amt_type,pay_type,card_id,valid_date,cvv2"
44
+ # 借记卡直连
45
+ DEBIT_DIRECT_PAY_RULE = "service,charset,mer_id,sign_type,version,order_id,mer_date,amount,amt_type,pay_type,card_id"
46
+ # 预授权直连申请
47
+ PRE_AUTH_DIRECT_REQ = "service,charset,mer_id,sign_type,version,order_id,mer_date,media_id,media_type,amount,amt_type,pay_type,card_id,valid_date,cvv2"
48
+ # 预授权完成
49
+ PRE_AUTH_DIRECT_PAY = "service,charset,mer_id,sign_type,version,order_id,trade_no,mer_date,amount,amt_type,pay_type"
50
+ # 预授权撤销
51
+ PRE_AUTH_DIRECT_CANCEL = "service,charset,mer_id,sign_type,version,order_id,trade_no,mer_date"
52
+ # 银行卡转账注册
53
+ PAY_TRANSFER_REGISTER = "service,charset,mer_id,res_format,version,sign_type,req_date,req_time,media_type,media_id,identity_type,identity_code,cust_name"
54
+ # 银行卡转账申请
55
+ PAY_TRANSFER_REQ = "service,charset,mer_id,ret_url,notify_url,res_format,version,sign_type,order_id,mer_date,req_time,media_id,media_type,amount,fee_amount,recv_account_type,recv_bank_acc_pro,recv_account,recv_user_name,recv_gate_id,recv_type,purpose"
56
+ # 银行卡转账订单查询
57
+ PAY_TRANSFER_ORDER_QUERY = "service,charset,mer_id,res_format,version,sign_type,order_id,mer_date"
58
+ # 银行卡转账退费
59
+ PAY_TRANSFER_MER_REFUND = "service,charset,mer_id,res_format,version,sign_type,refund_no,order_id,mer_date"
60
+ # 预授权查询
61
+ PRE_AUTH_DIRECT_QUERY = "service,charset,mer_id,sign_type,version,order_id,mer_date"
62
+ # 预授权退费
63
+ PRE_AUTH_DIRECT_REFUND = "service,charset,sign_type,mer_id,version,order_id,mer_date,refund_no,refund_amount,org_amount"
64
+ # 预授权下载对账文件
65
+ PRE_AUTH_DIRECT_SETTLE = "service,sign_type,mer_id,version,settle_date"
66
+ # 实名认证
67
+ CARD_AUTH = "service,charset,mer_id,sign_type,version,mer_date,card_id"
68
+ # 信用卡API快捷---获取短信验证码
69
+ REQ_SMS_VERIFYCODE = "service,mer_id,charset,sign_type,version,trade_no,media_id,media_type"
70
+ # 信用卡API快捷---确认支付
71
+ PAY_CONFIRM = "service,mer_id,charset,sign_type,version,trade_no,pay_category,card_id"
72
+ # 一键快捷--前端请求
73
+ PAY_REQ_SHORTCUT_FRONT = "service,charset,mer_id,sign_type,version,order_id,mer_date,amount,amt_type,pay_type,gate_id"
74
+ # 一键快捷--API下单
75
+ PAY_REQ_SHORTCUT = "service,charset,mer_id,sign_type,version,order_id,mer_date,amount,amt_type"
76
+ # 一键快捷--(首次支付)确认支付
77
+ FIRST_PAY_CONFIRM_SHORTCUT = "service,mer_id,charset,sign_type,version,trade_no,media_id,media_type,card_id"
78
+ # 一键快捷--(协议支付)确认支付
79
+ AGREEMENT_PAY_CONFIRM_SHORTCUT = "service,mer_id,charset,sign_type,version,trade_no,usr_pay_agreement_id"
80
+ # 一键快捷--获取短信验证码
81
+ REQ_SMSVERIFY_SHORTCUT = "service,mer_id,sign_type,version,trade_no"
82
+ # 一键快捷--查询商户支持的银行列表
83
+ QUERY_MER_BANK_SHORTCUT = "service,sign_type,charset,mer_id,version,pay_type"
84
+ # 一键快捷--查询用户签约的银行列表
85
+ QUERY_MERCUST_BANK_SHORTCUT = "service,sign_type,charset,mer_id,version,pay_type"
86
+ # 一键快捷--商户解除用户关联
87
+ UNBIND_MERCUST_PROTOCOL_SHORTCUT = "service,sign_type,charset,mer_id,version"
88
+ # 分账项目--分账指令
89
+ SPLIT_REQ_RULE = "service,charset,mer_id,sign_type,version,order_id,mer_date"
90
+ # 分账项目--分账状态查询
91
+ QUERY_SPLIT_ORDER_RULE = "service,sign_type,charset,mer_id,version,order_id,mer_date"
92
+ # 付款API直连--付款请求
93
+ TRANSFER_DIRECT_REQ_RULE = "service,charset,mer_id,version,sign_type,order_id,mer_date,amount,recv_account_type,recv_bank_acc_pro,recv_account,recv_user_name"
94
+ # 付款API直连--付款查询
95
+ TRANSFER_QUERY_RULE = "service,charset,mer_id,version,sign_type,order_id,mer_date"
96
+ # 历史订单查询
97
+ MER_ORDER_INFO_QUERY = "service,sign_type,charset,mer_id,version,mer_date"#order_id,trade_no
98
+ # 退费订单状态查询
99
+ MER_REFUND_QUERY = "service,sign_type,charset,mer_id,version,refund_no"
100
+ # 聚合支付--微信、支付宝扫码支付
101
+ ACTIVE_SCANCODE_ORDER = "service,charset,mer_id,sign_type,notify_url,version,goods_inf,order_id,mer_date,amount,amt_type,scancode_type"
102
+ ACTIVE_SCANCODE_ORDER_NEW = "service,charset,mer_id,sign_type,notify_url,version,goods_inf,order_id,mer_date,amount,amt_type,scancode_type"
103
+
104
+ # 聚合支付--微信、支付宝被扫
105
+ PASSIVE_SCANCODE_PAY = "service,charset,mer_id,sign_type,notify_url,version,goods_inf,order_id,mer_date,amount,amt_type,auth_code,use_desc,scancode_type"
106
+ # 付款--查询结算账户余额
107
+ QUERY_ACCOUNT_BALANCE = "service,charset,mer_id,version,sign_type"
108
+ # 公共验证产品
109
+ COMM_AUTH = "service,charset,mer_id,sign_type,version,auth_type,order_id"
110
+
111
+ # 快捷支付2.2产品-下单
112
+ QUICK_PAY = "service,charset,mer_id,sign_type,version,order_id,notify_url,order_id,mer_date,amount,amt_type,pay_type,gate_id"
113
+ # 商户向平台请求获取短信验证码
114
+ GET_MESSAGE = "service,charset,mer_id,sign_type,version,trade_no,media_id,media_type"
115
+ # 快捷支付中的确认支付
116
+ QUICK_PAY_FIRST = "service,charset,mer_id,sign_type,version,trade_no,trade_no,verify_code,media_type,media_id"
117
+ # 获取商户支持的银行列表
118
+ GET_BANK_MER = "service,charset,mer_id,sign_type,version,pay_type"
119
+ # 快捷支付解约列表
120
+ CANCEL_SURRENDER = "service,charset,mer_id,sign_type,version"
121
+ #王群
122
+ # 退费消息补录
123
+ REFUND_INFO_REPLENISH = "service,charset,mer_id,sign_type,version,refund_no,card_holder,card_id"
124
+ # 一键快捷API绑定申请
125
+ REQ_BIND_VERIFY_SHORCUT = "service,mer_id,sign_type,version,media_type,media_id,card_id"
126
+ # 一键快捷API绑定确认
127
+ REQ_BIND_CONFIRM_SHORCUT = "service,mer_id,sign_type,charset,version,media_type,media_id,card_id"
128
+ # 一键快捷绑定结果通知
129
+ BIND_AGREEMENT_NOTIFY_SHORCUT = "service,mer_id,sign_type,version,mer_cust_id,media_type,media_id,usr_busi_agreement_id,usr_pay_agreement_id,gate_id,last_four_cardid,bank_card_type"
130
+ # 一键快捷前台绑定请求
131
+ BIND_REQ_SHORTCUT_FRONT = "service,mer_id,sign_type,charset,version,pay_type,gate_id,mer_cust_id"
132
+
133
+
134
+
135
+ ServiceRule = {
136
+ 'pay_req'=>PAY_REQ_RULE,
137
+ 'query_order'=>QUERY_ORDER_RULE,
138
+ 'mer_cancel'=>MER_CANCEL_RULE,
139
+ 'mer_refund'=>MER_REFUND_RULE,
140
+ 'download_settle_file'=>DOWNLOAD_SETTLE_FILE_RULE,
141
+ 'split_refund_req'=>SPLIT_REFUND_REQ_RULE,
142
+ 'query_mer_bank_shortcut'=>QUERY_MER_BANK_SHORTCUT,
143
+ 'unbind_mercust_protocol_shortcut'=>UNBIND_MERCUST_PROTOCOL_SHORTCUT,
144
+ 'transfer_direct_req'=>TRANSFER_DIRECT_REQ_RULE,
145
+ 'transfer_query'=>TRANSFER_QUERY_RULE,
146
+ 'mer_order_info_query'=>MER_ORDER_INFO_QUERY,
147
+ 'mer_refund_query'=>MER_REFUND_QUERY,
148
+ 'active_scancode_order'=>ACTIVE_SCANCODE_ORDER,
149
+ 'active_scancode_order_new'=>ACTIVE_SCANCODE_ORDER_NEW,
150
+ 'passive_scancode_pay'=>PASSIVE_SCANCODE_PAY,
151
+ 'query_account_balance'=>QUERY_ACCOUNT_BALANCE,
152
+ 'comm_auth'=>COMM_AUTH,
153
+ 'apply_pay_shortcut'=>QUICK_PAY,
154
+ 'sms_req_shortcut'=>GET_MESSAGE,
155
+ 'confirm_pay_shortcut'=>QUICK_PAY_FIRST,
156
+ 'refund_info_replenish'=>REFUND_INFO_REPLENISH,
157
+ }
158
+
159
+
160
+
161
+ ReqRule = {
162
+ 'service'=>"^[a-zA-Z0-9_]{1,32}$",
163
+ 'charset'=>"^(UTF-8|GBK|GB2312|GB18030)$",
164
+ 'mer_id'=>"^[0-9]{1,8}$",
165
+ 'sign_type'=>"^RSA$",
166
+ 'version'=>"^(4.0|1.0)$",
167
+ 'media_type'=>"^(MOBILE|EMAIL|MERUSERID)$",
168
+ 'order_id'=>"^\S{1,32}$",
169
+ 'mer_date'=>"^[1-2][0-9]{7}$",
170
+ 'amount'=>"^[1-9][0-9]*$",
171
+ 'amt_type'=>"^RMB$",
172
+ 'expire_time'=>"^[0-9]{1,32}$",
173
+ 'ret_code'=>"^[0-9]+$",
174
+ 'trade_no'=>"^[0-9]{1,16}$",
175
+ 'pay_date'=>"^[1-2][0-9]{7}$",
176
+ 'settle_date'=>"^[1-2][0-9]{7}$",
177
+ 'error_code'=>"^[0-9]*$",
178
+ 'mer_check_date'=>"^[1-2][0-9]{7}$",
179
+ 'refund_amt'=>"^[1-9][0-9]*$",
180
+ 'refund_amount'=>"^[1-9][0-9]*$",
181
+ 'org_amount'=>"^[1-9][0-9]*$",
182
+ 'split_type'=>"^[1-2]{0,2}$",
183
+ 'is_success'=>"^(Y|N)$",
184
+ 'sub_mer_id'=>"^[0-9]*$",
185
+ 'req_date'=>"^[1-2][0-9]{7}$",
186
+ 'req_time'=>"^[0-9]{6}$",
187
+ 'birthday'=>"^[1-2][0-9]{7}$",
188
+ 'sex'=>"^(M|F)$",
189
+ 'contact_mobile'=>"^[0-9]{11}$",
190
+ 'fee_amount'=>"^(0|[1-9][0-9]*)$",
191
+ 'recv_account_type'=>"^[0-1]{2}$",
192
+ 'recv_bank_acc_pro'=>"^[0-1]{1}$",
193
+ 'recv_type'=>"^[0-1]$",
194
+ 'debit_pay_type'=>"^(1|2)$",
195
+ 'pay_category'=>"^01$",
196
+ 'split_category'=>"^(1|2|3)$",
197
+ 'push_type'=>"^(0|1|2|3)$",
198
+ 'order_type'=>"^(1|2)$",
199
+ 'sign'=>"^\S+$",
200
+ 'res_format'=>'^HTML$', # "^\S+$",
201
+ 'goods_inf'=>"^\S+$",
202
+ 'token'=>"^\S+$",
203
+ 'trade_state'=>"^\S{1,32}$",
204
+ 'refund_no'=>"^\S{1,16}$",
205
+ 'refund_state'=>"^\S+$",
206
+ 'sub_order_id'=>"^\S{1,32}$",
207
+ 'refund_desc'=>"^\S{1,128}$",
208
+ 'valid_date'=>"^\S{1,256}$",
209
+ 'cvv2'=>"^\S{1,256}$",
210
+ 'mail_addr'=>"^\S{1,64}$",
211
+ 'contact_phone'=>"^\S+$",
212
+ 'finance_vou_no'=>"^\S{1,32}$",
213
+ 'purpose'=>"^\S+$",
214
+ 'prov_name'=>"^\S+$",
215
+ 'city_name'=>"^\S+$",
216
+ 'bank_brhname'=>"^\S+$",
217
+ 'ret_url'=>"^\S*$",
218
+ 'notify_url'=>"^\S*$",
219
+ 'goods_id'=>"^\S*$",
220
+ 'media_id'=>"^\S+$",
221
+ 'mobile_id'=>"^\S{0,11}$",
222
+ 'pay_type'=>"^\S*$",
223
+ 'gate_id'=>"^\S*$",
224
+ 'mer_priv'=>"^\S*$",
225
+ 'user_ip'=>"^\S*$",
226
+ 'expand'=>"^\S*$",
227
+ 'ret_msg'=>"^\S*$",
228
+ 'pay_seq'=>"^\S*$",
229
+ 'bank_check_state'=>"^\S*$",
230
+ 'product_id'=>"^\S*$",
231
+ 'mer_trace'=>"^\S*$",
232
+ 'split_data'=>"^\S*$",
233
+ 'card_id'=>"^\S{0,256}$",
234
+ 'pass_wd'=>"^\S{0,256}$",
235
+ 'identity_type'=>"^\S{0,256}$",
236
+ 'identity_code'=>"^\S{0,256}$",
237
+ 'card_holder'=>"^\S{0,256}$",
238
+ 'cust_name'=>"^\S{0,32}$",
239
+ 'recv_account'=>"^\S*$",
240
+ 'recv_user_name'=>"^\S*$",
241
+ 'recv_gate_id'=>"^\S*$",
242
+ 'verify_code'=>"^\S{0,8}$",
243
+ 'mer_cust_id'=>"^\S{0,32}$",
244
+ 'usr_busi_agreement_id'=>"^\S{0,64}$",
245
+ 'usr_pay_agreement_id'=>"^\S{0,64}$",
246
+ 'identity_holder'=>"^\S{0,256}$",
247
+ 'split_refund_list'=>"^\S*$",
248
+ 'split_cmd'=>"^\S*$",
249
+ 'settle_type'=>"^\S*$",
250
+ #新增
251
+ 'scancode_type'=>"WECHAT|ALIPAY",
252
+ 'auth_code'=>"",
253
+ 'use_desc'=>"",
254
+ # "last_four_cardid'=>"[0-9]{4}",4,false),
255
+ 'bank_account'=>"",
256
+ 'account_name'=>"",
257
+ # "bank_card_type'=>"",16,false),
258
+ }
259
+
260
+
@@ -0,0 +1,70 @@
1
+ # ReqDataUtil
2
+ # author : zhaoyingxin
3
+
4
+ require 'UmfLogger'
5
+ require 'UmfCheckReqDataAndEncrypt'
6
+ require 'UmfStringUtil'
7
+ require 'UmfCommon'
8
+
9
+
10
+ class UmfReqDataUtil
11
+
12
+ # 组织请求数据
13
+ def makeRequestData(params, method)
14
+ UmfLogger.logInfoMsg("--------------------log start---------------------")
15
+ funcode = params["service"]
16
+ UmfLogger.logInfoMsg("[UMF SDK]本次请求 service = " + funcode)
17
+ # UmfLogger.logInfoMsg("[UMF SDK]本次请求原始参数 " + params.to_s)
18
+ # 对请求数据进行有效性验证
19
+ UmfCheckReqDataAndEncrypt.new.doCheck(params)
20
+ # 敏感字段加密
21
+ params = UmfCheckReqDataAndEncrypt.new.doEncrypt(params)
22
+ # 获取请求数据签名密文串
23
+ sign = getSignData(params)
24
+ UmfLogger.logInfoMsg("[UMF SDK]本次请求方式 " + method)
25
+ # 获取平台URL
26
+ url = UMF_PAY_REQ_URL
27
+ reqData = ReqData.new
28
+ if method == UMF_METHOD_GET # 获取GET方式请求数据对象
29
+ param = UmfStringUtil.new.getPlainSortByAndWithSignType(params)
30
+ # reqData.setUrl(url + "?" + param + "&sign=" + URI::encode(sign))
31
+ reqData.setUrl(url + "?" + param + "&sign=" + CGI.escape(sign))
32
+ elsif method == UMF_METHOD_POST # 获取POST方式请求数据对象
33
+ reqData.setUrl(url)
34
+ params = params.merge({"sign"=>CGI.escape(sign)})
35
+ reqData.setField(params)
36
+ UmfLogger.logInfoMsg("[UMF SDK]本次请求原始参数处理后参数 " + params.to_s)
37
+ end
38
+ return reqData
39
+ end
40
+
41
+
42
+ private
43
+ # 获取签名密文串
44
+ def getSignData(params)
45
+ plain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(params)
46
+ merId = params["mer_id"]
47
+ sign = UmfRSACryptUtil.new.sign(plain, merId,"sha1")
48
+ return sign
49
+ end
50
+
51
+ end
52
+
53
+
54
+ class ReqData
55
+ @url
56
+ @field
57
+ def setUrl(url)
58
+ @url = url
59
+ end
60
+ def setField(field)
61
+ @field = field
62
+ end
63
+ def getUrl
64
+ return @url
65
+ end
66
+ def getField
67
+ return @field
68
+ end
69
+ end
70
+
@@ -0,0 +1,801 @@
1
+ # UmfService
2
+ # author : zhaoyingxin
3
+
4
+
5
+ require 'json'
6
+ require 'UmfMerToPlat'
7
+ require 'UmfHttp'
8
+ require 'UmfConfig'
9
+
10
+
11
+ # 全局变量 从定义时开始,直到程序结束
12
+ $merId = {}
13
+ $privateKeyPath = {}
14
+ # 子商户入网
15
+ $spayRestPayAccessToken = '' # token
16
+ $spayRestPayAccessTokenTime = 0 # token获取时间戳
17
+ $spayRestPayExpiresIn = 0 # token有效时长
18
+
19
+
20
+ class UmfService
21
+
22
+ # 构造方法
23
+ def initialize merId,privateKeyPath
24
+ if merId==nil || merId==''
25
+ return
26
+ end
27
+ if privateKeyPath==nil || privateKeyPath==''
28
+ return
29
+ end
30
+ $merId = $merId.merge({merId=>merId})
31
+ $privateKeyPath = $privateKeyPath.merge(merId=>privateKeyPath)
32
+ end
33
+
34
+
35
+ # Web收银台
36
+ # Web收银台—生成get后的请求参数,商户只需要拼接URL进行get请求即可
37
+ def WebFrontPagePayMap(params)
38
+ pubParams = publicParams
39
+ param = pubParams.merge params
40
+ service = {"service" => "req_front_page_pay"}
41
+ param = param.merge service
42
+ reqDataGet = UmfMerToPlat.new.makeRequestDataByGet(param)
43
+ get_url = reqDataGet.getUrl
44
+ UmfLogger.logInfoMsg("[UMF SDK] Web收银台 请求 service = req_front_page_pay 生成的getUrl = " + get_url)
45
+ return get_url
46
+ end
47
+
48
+
49
+ # H5收银台
50
+ # H5收银台—生成get后的请求参数,商户只需要拼接URL进行get请求即可
51
+ def H5FrontPageMap(params)
52
+ pubParams = publicParams
53
+ param = pubParams.merge params
54
+ service = {"service" => "pay_req_h5_frontpage"}
55
+ param = param.merge service
56
+ reqDataGet = UmfMerToPlat.new.makeRequestDataByGet(param)
57
+ get_url = reqDataGet.getUrl
58
+ UmfLogger.logInfoMsg("[UMF SDK] H5收银台 请求 service = pay_req_h5_frontpage 生成的getUrl = " + get_url)
59
+ return get_url
60
+ end
61
+
62
+
63
+ # 公众号支付
64
+ # 公众号支付–生成get后的请求参数,商户只需要拼接URL进行get请求即可
65
+ def PublicPaymentMap(params)
66
+ pubParams = publicParams
67
+ param = pubParams.merge params
68
+ service = {"service" => "publicnumber_and_verticalcode"}
69
+ param = param.merge service
70
+ reqDataGet = UmfMerToPlat.new.makeRequestDataByGet(param)
71
+ get_url = reqDataGet.getUrl
72
+ UmfLogger.logInfoMsg("[UMF SDK] 公众号支付 请求 service = publicnumber_and_verticalcode 生成的getUrl = " + get_url)
73
+ return get_url
74
+ end
75
+
76
+
77
+ # 收款 : 网银直连
78
+ # 网银直连SDK提供请求的最终URL生成,商户可以直接加载URL调起对应的支付方式
79
+ def pBankDirectMap(params)
80
+ pubParams = publicParams
81
+ param = pubParams.merge params
82
+ service = {"service" => "pay_req_split_direct"}
83
+ param = param.merge service
84
+ reqDataGet = UmfMerToPlat.new.makeRequestDataByGet(param)
85
+ get_url = reqDataGet.getUrl
86
+ UmfLogger.logInfoMsg("[UMF SDK] 网银直连 请求 service = pay_req_split_direct 生成的getUrl = " + get_url)
87
+ return get_url
88
+ end
89
+
90
+
91
+ # 收款 : 借记卡直连
92
+ def debitDirectMap(params)
93
+ pubParams = publicParams
94
+ param = pubParams.merge params
95
+ service = {"service"=>"debit_direct_pay" , "pay_type"=>"DEBITCARD"}
96
+ param = param.merge service
97
+ return plainSortByAndPost(param)
98
+ end
99
+
100
+
101
+ # 收款—信用卡直连
102
+ def creditDirectMap(params)
103
+ pubParams = publicParams
104
+ param = pubParams.merge params
105
+ service = {"service" => "credit_direct_pay" , "pay_type" => "CREDITCARD"}
106
+ param = param.merge service
107
+ return plainSortByAndPost(param)
108
+ end
109
+
110
+
111
+ # 收款 : 扫码支付 主扫支付
112
+ def activeScanPaymentMap(params)
113
+ pubParams = publicParams
114
+ param = pubParams.merge params
115
+ service = {"service" => "active_scancode_order"}
116
+ param = param.merge service
117
+ return plainSortByAndPost(param)
118
+ end
119
+
120
+ # 收款 : 扫码支付 主扫支付
121
+ def activeNewScanPaymentMap(params)
122
+ pubParams = publicParams
123
+ param = pubParams.merge params
124
+ service = {"service" => "active_scancode_order_new"}
125
+ param = param.merge service
126
+ return plainSortByAndPost(param)
127
+ end
128
+
129
+
130
+ # H5直连-范围URL地址
131
+ def H5AutoConnectMap(params)
132
+ pubParams = publicParams
133
+ param = pubParams.merge params
134
+ service = {"service"=>"active_scancode_order_new" , "auto_pay" => "TRUE"}
135
+ param = param.merge service
136
+ reqDataGet = UmfMerToPlat.new.makeRequestDataByGet(param)
137
+ get_url = reqDataGet.getUrl
138
+ UmfLogger.logInfoMsg("[UMF SDK] 公众号支付 请求 service = active_scancode_order_new 生成的getUrl = " + get_url)
139
+ return get_url
140
+ end
141
+
142
+
143
+ # H5直连-返回请求参数
144
+ def H5ConnectMap(params)
145
+ pubParams = publicParams
146
+ param = pubParams.merge params
147
+ service = {"service" => "active_scancode_order_new"}
148
+ param = param.merge service
149
+ return plainSortByAndPost(param)
150
+ end
151
+
152
+
153
+ # 被扫支付
154
+ def passiveScanPaymentMap(params)
155
+ pubParams = publicParams
156
+ param = pubParams.merge params
157
+ service = {"service" => "passive_scancode_pay"}
158
+ param = param.merge service
159
+ return plainSortByAndPost(param)
160
+ end
161
+
162
+
163
+ # 收款---快捷支付下单方法
164
+ def quickPayOrderMap(params)
165
+ pubParams = publicParams
166
+ param = pubParams.merge params
167
+ service = {"service" => "apply_pay_shortcut"}
168
+ param = param.merge service
169
+ return plainSortByAndPost(param)
170
+ end
171
+
172
+
173
+ # 收款---快捷支付向平台获取短信验证码方法
174
+ def quickGetMessageMap(params)
175
+ pubParams = publicParams
176
+ param = pubParams.merge params
177
+ service = {"service" => "sms_req_shortcut"}
178
+ param = param.merge service
179
+ return plainSortByAndPost(param)
180
+ end
181
+
182
+
183
+ # 收款---快捷支付确认支付
184
+ def quickPayConfirmMap(params)
185
+ pubParams = publicParams
186
+ param = pubParams.merge params
187
+ service = {"service" => "confirm_pay_shortcut"}
188
+ param = param.merge service
189
+ return plainSortByAndPost(param)
190
+ end
191
+
192
+
193
+ # 收款---快捷支付获取银行卡列表
194
+ def quickQuerybankSupportMap(params)
195
+ pubParams = publicParams
196
+ param = pubParams.merge params
197
+ service = {"service" => "query_mer_bank_shortcut"}
198
+ param = param.merge service
199
+ return plainSortByAndPost(param)
200
+ end
201
+
202
+
203
+ # 收款---快捷支付解约
204
+ def quickCancelSurrenderMap(params)
205
+ pubParams = publicParams
206
+ param = pubParams.merge params
207
+ service = {"service" => "unbind_mercust_protocol_shortcut"}
208
+ param = param.merge service
209
+ return plainSortByAndPost(param)
210
+ end
211
+
212
+
213
+
214
+ # 订单查询---查询历史订单方法
215
+ def queryhistoryOrderMap(params)
216
+ pubParams = publicParams
217
+ param = pubParams.merge params
218
+ service = {"service" => "mer_order_info_query"}
219
+ param = param.merge service
220
+ return plainSortByAndPost(param)
221
+ end
222
+
223
+
224
+ # 订单查询---查询当天订单状态
225
+
226
+ def querytodayOrderMap(params)
227
+ pubParams = publicParams
228
+ param = pubParams.merge params
229
+ service = {"service" => "query_order"}
230
+ param = param.merge service
231
+ return plainSortByAndPost(param)
232
+ end
233
+
234
+
235
+ # 撤销---撤销方法
236
+ def cancelTradeMap(params)
237
+ pubParams = publicParams
238
+ param = pubParams.merge params
239
+ service = {"service" => "mer_cancel"}
240
+ param = param.merge service
241
+ return plainSortByAndPost(param)
242
+ end
243
+
244
+
245
+ # 退款---普通退款方法
246
+ def generalRefundMap(params)
247
+ pubParams = publicParams
248
+ param = pubParams.merge params
249
+ service = {"service" => "mer_refund"}
250
+ param = param.merge service
251
+ return plainSortByAndPost(param)
252
+ end
253
+
254
+
255
+ # 退款---批量转账退费请求
256
+ def massTransferRefundMap(params)
257
+ pubParams = publicParams
258
+ param = pubParams.merge params
259
+ service = {"service" => "split_refund_req"}
260
+ param = param.merge service
261
+ return plainSortByAndPost(param)
262
+ end
263
+
264
+
265
+ # 退款---退款状态查询方法
266
+ def queryRefundStateMap(params)
267
+ pubParams = publicParams
268
+ param = pubParams.merge params
269
+ service = {"service" => "mer_refund_query"}
270
+ param = param.merge service
271
+ return plainSortByAndPost(param)
272
+ end
273
+
274
+
275
+ # 退款---退费信息补录方法
276
+ def remedyRefundInformationMap(params)
277
+ pubParams = publicParams
278
+ param = pubParams.merge params
279
+ service = {"service" => "refund_info_replenish"}
280
+ param = param.merge service
281
+ return plainSortByAndPost(param)
282
+ end
283
+
284
+
285
+ # 付款---下单
286
+ def paymentOrderMap(params)
287
+ pubParams = publicParams
288
+ param = pubParams.merge params
289
+ service = {"service" => "transfer_direct_req"}
290
+ param = param.merge service
291
+ return plainSortByAndPost(param)
292
+ end
293
+
294
+
295
+ # 付款---付款状态查询
296
+ def queryPaymentStatusMap(params)
297
+ pubParams = publicParams
298
+ param = pubParams.merge params
299
+ service = {"service" => "transfer_query"}
300
+ param = param.merge service
301
+ return plainSortByAndPost(param)
302
+ end
303
+
304
+
305
+ # 付款---余额查询
306
+ def queryAccountBalanceMap(params)
307
+ pubParams = publicParams
308
+ param = pubParams.merge params
309
+ service = {"service" => "query_account_balance"}
310
+ param = param.merge service
311
+ return plainSortByAndPost(param)
312
+ end
313
+
314
+
315
+ # E秒付
316
+ def epaymentOrderMap(params)
317
+ pubParams = publicParams
318
+ param = pubParams.merge params
319
+ service = {"service" => "epay_direct_req"}
320
+ param = param.merge service
321
+ return plainSortByAndPost(param)
322
+ end
323
+
324
+
325
+ # 立码付API
326
+ def publicVerticalMap(params)
327
+ pubParams = publicParams
328
+ param = pubParams.merge params
329
+ service = {"service" => "verticalcode_order"}
330
+ param = param.merge service
331
+ return plainSortByAndPost(param)
332
+ end
333
+
334
+
335
+ # 鉴权---借记卡实名认证
336
+ def debitCardAuthenticationMap(params)
337
+ pubParams = publicParams
338
+ param = pubParams.merge params
339
+ service = {"service" => "comm_auth"}
340
+ param = param.merge service
341
+ param["version"] = "1.0"
342
+ return plainSortByAndPost(param)
343
+ end
344
+
345
+
346
+
347
+ # 鉴权---借记卡实名认证
348
+ def creditCardAuthenticationMap(params)
349
+ pubParams = publicParams
350
+ param = pubParams.merge params
351
+ service = {"service" => "comm_auth"}
352
+ param = param.merge service
353
+ param["version"] = "1.0"
354
+ return plainSortByAndPost(param)
355
+ end
356
+
357
+
358
+ # 鉴权---身份认证
359
+ def identityAuthenticationMap(params)
360
+ pubParams = publicParams
361
+ param = pubParams.merge params
362
+ service = {"service" => "comm_auth"}
363
+ param = param.merge service
364
+ param["version"] = "1.0"
365
+ return plainSortByAndPost(param)
366
+ end
367
+
368
+
369
+ # 对账
370
+ def reconciliationDownloadMap(params)
371
+ pubParams = publicParams
372
+ param = pubParams.merge params
373
+ service = {"service" => "download_settle_file"}
374
+ param = param.merge service
375
+ reqDataPost = UmfMerToPlat.new.makeRequestDataByPost(param)
376
+ post_url = reqDataPost.getUrl
377
+ mapfield = reqDataPost.getField
378
+ output = UmfHttp.new.httpPost(post_url,mapfield)
379
+ bool = writeSettle(params["mer_id"],params["settle_date"],params["settle_path"],output)
380
+ if bool
381
+ puts "[UMF SDK]对账文件写入本地成功"
382
+ return true
383
+ else
384
+ puts "[UMF SDK]对账文件写入本地失败"
385
+ return false
386
+ end
387
+ end
388
+
389
+
390
+ # 异步通知
391
+ def notifyDataParserMap(notifyParamsStr)
392
+ if notifyParamsStr.length<0
393
+ return
394
+ end
395
+ # 联动发送异步通知URL地址后的参数
396
+ notifyParamsArr = notifyParamsStr.split('&')
397
+ map = {}
398
+ sign = ''
399
+ notifyParamsArr.each { |elem|
400
+ arr = elem.split('=',2)
401
+ if arr[0]=='sign'
402
+ sign = CGI.unescape(arr[1])
403
+ next
404
+ elsif arr[0]=='sign_type'
405
+ next
406
+ else
407
+ map[arr[0]] = CGI.unescape(arr[1])
408
+ end
409
+ }
410
+ plain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(map)
411
+ verifyRet = UmfRSACryptUtil.new.verify(plain,sign,'sha1')
412
+ if verifyRet
413
+ puts '[UMF SDK] 平台通知数据验签成功'
414
+ map.delete('version')
415
+ return map
416
+ else
417
+ puts '[UMF SDK] 平台通知数据验签失败'
418
+ end
419
+ end
420
+
421
+
422
+ # 异步通知-商户返回联动字符串拼接
423
+ def responseUMFMap(params)
424
+ merMap = {}
425
+ merMap['mer_date'] = params['mer_date']
426
+ merMap['mer_id'] = params['mer_id']
427
+ merMap['order_id'] = params['order_id']
428
+ merMap['ret_code'] = '0000'
429
+ merMap['ret_msg'] = 'success'
430
+ merMap['version'] = '4.0'
431
+ merPlain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(merMap)
432
+ merSign = UmfRSACryptUtil.new.sign(merPlain,params['mer_id'],'sha1')
433
+ mer2UmfPlatStr = 'mer_date=' + merMap['mer_date'] + '&' +
434
+ 'mer_id=' + merMap['mer_id'] + '&' +
435
+ 'order_id=' + merMap['order_id'] + '&' +
436
+ 'ret_code=0000&ret_msg=success&sign_type=RSA&version=4.0&sign=' + merSign
437
+ return mer2UmfPlatStr
438
+ end
439
+
440
+
441
+ # APP支付下单
442
+ def mobileOrderMap(params)
443
+ pubParams = publicParams
444
+ param = pubParams.merge params
445
+ service = {"service" => "pay_req"}
446
+ param = param.merge service
447
+ return plainSortByAndPost(param)
448
+ end
449
+
450
+
451
+ # APP支付---生成签名
452
+ def mobileGenerateSignMap(params)
453
+ if params['merId']==nil || params['merId']==''
454
+ puts '[UMF SDK]签名参数商户号为空,请传入商户号'
455
+ return
456
+ end
457
+ if params['orderId']==nil || params['orderId']==''
458
+ puts '[UMF SDK]签名参数订单号为空,请传入订单号'
459
+ return
460
+ end
461
+ if params['orderDate']==nil ||params['orderDate']==''
462
+ puts '[UMF SDK]签名参数订单日期为空,请传入订单日期'
463
+ return
464
+ end
465
+ if params['amount']==nil || params['amount']==''
466
+ puts '[UMF SDK]签名参数订单金额为空,请传入订单金额'
467
+ return
468
+ end
469
+ # TODO 正则校验
470
+ merId = params['merId']
471
+ orderId = params['orderId']
472
+ orderDate = params['orderDate']
473
+ amount = params['amount']
474
+ plain = merId + orderId + amount + orderDate
475
+ sign = UmfRSACryptUtil.new.mobileGenerateSign(plain,merId,'sha1')
476
+ return sign
477
+ end
478
+
479
+
480
+ # 传入请求参数,成sign字段
481
+ def generateSign(params)
482
+ plain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(params)
483
+ sign = UmfRSACryptUtil.new.sign(plain,params['mer_id'],'sha1')
484
+ return sign
485
+ end
486
+
487
+
488
+ # 验签方法
489
+ # @param string plain 联动返回明文字符串按序拼接(明文串去除sign_type字段和sign字段)
490
+ # @param string $sign 密文sign字段
491
+ # @return bool
492
+ def verifySign(plain,sign,algorithmType)
493
+ return UmfRSACryptUtil.new.verify(plain,sign,algorithmType)
494
+ end
495
+
496
+
497
+ # 添加私钥
498
+ def UmfService.addMerPrivateCertMap(merId,privateKeyPath)
499
+ $merId = $merId.merge({merId=>merId})
500
+ $privateKeyPath = $privateKeyPath.merge(merId=>privateKeyPath)
501
+ end
502
+
503
+
504
+
505
+ # ----------------------------------------
506
+ # 子商户入网部分
507
+ # ----------------------------------------
508
+ # 子商户入网--获取token方法
509
+ def getTokenMap
510
+ # token在有效期内
511
+ if $spayRestPayAccessTokenTime+$spayRestPayExpiresIn >= Time.new.to_i
512
+ return $spayRestPayAccessToken
513
+ end
514
+
515
+ params = {
516
+ "grant_type"=>"client_credentials",
517
+ "client_id"=>UmfConfig.umf_mer_client_id ,
518
+ "client_secret"=>UmfConfig.umf_mer_client_secret
519
+ }
520
+ UmfLogger.logInfoMsg("--------------------log start---------------------")
521
+ UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求原始参数 " + params.to_s)
522
+ jsonStr = params.to_json
523
+ headers = {'Content-Type' => 'application/json'}
524
+ respObj = UmfHttp.new.httpRequestWithJson(UMF_RESTPAY_AUTHORIZE,true,jsonStr,headers)
525
+ $spayRestPayAccessToken = respObj['access_token']
526
+ $spayRestPayAccessTokenTime = Time.new.to_i # 1970年到指定日期的秒数 当前的秒数
527
+ $spayRestPayExpiresIn = respObj['expires_in'].to_i # 字符串转整数
528
+ return respObj['access_token']
529
+ end
530
+
531
+
532
+ # 子商户入网--添加子商户方法
533
+ def addChildMerInfoMap(params)
534
+ UmfLogger.logInfoMsg("--------------------log start---------------------")
535
+ UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求原始参数 " + params.to_s)
536
+ param = {
537
+ "merId"=>params["merId"],
538
+ "merName"=>UmfRSACryptUtil.new.encrypt(params["merName"]),
539
+ "merType"=>params["merType"],
540
+ "contActsName"=>UmfRSACryptUtil.new.encrypt(params["contActsName"]),
541
+ "mobileNo"=>params["mobileNo"],
542
+ "licenseType"=>params["licenseType"],
543
+ "licenseNo"=>params["licenseNo"],
544
+ "organizationId"=>params["organizationId"],
545
+ "taxPayerNum"=>params["taxPayerNum"],
546
+ "lawyer"=>UmfRSACryptUtil.new.encrypt(params["lawyer"]),
547
+ "cardNo"=>UmfRSACryptUtil.new.encrypt(params["cardNo"]),
548
+ "bankName"=>UmfRSACryptUtil.new.encrypt(params["bankName"]),
549
+ "bankAccount"=>UmfRSACryptUtil.new.encrypt(params["bankAccount"]),
550
+ "province"=>params["province"],
551
+ "areaCode"=>params["areaCode"],
552
+ "merNotifyUrl"=>params["merNotifyUrl"],
553
+ "pubPriFlag"=>params["pubPriFlag"],
554
+ "bankBrhName"=>UmfRSACryptUtil.new.encrypt(params["bankBrhName"]),
555
+ }
556
+ UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求处理后参数 " + param.to_s)
557
+ jsonStr = param.to_json
558
+ signature = UmfRSACryptUtil.new.sign(jsonStr,params["merId"],'sha256')
559
+ headers = {
560
+ "Content-type" => "application/json;charset=utf-8",
561
+ "Signature" => signature,
562
+ "Authorization" => "Bearer"+ getTokenMap
563
+ }
564
+ respObj = UmfHttp.new.httpRequestWithJson(UMF_RESTPAY_ADDCHILDMERINFO,true,jsonStr,headers)
565
+ return respObj
566
+ end
567
+
568
+
569
+ # 子商户入网--上传商户资质方法
570
+ def uploadMerFileMap(params,files)
571
+ UmfLogger.logInfoMsg('--------------------log start---------------------')
572
+ UmfLogger.logInfoMsg('[UMF SDK 子商户入网]本次请求原始参数 ' + params.to_s)
573
+ UmfLogger.logInfoMsg('[UMF SDK 子商户入网]本次请求上传文件 ' + files.to_s)
574
+ jsonStr = params.to_json
575
+ signature = UmfRSACryptUtil.new.sign(jsonStr,params['merId'],'sha256')
576
+ url = UMF_RESTPAY_UPLOADCHILDFILE + '?data=' + CGI.escape(jsonStr)
577
+ body = ""
578
+ boundary = '---------------------' + Time.new.strftime('%Y%m%d')
579
+ files.each{ |elem|
580
+ if !(File.exist?(elem))
581
+ next
582
+ end
583
+ body = body + "\r\n--" + boundary
584
+ data = File.binread(elem)
585
+ v = elem.split('/').last
586
+ body = body + "\r\n" + 'Content-Disposition: form-data; name="file"; filename="' + v + '"' + "\r\n"+
587
+ 'Content-Type: application/octet-stream' + "\r\n" +
588
+ '' + "\r\n" +
589
+ data
590
+ }
591
+ body = body + "\r\n--" + boundary + "--\r\n"
592
+ headers = {
593
+ 'Content-Type'=> 'multipart/form-data; boundary=' + boundary,
594
+ 'Signature' => signature,
595
+ 'Authorization' => 'Bearer' + getTokenMap
596
+ }
597
+ respObj = UmfHttp.new.httpRequestWithJson(url,true,body,headers)
598
+ return respObj
599
+ end
600
+
601
+
602
+
603
+ # 子商户入网--修改子商户信息方法
604
+ def changeChildMerInfoMap(params)
605
+ UmfLogger.logInfoMsg("--------------------log start---------------------")
606
+ UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求原始参数 " + params.to_s)
607
+ param = {
608
+ "merId"=>params["merId"],
609
+ "merName"=>UmfRSACryptUtil.new.encrypt(params["merName"]),
610
+ "merType"=>params["merType"],
611
+ "contActsName"=>UmfRSACryptUtil.new.encrypt(params["contActsName"]),
612
+ "mobileNo"=>params["mobileNo"],
613
+ "licenseType"=>params["licenseType"],
614
+ "licenseNo"=>params["licenseNo"],
615
+ "organizationId"=>params["organizationId"],
616
+ "taxPayerNum"=>params["taxPayerNum"],
617
+ "lawyer"=>UmfRSACryptUtil.new.encrypt(params["lawyer"]),
618
+ "cardNo"=>UmfRSACryptUtil.new.encrypt(params["cardNo"]),
619
+ "bankName"=>UmfRSACryptUtil.new.encrypt(params["bankName"]),
620
+ "bankAccount"=>UmfRSACryptUtil.new.encrypt(params["bankAccount"]),
621
+ "province"=>params["province"],
622
+ "areaCode"=>params["areaCode"],
623
+ "merNotifyUrl"=>params["merNotifyUrl"],
624
+ "pubPriFlag"=>params["pubPriFlag"],
625
+ "bankBrhName"=>UmfRSACryptUtil.new.encrypt(params["bankBrhName"]),
626
+ }
627
+ UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求处理后参数 " + param.to_s)
628
+ jsonStr = param.to_s
629
+ signature = UmfRSACryptUtil.new.sign(jsonStr,params["merId"],'sha256')
630
+ headers = {
631
+ "Content-type" => "application/json;charset=utf-8",
632
+ "Signature" => signature,
633
+ "Authorization" => "Bearer" + getTokenMap
634
+ }
635
+ respObj = UmfHttp.new.httpRequestWithJson(UMF_RESTPAY_CHANGECHILDREBUT,true,jsonStr,headers)
636
+ return respObj
637
+ end
638
+
639
+
640
+ # 子商户入网--查询审核状态方法
641
+ def queryMerStateMap(params)
642
+ UmfLogger.logInfoMsg("--------------------log start---------------------")
643
+ UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求原始参数 " + params.to_s)
644
+ merId = params["merId"]
645
+ licenseNo = params["licenseNo"]
646
+ url = UMF_RESTPAY_SELECTCHILDMERSTATE + "?merId=" + merId + "&licenseNo=" + licenseNo
647
+ headers = {
648
+ "Content-type" => "application/json;charset=utf-8",
649
+ "Authorization" => "Bearer" + getTokenMap
650
+ }
651
+ respObj = UmfHttp.new.httpRequestWithJson(url,false,"",headers)
652
+ return respObj
653
+ end
654
+
655
+
656
+
657
+ # 子商户入网异步通知---联动通知商户数据,SDK解析结果
658
+ def notifyChildParserMap(notifyChildParamsStr)
659
+ if notifyChildParamsStr.length<0
660
+ return
661
+ end
662
+ notifyParamsArr = notifyChildParamsStr.split('&')
663
+ map = {}
664
+ notifyParamsArr.each { |elem|
665
+ arr = elem.split('=',2)
666
+ map[arr[0]] = arr[1]
667
+ }
668
+ sign = map['sign']
669
+ map.delete('sign')
670
+ plain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(map)
671
+
672
+ verifyRet = UmfRSACryptUtil.new.verify(plain,sign,'sha1')
673
+ if verifyRet == true
674
+ puts '[UMF SDK 子商户入网] 平台通知数据验签成功'
675
+ return map
676
+ else
677
+ puts '[UMF SDK 子商户入网] 平台通知数据验签失败'
678
+ exit
679
+ end
680
+ end
681
+
682
+
683
+ # 子商户入网异步通知---商户响应联动通知SDK生成字符串 该字符串拼装在HTML响应中的head中的meta标签CONTENT中
684
+ def responseChildNotifyMap(params)
685
+ merMap = {}
686
+ merMap["merId"] = params["merId"]
687
+ merMap["licenseNo"] = params["licenseNo"]
688
+ merMap["ret_code"] = "0000"
689
+ merPlain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(merMap)
690
+ merSign = UmfRSACryptUtil.new.sign(merPlain,params["merId"],"sha1")
691
+ mer2UmfPlatStr = merPlain + "&sign=" + merSign
692
+ return mer2UmfPlatStr
693
+ end
694
+
695
+
696
+ # 分账—分账请求针对标准分账的延时分账
697
+ def splitReqMap(params)
698
+ pubParams = publicParams
699
+ param = pubParams.merge params
700
+ service = {"service" => "split_req"}
701
+ param = param.merge service
702
+ return plainSortByAndPost(param)
703
+ end
704
+
705
+
706
+ # 分账---分账状态查询
707
+ def splitStateMap(params)
708
+ pubParams = publicParams
709
+ param = pubParams.merge params
710
+ service = {"service" => "query_split_order"}
711
+ param = param.merge service
712
+ return plainSortByAndPost(param)
713
+ end
714
+
715
+
716
+ # 分账---分账退费
717
+ def splitRefundMap(params)
718
+ pubParams = publicParams
719
+ param = pubParams.merge params
720
+ service = {"service" => "mer_refund"}
721
+ param = param.merge service
722
+ return plainSortByAndPost(param)
723
+ end
724
+
725
+
726
+ # 分账---分账文件下载
727
+ def splitFileDownloadMap(params)
728
+ pubParams = publicParams
729
+ param = pubParams.merge params
730
+ service = {"service" => "download_settle_file"}
731
+ param = param.merge service
732
+ reqDataPost = UmfMerToPlat.new.makeRequestDataByPost(param)
733
+ post_url = reqDataPost.getUrl
734
+ mapfield = reqDataPost.getField
735
+ output = UmfHttp.new.httpPost(post_url,mapfield)
736
+ bool = writeSettle(params["mer_id"],params["settle_date"],params["settle_path"],output)
737
+ if bool
738
+ puts "[UMF SDK]对账文件写入本地成功"
739
+ return true
740
+ else
741
+ puts "[UMF SDK]对账文件写入本地失败"
742
+ return false
743
+ end
744
+ end
745
+
746
+
747
+ # 对账文件下载后 写入数据到本地
748
+ def writeSettle(mer_id,settle_date,settle_path,content)
749
+ if mer_id=='' || settle_date=='' || settle_path=='' || content==''
750
+ mer_id==nil || settle_date==nil || settle_path==nil || content==nil
751
+ return false
752
+ end
753
+ lastChar = settle_path[-1,1]
754
+ if lastChar == "/"
755
+ filepath = settle_path + mer_id + "_" + settle_date + ".txt"
756
+ else
757
+ filepath = settle_path + "/" + mer_id + "_" + settle_date + ".txt"
758
+ end
759
+ settle_content = content.encode('utf-8','gbk')
760
+ bool = File.open(filepath, "w+") { |file|
761
+ file.write(settle_content)
762
+ }
763
+ if bool
764
+ UmfLogger.logInfoMsg("[UMF SDK]对账文件写入成功,路径 " + filepath)
765
+ else
766
+ UmfLogger.logInfoMsg("[UMF SDK]对账文件写入失败,路径 " + filepath)
767
+ end
768
+ UmfLogger.logInfoMsg("--------------------log end---------------------")
769
+ return bool
770
+ end
771
+
772
+
773
+
774
+
775
+
776
+ #--------------------------------------------------------
777
+ private
778
+ # post请求公共方法
779
+ def plainSortByAndPost(params)
780
+ reqDataPost = UmfMerToPlat.new.makeRequestDataByPost(params)
781
+ post_url = reqDataPost.getUrl
782
+ mapfield = reqDataPost.getField
783
+ return UmfHttp.new.httpPost(post_url,mapfield)
784
+ end
785
+
786
+ # 公共参数
787
+ def publicParams
788
+ {
789
+ "charset"=>"UTF-8",
790
+ "sign_type"=>"RSA",
791
+ "res_format"=>"HTML",
792
+ "version"=>"4.0",
793
+ "amt_type"=>"RMB"
794
+ }
795
+ end
796
+
797
+
798
+
799
+
800
+ end
801
+