| | |
| | | package com.yc.MaintenanceFee.controller; |
| | | |
| | | import com.alipay.api.AlipayApiException; |
| | | import com.github.binarywang.wxpay.bean.notify.WxScanPayNotifyResult; |
| | | import com.github.binarywang.wxpay.exception.WxPayException; |
| | | import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; |
| | | import com.yc.MaintenanceFee.entiy.*; |
| | | import com.yc.MaintenanceFee.service.*; |
| | | import com.yc.MaintenanceFee.utils.BackMsg; |
| | |
| | | import com.yc.sdk.shopping.util.SettingKey; |
| | | import com.yc.service.impl.DBHelper; |
| | | import com.yc.utils.SessionKey; |
| | | import me.chanjar.weixin.common.util.XmlUtils; |
| | | import org.apache.commons.io.IOUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestMethod; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.IOException; |
| | | import java.io.PrintWriter; |
| | | import java.math.BigDecimal; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | |
| | | SpObserver.setDBtoInstance(DBID); |
| | | Receipt receipt = receiptService.QueryReceipt(skCode, 0); |
| | | if (receipt != null && !StringUtils.isBlank(receipt.getDocCode())) { |
| | | if (receipt.getIsPaid() == 1) { |
| | | msg.setError("已支付成功,不能重复支付。"); |
| | | return msg; |
| | | } |
| | | if (receipt.getDocStatus() == -200) { |
| | | msg.setError("订单已被取消,支付失败。"); |
| | | return msg; |
| | | } |
| | | if (receipt.getDocStatus() != 0) { |
| | | msg.setError("订单不是待支付状态,支付失败。"); |
| | | return msg; |
| | | } |
| | | receipt.setCltName(receipt.getCltName() + "-" + receipt.getDocType()); |
| | | //设置回调地址 |
| | | String notifyUrl = SettingKey.getHostUrl(request);//"http://u69m1tj.nat.ipyingshe.com"; |
| | | String notifyUrl = SettingKey.getHostUrl(request) + "/payment/pay";//"http://u69m1tj.nat.ipyingshe.com/payment/pay"; |
| | | switch (payType.toLowerCase()) { |
| | | case "wx"://微信支付 |
| | | case "1": |
| | | notifyUrl += "/payment/pay/WxCallBack.do"; |
| | | notifyUrl += "/" + skCode + "/one/" + payDBId + "/maintainPayCallBack.do"; |
| | | msg = wxPayService.getWxPayQRCode(receipt, payDBId + "", notifyUrl); |
| | | break; |
| | | case "ali"://支付宝支付 |
| | | case "2": |
| | | notifyUrl += "/payment/pay/AliCallBack.do"; |
| | | notifyUrl += "/" + skCode + "/two/" + payDBId + "/maintainPayCallBack.do"; |
| | | msg = aliPayService.getAliPayQrCode(receipt, payDBId + "", notifyUrl); |
| | | break; |
| | | default: |
| | |
| | | break; |
| | | } |
| | | if (msg.getCode() == 0) { |
| | | //更新日志记录的NotifyType |
| | | //更新日志记录的NotifyType(插入这个值进日志,是为了以后改变了收取维护费所属公司, |
| | | // 还能根据日志的这个值切换回支付时候的设置) |
| | | payLogService.updateNotifyType(skCode, payDBId); |
| | | } |
| | | } else { |
| | |
| | | @RequestMapping(value = "/PayQuery.do", method = RequestMethod.GET) |
| | | public BackMsg selectPayQuery(String skCode, String payType, HttpServletRequest request) { |
| | | BackMsg msg = new BackMsg(); |
| | | List<String> list = null; |
| | | try { |
| | | if (StringUtils.isBlank(skCode)) { |
| | | msg.setError("订单号不能为空"); |
| | |
| | | Integer code = DBHelper.getValueInt(map, "code"); |
| | | //返回状态是支付成功的处理 |
| | | if (code == 0) { |
| | | //执行保存及过账 |
| | | maintainService.savePostingLogic((String) map.get("tradeNo")); |
| | | list = maintainService.selectWHCode(skCode); |
| | | //备注信息 |
| | | remarks = "维护费支付信息。订单号:" + map.get("tradeNo") + ",交易号:" + map.get("transactionId"); |
| | | } else { |
| | |
| | | log.setMerchantRemarks(remarks); |
| | | log.setAmount(map.get("totalFee").toString()); |
| | | log.setThirdOrderNo((String) map.get("transactionId")); |
| | | maintainService.saveOrUpdatePayLog(log); |
| | | payLogService.saveOrUpdatePayLog(log); |
| | | if (code == 0) { |
| | | //执行保存及过账 |
| | | maintainService.savePostingLogic(skCode); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | map.put("LogError", e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
| | |
| | | } |
| | | } catch (Exception e) { |
| | | msg.setError(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | try { |
| | | String dbId = (String) request.getSession().getAttribute(SessionKey.DATA_BASE_ID); |
| | | if (list != null && list.size() > 0) { |
| | | SpObserver.setDBtoInstance("_" + dbId); |
| | | //更新已经支付后的推送信息 |
| | | maintainService.updateMessage(String.join(",", list)); |
| | | } |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | |
| | | @RequestMapping("/PayCancel.do") |
| | | public BackMsg setPayCancel(String skCode, String payType, HttpServletRequest request) { |
| | | BackMsg msg = new BackMsg(); |
| | | PayLog log = new PayLog(); |
| | | try { |
| | | if (StringUtils.isBlank(skCode)) { |
| | | msg.setError("订单号不能为空"); |
| | | return msg; |
| | | } |
| | | if (StringUtils.isBlank(payType)) { |
| | | payType="null"; |
| | | } |
| | | SpObserver.setDBtoInstance(DBID); |
| | | PayLog log = payLogService.getPayLog(skCode); |
| | | log = payLogService.getPayLog(skCode); |
| | | switch (payType.toLowerCase()) { |
| | | case "wx"://微信 |
| | | case "1": |
| | |
| | | msg.setOk(""); |
| | | break; |
| | | } |
| | | if(msg.getCode()==0){ |
| | | receiptService.cancelReceipt(skCode); |
| | | if (msg.getCode() == 0) { |
| | | receiptService.doCancelReceipt(skCode); |
| | | log.setStatus("-200"); |
| | | log.setRefDoccode(skCode); |
| | | log.setTrxType(payType); |
| | | log.setPayType(payType); |
| | | log.setMerchantRemarks("维护费取消信息。取消收款单:" + skCode + ",不能再进行支付操作!"); |
| | | log.setMerchantRemarks("维护费取消支付信息。取消收款单:" + skCode + ",不能再进行支付操作!"); |
| | | payLogService.saveOrUpdatePayLog(log); |
| | | msg.setOk("收款单:" + skCode + ",已失效!"); |
| | | } |
| | | } catch (Exception e) { |
| | | log.setStatus("-500"); |
| | | log.setRefDoccode(skCode); |
| | | log.setMerchantRemarks("维护费取消支付出现错误:" + e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
| | | payLogService.saveOrUpdatePayLog(log); |
| | | msg.setError(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 微信支付后的回调 |
| | | * 微信支付和支付宝支付的回调处理 xin 2021-12-13 09:42:50 |
| | | * |
| | | * @param skCode 单号 |
| | | * @param type 支付类型。微信或支付宝 |
| | | * @param dbId //数据源Id(设置收款的系统数据源) |
| | | * @param request |
| | | */ |
| | | @RequestMapping("/WxCallBack.do") |
| | | public void wxPayCallBack(HttpServletRequest request, HttpServletResponse response) throws IOException { |
| | | synchronized (this) { |
| | | try { |
| | | String rest = PayCallBackUtil.WxPayCallBackUtil(request); |
| | | if (!StringUtils.isBlank(rest)) { |
| | | setPayCallBack("wx", null, rest, response); |
| | | } else { |
| | | response.getWriter().print("fail"); |
| | | } |
| | | } catch (Exception e) { |
| | | response.getWriter().print("Fail"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 支付宝的回调 |
| | | * |
| | | * @param request |
| | | */ |
| | | @RequestMapping("/AliCallBack.do") |
| | | public void aliPayCallBack(HttpServletRequest request, HttpServletResponse response) { |
| | | synchronized (this) { |
| | | try { |
| | | Map<String, String> param = PayCallBackUtil.AliPayCallBackUtil(request); |
| | | if (param != null) { |
| | | setPayCallBack("ali", param, null, response); |
| | | } else { |
| | | response.getWriter().print("fail"); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 微信或支付宝的回调处理 xin 2021-12-13 09:42:50 |
| | | * |
| | | * @param Type |
| | | * @param params |
| | | * @param rest |
| | | * @param response |
| | | * @throws IOException |
| | | */ |
| | | private void setPayCallBack(String Type, Map<String, String> params, String rest, HttpServletResponse response) { |
| | | PayCallBack pcb = new PayCallBack(); |
| | | PrintWriter out = null; |
| | | String backTxt = ""; |
| | | try { |
| | | String skCode = ""; |
| | | boolean bol = false; |
| | | Map<String, Object> param = null; |
| | | if (rest != null) { |
| | | param = XmlUtils.xml2Map(rest); |
| | | skCode = (String) param.get("out_trade_no"); |
| | | } else { |
| | | skCode = params.get("out_trade_no"); |
| | | } |
| | | if (StringUtils.isBlank(skCode)) { |
| | | throw new Exception("获取不到回调的订单号!"); |
| | | } |
| | | SpObserver.setDBtoInstance(DBID); |
| | | PayLog log = maintainService.selectPayLog(skCode); |
| | | if ("wx".equals(Type)) {//微信的 |
| | | WxScanPayNotifyResult result = wxPayService.wxPayCallBack(rest, log.getNotifyType()); |
| | | if (result.getReturnCode().equals("SUCCESS")) { |
| | | response.setCharacterEncoding("UTF-8"); |
| | | response.setContentType("application/xml; charset=utf-8"); |
| | | backTxt = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; |
| | | //保存支付记录信息 |
| | | PayCallBackUtil.setPayLog(null, result, log); |
| | | //返回信息 |
| | | pcb.setTransactionId(result.getTransactionId()); |
| | | pcb.setSkCode(result.getOutTradeNo()); |
| | | pcb.setPayType("wxPay"); |
| | | bol = true; |
| | | @RequestMapping("/{skCode}/{type}/{dbId}/maintainPayCallBack.do") |
| | | public void wxPayCallBack(@PathVariable String skCode, @PathVariable String type, @PathVariable String dbId, |
| | | HttpServletRequest request, HttpServletResponse response) throws IOException { |
| | | synchronized (this) { |
| | | PayCallBack pcb = new PayCallBack(); |
| | | try { |
| | | PrintWriter out = null; |
| | | String backTxt = ""; |
| | | boolean bol = false; |
| | | if (!StringUtils.isBlank(skCode) && !StringUtils.isBlank(type)) { |
| | | PayLog log = null; |
| | | switch (type) { |
| | | case "one"://表示微信支付回调 |
| | | String xmlData = IOUtils.toString(request.getInputStream(), "utf-8"); |
| | | WxPayOrderNotifyResult result = wxPayService.wxPayCallBack(xmlData, dbId); |
| | | if (result.getReturnCode().equals("SUCCESS")) { |
| | | response.setCharacterEncoding("UTF-8"); |
| | | response.setContentType("application/xml; charset=utf-8"); |
| | | backTxt = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; |
| | | //保存支付记录信息 |
| | | log = PayCallBackUtil.setPayLog(null, result); |
| | | //返回信息 |
| | | pcb.setTransactionId(result.getTransactionId()); |
| | | pcb.setSkCode(result.getOutTradeNo()); |
| | | pcb.setPayType("wxPay"); |
| | | bol = true; |
| | | } |
| | | break; |
| | | case "two"://表示支付宝回调 |
| | | Map<String, String> param = PayCallBackUtil.AliPayCallBackUtil(request); |
| | | bol = aliPayService.aliPayCallBack(param, dbId); |
| | | if (bol) {//验证成功后 |
| | | backTxt = "SUCCESS"; |
| | | //保存支付记录信息 |
| | | log = PayCallBackUtil.setPayLog(param, null); |
| | | //处理订单操作 |
| | | pcb.setTransactionId(param.get("trade_no")); |
| | | pcb.setSkCode(param.get("out_trade_no")); |
| | | pcb.setPayType("aliPay"); |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | if (bol) {//验证成功后 |
| | | out = response.getWriter(); |
| | | out.print(backTxt); |
| | | out.close(); |
| | | try { |
| | | SpObserver.setDBtoInstance(DBID); |
| | | //更新日志 |
| | | log.setRefDoccode(skCode); |
| | | payLogService.saveOrUpdatePayLog(log); |
| | | //处理过账 |
| | | maintainService.savePostingLogic(skCode); |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | //发布订阅信息 |
| | | pcb.setMsg("支付成功"); |
| | | pcb.setCode(0); |
| | | pcb.setState("true"); |
| | | redisDAO.publishMessage("Onbus_Maintain", GridUtils.toJsonNotNull(pcb)); |
| | | } |
| | | } |
| | | } else if ("ali".equals(Type)) {//支付宝的 |
| | | bol = aliPayService.aliPayCallBack(params, log.getNotifyType()); |
| | | if (bol) {//验证成功后 |
| | | backTxt = "SUCCESS"; |
| | | //保存支付记录信息 |
| | | PayCallBackUtil.setPayLog(params, null, log); |
| | | //处理订单操作 |
| | | pcb.setTransactionId(params.get("trade_no")); |
| | | pcb.setSkCode(params.get("out_trade_no")); |
| | | pcb.setPayType("aliPay"); |
| | | } |
| | | } |
| | | if (bol) {//验证成功后 |
| | | out = response.getWriter(); |
| | | out.print(backTxt); |
| | | out.close(); |
| | | //处理过账 |
| | | maintainService.savePostingLogic(skCode); |
| | | //更新日志 |
| | | maintainService.saveOrUpdatePayLog(log); |
| | | |
| | | } catch (Exception e) { |
| | | //发布订阅信息 |
| | | pcb.setMsg("支付成功"); |
| | | pcb.setCode(0); |
| | | pcb.setMsg("支付失败:" + e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
| | | pcb.setCode(-1); |
| | | pcb.setState("true"); |
| | | redisDAO.publishMessage("Onbus_Maintain", GridUtils.toJsonNotNull(pcb)); |
| | | e.printStackTrace(); |
| | | response.getWriter().print(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); |
| | | } |
| | | } catch (WxPayException e1) {//微信异常 |
| | | e1.printStackTrace(); |
| | | } catch (AlipayApiException e2) {//支付宝异常 |
| | | e2.printStackTrace(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | | SpObserver.setDBtoInstance(); |
| | | } |
| | | } |
| | | } |