提交 | 用户 | age
|
d3ae0a
|
1 |
package com.yc.MaintenanceFee.controller; |
X |
2 |
|
4257cf
|
3 |
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; |
d3ae0a
|
4 |
import com.yc.MaintenanceFee.entiy.*; |
X |
5 |
import com.yc.MaintenanceFee.service.*; |
|
6 |
import com.yc.MaintenanceFee.utils.BackMsg; |
|
7 |
import com.yc.MaintenanceFee.utils.PayCallBackUtil; |
|
8 |
import com.yc.action.grid.GridUtils; |
|
9 |
import com.yc.im.service.RedisDAO; |
|
10 |
import com.yc.multiData.SpObserver; |
|
11 |
import com.yc.sdk.shopping.util.SettingKey; |
|
12 |
import com.yc.service.impl.DBHelper; |
|
13 |
import com.yc.utils.SessionKey; |
4257cf
|
14 |
import org.apache.commons.io.IOUtils; |
d3ae0a
|
15 |
import org.apache.commons.lang3.StringUtils; |
X |
16 |
import org.springframework.beans.factory.annotation.Autowired; |
4257cf
|
17 |
import org.springframework.web.bind.annotation.PathVariable; |
d3ae0a
|
18 |
import org.springframework.web.bind.annotation.RequestMapping; |
X |
19 |
import org.springframework.web.bind.annotation.RequestMethod; |
|
20 |
import org.springframework.web.bind.annotation.RestController; |
|
21 |
|
|
22 |
import javax.servlet.http.HttpServletRequest; |
|
23 |
import javax.servlet.http.HttpServletResponse; |
|
24 |
import java.io.IOException; |
|
25 |
import java.io.PrintWriter; |
|
26 |
import java.util.Date; |
|
27 |
import java.util.List; |
|
28 |
import java.util.Map; |
|
29 |
|
|
30 |
/** |
|
31 |
* 这个类整合了微信支付和支付宝支付 |
|
32 |
* 根据不同的支付类型参数进行调用不同的支付方法 |
|
33 |
* |
|
34 |
* @USER: xinyb_ |
|
35 |
* @DATE: 2021-11-17 15:05 |
|
36 |
*/ |
|
37 |
@RestController |
|
38 |
@RequestMapping("/payment/pay") |
|
39 |
public class MaintainPayController { |
|
40 |
@Autowired |
|
41 |
private ReceiptService receiptService; |
|
42 |
@Autowired |
|
43 |
private AliPayService aliPayService; |
|
44 |
@Autowired |
|
45 |
private WxPayService wxPayService; |
|
46 |
@Autowired |
|
47 |
PayLogService payLogService; |
|
48 |
@Autowired |
|
49 |
MaintainService maintainService; |
|
50 |
@Autowired |
|
51 |
RedisDAO redisDAO; |
|
52 |
|
|
53 |
private static final String DBID = "_338"; |
|
54 |
|
|
55 |
/** |
|
56 |
* 获取支付的二维码 |
|
57 |
* |
|
58 |
* @param payType |
|
59 |
* @param request |
|
60 |
* @return |
|
61 |
*/ |
|
62 |
@RequestMapping(value = "/PayQrCode.do", method = RequestMethod.GET) |
|
63 |
public BackMsg getPayQrCode(String skCode, String payType, HttpServletRequest request) { |
|
64 |
BackMsg msg = new BackMsg(); |
|
65 |
try { |
|
66 |
if (StringUtils.isBlank(skCode)) { |
|
67 |
msg.setError("支付订单号不能为空!"); |
|
68 |
return msg; |
|
69 |
} |
|
70 |
if (StringUtils.isBlank(payType)) { |
|
71 |
msg.setError("请选择支付方式"); |
|
72 |
return msg; |
|
73 |
} |
|
74 |
String dbId = (String) request.getSession().getAttribute(SessionKey.DATA_BASE_ID); |
|
75 |
Integer payDBId = PayCallBackUtil.chargeMaintenanceFee(dbId); |
|
76 |
if (payDBId == null || payDBId <= 0) { |
|
77 |
msg.setError("请选择收取维护费所属公司!"); |
|
78 |
return msg; |
|
79 |
} |
|
80 |
SpObserver.setDBtoInstance(DBID); |
|
81 |
Receipt receipt = receiptService.QueryReceipt(skCode, 0); |
|
82 |
if (receipt != null && !StringUtils.isBlank(receipt.getDocCode())) { |
6e94d5
|
83 |
if (receipt.getIsPaid() == 1) { |
X |
84 |
msg.setError("已支付成功,不能重复支付。"); |
|
85 |
return msg; |
|
86 |
} |
|
87 |
if (receipt.getDocStatus() == -200) { |
|
88 |
msg.setError("订单已被取消,支付失败。"); |
|
89 |
return msg; |
|
90 |
} |
|
91 |
if (receipt.getDocStatus() != 0) { |
|
92 |
msg.setError("订单不是待支付状态,支付失败。"); |
|
93 |
return msg; |
|
94 |
} |
d3ae0a
|
95 |
receipt.setCltName(receipt.getCltName() + "-" + receipt.getDocType()); |
X |
96 |
//设置回调地址 |
6e94d5
|
97 |
String notifyUrl = SettingKey.getHostUrl(request) + "/payment/pay";//"http://u69m1tj.nat.ipyingshe.com/payment/pay"; |
d3ae0a
|
98 |
switch (payType.toLowerCase()) { |
X |
99 |
case "wx"://微信支付 |
|
100 |
case "1": |
4257cf
|
101 |
notifyUrl += "/" + skCode + "/one/" + payDBId + "/maintainPayCallBack.do"; |
d3ae0a
|
102 |
msg = wxPayService.getWxPayQRCode(receipt, payDBId + "", notifyUrl); |
X |
103 |
break; |
|
104 |
case "ali"://支付宝支付 |
|
105 |
case "2": |
4257cf
|
106 |
notifyUrl += "/" + skCode + "/two/" + payDBId + "/maintainPayCallBack.do"; |
d3ae0a
|
107 |
msg = aliPayService.getAliPayQrCode(receipt, payDBId + "", notifyUrl); |
X |
108 |
break; |
|
109 |
default: |
|
110 |
msg.setError("请选择有效的支付方式"); |
|
111 |
break; |
|
112 |
} |
|
113 |
if (msg.getCode() == 0) { |
4257cf
|
114 |
//更新日志记录的NotifyType(插入这个值进日志,是为了以后改变了收取维护费所属公司, |
X |
115 |
// 还能根据日志的这个值切换回支付时候的设置) |
d3ae0a
|
116 |
payLogService.updateNotifyType(skCode, payDBId); |
X |
117 |
} |
|
118 |
} else { |
|
119 |
msg.setError("获取不到支付订单详情信息!"); |
|
120 |
} |
|
121 |
} catch (Exception e) { |
|
122 |
msg.setError(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
|
123 |
} finally { |
|
124 |
SpObserver.setDBtoInstance(); |
|
125 |
} |
|
126 |
return msg; |
|
127 |
} |
|
128 |
|
|
129 |
/** |
|
130 |
* 查询支付单据信息 |
|
131 |
* |
|
132 |
* @param skCode |
|
133 |
* @param payType |
|
134 |
* @param request |
|
135 |
* @return |
|
136 |
*/ |
|
137 |
@RequestMapping(value = "/PayQuery.do", method = RequestMethod.GET) |
|
138 |
public BackMsg selectPayQuery(String skCode, String payType, HttpServletRequest request) { |
|
139 |
BackMsg msg = new BackMsg(); |
dff633
|
140 |
List<String> list = null; |
d3ae0a
|
141 |
try { |
X |
142 |
if (StringUtils.isBlank(skCode)) { |
|
143 |
msg.setError("订单号不能为空"); |
|
144 |
return msg; |
|
145 |
} |
|
146 |
if (StringUtils.isBlank(payType)) { |
|
147 |
msg.setError("支付类型不能为空"); |
|
148 |
return msg; |
|
149 |
} |
|
150 |
SpObserver.setDBtoInstance(DBID); |
|
151 |
PayLog log = payLogService.getPayLog(skCode); |
|
152 |
switch (payType.toLowerCase()) { |
|
153 |
case "wx"://微信 |
|
154 |
case "1": |
|
155 |
msg = wxPayService.selectWxPayQuery(skCode, log.getNotifyType()); |
|
156 |
break; |
|
157 |
case "ali"://支付宝 |
|
158 |
case "2": |
|
159 |
msg = aliPayService.selectAliPayQuery(skCode, log.getNotifyType()); |
|
160 |
break; |
|
161 |
default: |
|
162 |
msg.setError("无效的支付类型查询"); |
|
163 |
break; |
|
164 |
} |
|
165 |
//执行保存及过账和日志更新 |
|
166 |
if (msg != null && msg.getCode() == 0) { |
|
167 |
Map<String, Object> map = (Map) msg.getData(); |
|
168 |
try { |
|
169 |
if (log != null && "0".equals(log.getStatus())) {//有记录,未支付状态 |
|
170 |
String remarks = ""; |
|
171 |
Integer code = DBHelper.getValueInt(map, "code"); |
|
172 |
//返回状态是支付成功的处理 |
|
173 |
if (code == 0) { |
c85161
|
174 |
list = maintainService.selectWHCode(skCode); |
d3ae0a
|
175 |
//备注信息 |
X |
176 |
remarks = "维护费支付信息。订单号:" + map.get("tradeNo") + ",交易号:" + map.get("transactionId"); |
|
177 |
} else { |
|
178 |
//备注信息 |
|
179 |
remarks = "维护费支付信息。" + map.get("tradeStateCode") + ":" + map.get("tradeStateDesc"); |
|
180 |
} |
|
181 |
//从新更新支付记录 |
|
182 |
log.setStatus("03"); |
|
183 |
log.setTrxType((String) map.get("payType")); |
|
184 |
log.setPayType((String) map.get("payType")); |
|
185 |
log.setInsertTime(new Date()); |
|
186 |
log.setMerchantRemarks(remarks); |
|
187 |
log.setAmount(map.get("totalFee").toString()); |
|
188 |
log.setThirdOrderNo((String) map.get("transactionId")); |
74e060
|
189 |
payLogService.saveOrUpdatePayLog(log); |
6e94d5
|
190 |
if (code == 0) { |
X |
191 |
//执行保存及过账 |
|
192 |
maintainService.savePostingLogic(skCode); |
|
193 |
} |
d3ae0a
|
194 |
} |
X |
195 |
} catch (Exception e) { |
|
196 |
map.put("LogError", e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
|
197 |
} |
|
198 |
msg.setOk(map); |
|
199 |
} |
|
200 |
} catch (Exception e) { |
|
201 |
msg.setError(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
dff633
|
202 |
} finally { |
X |
203 |
SpObserver.setDBtoInstance(); |
|
204 |
} |
|
205 |
try { |
4257cf
|
206 |
String dbId = (String) request.getSession().getAttribute(SessionKey.DATA_BASE_ID); |
dff633
|
207 |
if (list != null && list.size() > 0) { |
X |
208 |
SpObserver.setDBtoInstance("_" + dbId); |
|
209 |
//更新已经支付后的推送信息 |
|
210 |
maintainService.updateMessage(String.join(",", list)); |
|
211 |
} |
d3ae0a
|
212 |
} finally { |
X |
213 |
SpObserver.setDBtoInstance(); |
|
214 |
} |
|
215 |
return msg; |
|
216 |
} |
|
217 |
|
|
218 |
/** |
|
219 |
* 申请退款 |
|
220 |
* |
|
221 |
* @param skCode |
|
222 |
* @param amount |
|
223 |
* @param payType |
|
224 |
* @param request |
|
225 |
* @return |
|
226 |
*/ |
|
227 |
@RequestMapping(value = "/PayRefund.do", method = RequestMethod.GET) |
|
228 |
public BackMsg setPayRefund(String skCode, double amount, String payType, HttpServletRequest request) { |
|
229 |
BackMsg msg = new BackMsg(); |
|
230 |
try { |
|
231 |
if (StringUtils.isBlank(skCode)) { |
|
232 |
msg.setError("订单号不能为空"); |
|
233 |
return msg; |
|
234 |
} |
|
235 |
if (StringUtils.isBlank(payType)) { |
|
236 |
msg.setError("退款类型不能为空"); |
|
237 |
return msg; |
|
238 |
} |
|
239 |
SpObserver.setDBtoInstance(DBID); |
|
240 |
PayLog log = payLogService.getPayLog(skCode); |
|
241 |
switch (payType.toLowerCase()) { |
|
242 |
case "wx"://微信 |
|
243 |
case "1": |
|
244 |
msg = wxPayService.setWxPayRefund(skCode, String.valueOf(amount), log.getNotifyType()); |
|
245 |
break; |
|
246 |
case "ali"://支付宝 |
|
247 |
case "2": |
|
248 |
msg = aliPayService.setAliPayRefund(skCode, amount, null, log.getNotifyType()); |
|
249 |
break; |
|
250 |
default: |
|
251 |
msg.setError("无效的退款类型"); |
|
252 |
break; |
|
253 |
} |
|
254 |
} catch (Exception e) { |
|
255 |
msg.setError(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
|
256 |
} finally { |
|
257 |
SpObserver.setDBtoInstance(); |
|
258 |
} |
|
259 |
return msg; |
|
260 |
} |
|
261 |
|
|
262 |
/** |
|
263 |
* 关闭订单 |
|
264 |
* |
|
265 |
* @param skCode |
|
266 |
* @param payType |
|
267 |
* @param request |
|
268 |
* @return |
|
269 |
*/ |
|
270 |
@RequestMapping("/PayCancel.do") |
|
271 |
public BackMsg setPayCancel(String skCode, String payType, HttpServletRequest request) { |
|
272 |
BackMsg msg = new BackMsg(); |
6e94d5
|
273 |
PayLog log = new PayLog(); |
d3ae0a
|
274 |
try { |
X |
275 |
if (StringUtils.isBlank(skCode)) { |
|
276 |
msg.setError("订单号不能为空"); |
|
277 |
return msg; |
|
278 |
} |
|
279 |
SpObserver.setDBtoInstance(DBID); |
6e94d5
|
280 |
log = payLogService.getPayLog(skCode); |
d3ae0a
|
281 |
switch (payType.toLowerCase()) { |
X |
282 |
case "wx"://微信 |
|
283 |
case "1": |
|
284 |
msg = wxPayService.setWxPayCancel(skCode, log.getNotifyType()); |
|
285 |
break; |
|
286 |
case "ali"://支付宝 |
|
287 |
case "2": |
|
288 |
msg = aliPayService.setAliPayCancel(skCode, log.getNotifyType()); |
|
289 |
break; |
|
290 |
default: |
|
291 |
msg.setOk(""); |
|
292 |
break; |
|
293 |
} |
dff633
|
294 |
if (msg.getCode() == 0) { |
6e94d5
|
295 |
receiptService.doCancelReceipt(skCode); |
d3ae0a
|
296 |
log.setStatus("-200"); |
X |
297 |
log.setRefDoccode(skCode); |
6e94d5
|
298 |
log.setMerchantRemarks("维护费取消支付信息。取消收款单:" + skCode + ",不能再进行支付操作!"); |
d3ae0a
|
299 |
payLogService.saveOrUpdatePayLog(log); |
X |
300 |
msg.setOk("收款单:" + skCode + ",已失效!"); |
|
301 |
} |
|
302 |
} catch (Exception e) { |
6e94d5
|
303 |
log.setStatus("-500"); |
X |
304 |
log.setRefDoccode(skCode); |
|
305 |
log.setMerchantRemarks("维护费取消支付出现错误:" + e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
|
306 |
payLogService.saveOrUpdatePayLog(log); |
d3ae0a
|
307 |
msg.setError(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
X |
308 |
} finally { |
|
309 |
SpObserver.setDBtoInstance(); |
|
310 |
} |
|
311 |
return msg; |
|
312 |
} |
|
313 |
|
|
314 |
/** |
4257cf
|
315 |
* 微信支付和支付宝支付的回调处理 xin 2021-12-13 09:42:50 |
6e94d5
|
316 |
* |
X |
317 |
* @param skCode 单号 |
|
318 |
* @param type 支付类型。微信或支付宝 |
|
319 |
* @param dbId //数据源Id(设置收款的系统数据源) |
d3ae0a
|
320 |
* @param request |
4257cf
|
321 |
* @param response |
X |
322 |
* @throws IOException |
d3ae0a
|
323 |
*/ |
4257cf
|
324 |
@RequestMapping("/{skCode}/{type}/{dbId}/maintainPayCallBack.do") |
X |
325 |
public void wxPayCallBack(@PathVariable String skCode, @PathVariable String type, @PathVariable String dbId, |
|
326 |
HttpServletRequest request, HttpServletResponse response) throws IOException { |
d3ae0a
|
327 |
synchronized (this) { |
6e94d5
|
328 |
PayCallBack pcb = new PayCallBack(); |
d3ae0a
|
329 |
try { |
4257cf
|
330 |
PrintWriter out = null; |
X |
331 |
String backTxt = ""; |
|
332 |
boolean bol = false; |
|
333 |
if (!StringUtils.isBlank(skCode) && !StringUtils.isBlank(type)) { |
c0e5a1
|
334 |
PayLog log = null; |
4257cf
|
335 |
switch (type) { |
X |
336 |
case "one"://表示微信支付回调 |
|
337 |
String xmlData = IOUtils.toString(request.getInputStream(), "utf-8"); |
|
338 |
WxPayOrderNotifyResult result = wxPayService.wxPayCallBack(xmlData, dbId); |
|
339 |
if (result.getReturnCode().equals("SUCCESS")) { |
|
340 |
response.setCharacterEncoding("UTF-8"); |
|
341 |
response.setContentType("application/xml; charset=utf-8"); |
|
342 |
backTxt = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; |
|
343 |
//保存支付记录信息 |
6e94d5
|
344 |
log = PayCallBackUtil.setPayLog(null, result); |
4257cf
|
345 |
//返回信息 |
X |
346 |
pcb.setTransactionId(result.getTransactionId()); |
|
347 |
pcb.setSkCode(result.getOutTradeNo()); |
|
348 |
pcb.setPayType("wxPay"); |
|
349 |
bol = true; |
|
350 |
} |
|
351 |
break; |
|
352 |
case "two"://表示支付宝回调 |
|
353 |
Map<String, String> param = PayCallBackUtil.AliPayCallBackUtil(request); |
|
354 |
bol = aliPayService.aliPayCallBack(param, dbId); |
|
355 |
if (bol) {//验证成功后 |
|
356 |
backTxt = "SUCCESS"; |
|
357 |
//保存支付记录信息 |
6e94d5
|
358 |
log = PayCallBackUtil.setPayLog(param, null); |
4257cf
|
359 |
//处理订单操作 |
X |
360 |
pcb.setTransactionId(param.get("trade_no")); |
|
361 |
pcb.setSkCode(param.get("out_trade_no")); |
|
362 |
pcb.setPayType("aliPay"); |
|
363 |
} |
|
364 |
break; |
|
365 |
default: |
|
366 |
break; |
|
367 |
} |
|
368 |
if (bol) {//验证成功后 |
|
369 |
out = response.getWriter(); |
|
370 |
out.print(backTxt); |
|
371 |
out.close(); |
|
372 |
try { |
|
373 |
SpObserver.setDBtoInstance(DBID); |
|
374 |
//更新日志 |
c0e5a1
|
375 |
log.setRefDoccode(skCode); |
74e060
|
376 |
payLogService.saveOrUpdatePayLog(log); |
6e94d5
|
377 |
//处理过账 |
X |
378 |
maintainService.savePostingLogic(skCode); |
|
379 |
} finally { |
4257cf
|
380 |
SpObserver.setDBtoInstance(); |
X |
381 |
} |
|
382 |
//发布订阅信息 |
|
383 |
pcb.setMsg("支付成功"); |
|
384 |
pcb.setCode(0); |
|
385 |
pcb.setState("true"); |
|
386 |
redisDAO.publishMessage("Onbus_Maintain", GridUtils.toJsonNotNull(pcb)); |
|
387 |
} |
d3ae0a
|
388 |
} |
X |
389 |
} catch (Exception e) { |
6e94d5
|
390 |
//发布订阅信息 |
X |
391 |
pcb.setMsg("支付失败:" + e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
|
392 |
pcb.setCode(-1); |
|
393 |
pcb.setState("true"); |
|
394 |
redisDAO.publishMessage("Onbus_Maintain", GridUtils.toJsonNotNull(pcb)); |
|
395 |
e.printStackTrace(); |
|
396 |
response.getWriter().print(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
d3ae0a
|
397 |
} |
X |
398 |
} |
|
399 |
} |
|
400 |
} |