xinyb_
2022-02-17 6e94d52d0ce0c92c2169cdb19bc675ae08391a35
src/com/yc/MaintenanceFee/controller/MaintainPayController.java
@@ -1,8 +1,6 @@
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;
@@ -13,9 +11,10 @@
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;
@@ -24,8 +23,6 @@
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;
@@ -83,18 +80,30 @@
            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:
@@ -102,7 +111,8 @@
                        break;
                }
                if (msg.getCode() == 0) {
                    //更新日志记录的NotifyType
                    //更新日志记录的NotifyType(插入这个值进日志,是为了以后改变了收取维护费所属公司,
                    // 还能根据日志的这个值切换回支付时候的设置)
                    payLogService.updateNotifyType(skCode, payDBId);
                }
            } else {
@@ -127,6 +137,7 @@
    @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("订单号不能为空");
@@ -160,8 +171,7 @@
                        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 {
@@ -176,7 +186,11 @@
                        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());
@@ -185,6 +199,16 @@
            }
        } 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();
        }
@@ -246,16 +270,14 @@
    @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":
@@ -269,17 +291,19 @@
                    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();
@@ -288,123 +312,89 @@
    }
    /**
     * 微信支付后的回调
     * 微信支付和支付宝支付的回调处理 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();
        }
    }
}