xinyb_
2022-02-17 6e94d52d0ce0c92c2169cdb19bc675ae08391a35
提交 | 用户 | 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 }