浏览代码

优化微信支付订单查询

lighter 11 月之前
父节点
当前提交
18ec0b49ae

+ 2 - 2
src/main/java/thyyxxk/wxservice_server/config/exception/BizException.java

@@ -26,9 +26,9 @@ public class BizException extends RuntimeException {
     }
 
     public BizException(String cause) {
-        super(ExceptionEnum.INTERNAL_SERVER_ERROR.getMessage(),
+        super(ExceptionEnum.BUSINESS_INTERRUPT.getMessage(),
                 new Throwable(cause));
-        this.errorEnum = ExceptionEnum.INTERNAL_SERVER_ERROR;
+        this.errorEnum = ExceptionEnum.BUSINESS_INTERRUPT;
     }
 
     @Override

+ 1 - 0
src/main/java/thyyxxk/wxservice_server/config/exception/ExceptionEnum.java

@@ -20,6 +20,7 @@ public enum ExceptionEnum {
     NULL_POINTER(1002, "空指针异常!"),
     NETWORK_ERROR(1003, "网络异常!"),
     NO_DATA_EXIST(1004, "没有查询到有效数据!"),
+    BUSINESS_INTERRUPT(1005, "业务中止。"),
     /**
      * 以下是需要弹窗提示的错误
      * */

+ 1 - 4
src/main/java/thyyxxk/wxservice_server/controller/WxApiController.java

@@ -63,11 +63,8 @@ public class WxApiController {
 
     @PassToken
     @GetMapping("/queryOrderState")
-    public ResultVo<String> queryOrderState(@RequestParam("tradeNo") String tradeNo) {
+    public ResultVo<String> queryOrderState(@RequestParam("tradeNo") String tradeNo) throws Exception {
         String payTime = service.queryOrderState(tradeNo);
-        if (payTime.contains("ERROR:")) {
-            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, payTime);
-        }
         return ResultVoUtil.success(payTime);
     }
 

+ 6 - 0
src/main/java/thyyxxk/wxservice_server/controller/WxPayNotifyController.java

@@ -37,4 +37,10 @@ public class WxPayNotifyController {
                 .httpServletRequest(httpServletRequest).build();
         new WeChatPayService().decryptNotify(request);
     }
+
+    @PassToken
+    @GetMapping("/testNotify")
+    public void testNotify(@RequestParam("tradeNo") String tradeNo) {
+        service.testNotify(tradeNo);
+    }
 }

+ 2 - 2
src/main/java/thyyxxk/wxservice_server/scheduled/QueryOrderStateTask.java

@@ -40,7 +40,7 @@ public class QueryOrderStateTask {
 
     @PassToken
     @GetMapping("/start")
-    public ResultVo<String> setCanScheduleRun(@RequestParam("value") boolean value) {
+    public ResultVo<String> setCanScheduleRun(@RequestParam("value") boolean value) throws Exception {
         canScheduleRun = value;
         if (canScheduleRun) {
             queryOrderState();
@@ -51,7 +51,7 @@ public class QueryOrderStateTask {
     }
 
     @Scheduled(fixedRate = 180 * 1000)
-    public void queryOrderState() {
+    public void queryOrderState() throws Exception {
         if (canScheduleRun && production) {
             List<TradeNo> tradeNos = dao.selectTradeNosForScheduleTask();
             log.info("定时查询订单支付状态:{}", tradeNos);

+ 62 - 67
src/main/java/thyyxxk/wxservice_server/service/WxApiService.java

@@ -7,6 +7,7 @@ import com.wechat.pay.java.service.payments.model.Transaction;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import thyyxxk.wxservice_server.config.exception.BizException;
 import thyyxxk.wxservice_server.config.exception.ExceptionEnum;
 import thyyxxk.wxservice_server.constant.OrderType;
 import thyyxxk.wxservice_server.constant.medins.Insutype;
@@ -137,77 +138,71 @@ public class WxApiService {
         return ResultVoUtil.success(response);
     }
 
-    public String queryOrderState(String tradeNo) {
-        try {
-            while (TradeVectorUtil.tradeNoBeingQuery(tradeNo) || TradeVectorUtil.tradeNoBeingRefund(tradeNo)) {
-                log.info("订单号:{} 正在查询状态中,进入等待区。", tradeNo);
-                TimeUnit.SECONDS.sleep(3);
-            }
-            TradeVectorUtil.addBeingQuery(tradeNo);
-            WxPayOrder order = dao.selectOrderByTradeNo(tradeNo);
-            if (null == order) {
-                return "ERROR:订单不存在。【订单号:" + tradeNo + "】";
-            }
-            OrderType orderType = OrderType.get(order.getOrderType());
-            int hasSaved = 0;
-            if (orderType == OrderType.REGISTRATION || orderType == OrderType.CLINIC_REGISTER) {
-                hasSaved = dao.alreadyPaidRegisterFee(order.getTradeNo());
-            } else if (orderType == OrderType.OUTPATIENT) {
-                hasSaved = dao.alreadyPayed(order.getTradeNo());
-            }
-            if (hasSaved == 1) {
-                dao.updateSuccessHisStatus(tradeNo);
-                if (orderType == OrderType.REGISTRATION) {
-                    log.info("订单号:{} 的挂号信息已保存,无需再次查询订单状态。", order.getTradeNo());
-                    return DateUtil.formatDatetime(order.getPayDatetime());
-                }
-                log.info("订单号:{} 的门诊缴费信息已保存,无需再次查询订单状态。", order.getTradeNo());
+    public String queryOrderState(String tradeNo) throws Exception {
+        while (TradeVectorUtil.tradeNoBeingQuery(tradeNo) || TradeVectorUtil.tradeNoBeingRefund(tradeNo)) {
+            log.info("订单号:{} 正在查询状态中,进入等待区。", tradeNo);
+            TimeUnit.SECONDS.sleep(3);
+        }
+        WxPayOrder order = dao.selectOrderByTradeNo(tradeNo);
+        if (null == order) {
+            throw new BizException("订单不存在。【订单号:" + tradeNo + "】");
+        }
+        OrderType orderType = OrderType.get(order.getOrderType());
+        int hasSaved = 0;
+        if (orderType == OrderType.REGISTRATION || orderType == OrderType.CLINIC_REGISTER) {
+            hasSaved = dao.alreadyPaidRegisterFee(order.getTradeNo());
+        } else if (orderType == OrderType.OUTPATIENT) {
+            hasSaved = dao.alreadyPayed(order.getTradeNo());
+        }
+        if (hasSaved == 1) {
+            dao.updateSuccessHisStatus(tradeNo);
+            if (orderType == OrderType.REGISTRATION) {
+                log.info("订单号:{} 的挂号信息已保存,无需再次查询订单状态。", order.getTradeNo());
                 return DateUtil.formatDatetime(order.getPayDatetime());
             }
-
-            Transaction transaction;
-            if (order.getCashpayAmt().compareTo(BigDecimal.ZERO) == 0) {
-                transaction = new Transaction();
-                transaction.setTradeState(Transaction.TradeStateEnum.SUCCESS);
-                transaction.setSuccessTime(DateUtil.formatDatetime(new Date()));
-            } else {
-                WechatPayGlobalRequest request = new WechatPayGlobalRequest.Builder()
-                        .outTradeNo(tradeNo).build();
-                transaction = new WeChatPayService().queryOrderState(request);
-            }
-            Transaction.TradeStateEnum tradeState = transaction.getTradeState();
-            if (tradeState == Transaction.TradeStateEnum.SUCCESS) {
-                String successTime = transaction.getSuccessTime()
-                        .split("\\+")[0].replace("T", " ");
-                dao.updatePayStatusAndPayTime(tradeNo, tradeState, successTime);
-                switch (orderType) {
-                    case CLINIC_REGISTER:
-                        return savePayResultService.saveClinicRegister(order, successTime);
-                    case REGISTRATION:
-                        return savePayResultService.saveAppointment(order, successTime);
-                    case OUTPATIENT:
-                        return savePayResultService.saveMzChargeInfo(order, successTime);
-                    case INPATIENT_PRE_PAY:
-                        return savePayResultService.saveZyYjjInfo(order, successTime);
-                    case SELF_HELP_MACHINE:
-                        return "订单已支付。";
-                    case INSPECTIONS:
-                        savePayResultService.notifyCytj(order, successTime);
-                        return "订单已支付。";
-                    case COUPON_PURCHASE:
-                        return savePayResultService.saveCouponPurchase(order, successTime);
-                    default:
-                        return "ERROR:未识别到的订单类型,请联系服务中心。";
-                }
-            }
-            dao.updatePayStatusAndQueryTimes(tradeNo, tradeState);
-            return "ERROR:" + transaction.getTradeStateDesc();
-        } catch (Exception e) {
-            log.error("查询订单状态出错:", e);
-            return "ERROR:服务器错误,请联系管理员处理。【订单号:" + tradeNo + "】";
-        } finally {
+            log.info("订单号:{} 的门诊缴费信息已保存,无需再次查询订单状态。", order.getTradeNo());
+            return DateUtil.formatDatetime(order.getPayDatetime());
+        }
+        TradeVectorUtil.addBeingQuery(tradeNo);
+        Transaction transaction;
+        if (order.getCashpayAmt().compareTo(BigDecimal.ZERO) == 0) {
+            transaction = new Transaction();
+            transaction.setTradeState(Transaction.TradeStateEnum.SUCCESS);
+            transaction.setSuccessTime(DateUtil.formatDatetime(new Date()));
+        } else {
+            WechatPayGlobalRequest request = new WechatPayGlobalRequest.Builder()
+                    .outTradeNo(tradeNo).build();
+            transaction = new WeChatPayService().queryOrderState(request);
+        }
+        Transaction.TradeStateEnum tradeState = transaction.getTradeState();
+        if (tradeState == Transaction.TradeStateEnum.SUCCESS) {
+            String successTime = transaction.getSuccessTime()
+                    .split("\\+")[0].replace("T", " ");
+            dao.updatePayStatusAndPayTime(tradeNo, tradeState, successTime);
             TradeVectorUtil.removeBeingQuery(tradeNo);
+            switch (orderType) {
+                case CLINIC_REGISTER:
+                    return savePayResultService.saveClinicRegister(order, successTime);
+                case REGISTRATION:
+                    return savePayResultService.saveAppointment(order, successTime);
+                case OUTPATIENT:
+                    return savePayResultService.saveMzChargeInfo(order, successTime);
+                case INPATIENT_PRE_PAY:
+                    return savePayResultService.saveZyYjjInfo(order, successTime);
+                case SELF_HELP_MACHINE:
+                case PACS_PRINT:
+                    return "订单已支付。";
+                case INSPECTIONS:
+                    savePayResultService.notifyCytj(order, successTime);
+                    return "订单已支付。";
+                case COUPON_PURCHASE:
+                    return savePayResultService.saveCouponPurchase(order, successTime);
+                default:
+                    throw new BizException("未识别到的订单类型,请联系服务中心。");
+            }
         }
+        dao.updatePayStatusAndQueryTimes(tradeNo, tradeState);
+        throw new BizException(transaction.getTradeStateDesc());
     }
 
     public void notifyCytj(String tradeNo) {

+ 9 - 0
src/main/java/thyyxxk/wxservice_server/service/WxPayNotifyService.java

@@ -7,6 +7,7 @@ import org.springframework.stereotype.Service;
 import thyyxxk.wxservice_server.constant.OrderType;
 import thyyxxk.wxservice_server.dao.WxApiDao;
 import thyyxxk.wxservice_server.entity.wxapi.WxPayOrder;
+import thyyxxk.wxservice_server.factory.cytj.CytjService;
 import thyyxxk.wxservice_server.factory.wechatpay.WeChatPayService;
 import thyyxxk.wxservice_server.factory.wechatpay.model.WechatPayGlobalRequest;
 import thyyxxk.wxservice_server.utils.DateUtil;
@@ -75,4 +76,12 @@ public class WxPayNotifyService {
                 savePayResultService.notifyCytj(order, successTime);
         }
     }
+
+    public void testNotify(String tradeNo) {
+        WxPayOrder order = dao.selectOrderByTradeNo(tradeNo);
+        if (null != order && order.getTradeState() == Transaction.TradeStateEnum.SUCCESS) {
+            String payTime = DateUtil.formatDatetime(order.getPayDatetime());
+            new CytjService().notifyPaymentSuccess(order, payTime);
+        }
+    }
 }