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.
- checksums.yaml +7 -0
- data/lib/UmfCheckReqDataAndEncrypt.rb +101 -0
- data/lib/UmfCommon.rb +24 -0
- data/lib/UmfConfig.rb +39 -0
- data/lib/UmfHttp.rb +154 -0
- data/lib/UmfLogger.rb +25 -0
- data/lib/UmfMerToPlat.rb +17 -0
- data/lib/UmfRSACryptUtil.rb +81 -0
- data/lib/UmfRegexUtil.rb +260 -0
- data/lib/UmfReqDataUtil.rb +70 -0
- data/lib/UmfService.rb +801 -0
- data/lib/UmfStringUtil.rb +126 -0
- data/lib/umf_pay_service_ruby.rb +0 -0
- metadata +55 -0
data/lib/UmfRegexUtil.rb
ADDED
@@ -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
|
+
|
data/lib/UmfService.rb
ADDED
@@ -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
|
+
|