Переглянути джерело

Merge branch 'dev/2024/0703/update-app-Y' of Harper/feifan-backend-zx-app into master

新增支付通道
Yangzw 8 місяців тому
батько
коміт
f73aa1d0a1

+ 59 - 52
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderServiceImpl.java

@@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
+import cn.newfeifan.mall.framework.common.exception.ErrorCode;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.util.date.LocalDateTimeUtils;
 import cn.newfeifan.mall.framework.common.util.number.MoneyUtils;
@@ -95,10 +96,10 @@ public class PayOrderServiceImpl implements PayOrderService {
     @Override
     public PayOrderDO getOrderByStatus(PayOrderDO payOrderDO) {
         //添加验证是否支付成功
-        if(payOrderDO.getStatus().equals(PayOrderStatusEnum.WAITING.getStatus())){
+        if (payOrderDO.getStatus().equals(PayOrderStatusEnum.WAITING.getStatus())) {
             //修改程序,当微信支付回调的时候再次向微信请求查询pay订单的支付状态
-            log.info("============支付成功查询:支付订单号{}",payOrderDO.getId());
-            log.info("============支付成功查询:支付订单详情{}",payOrderDO);
+            log.info("============支付成功查询:支付订单号{}", payOrderDO.getId());
+            log.info("============支付成功查询:支付订单详情{}", payOrderDO);
             PayOrderExtensionDO payOrderExtensionDO = orderExtensionMapper.selectByPayId(payOrderDO.getId());
             syncOrder(payOrderExtensionDO);
         }
@@ -112,10 +113,10 @@ public class PayOrderServiceImpl implements PayOrderService {
     public PayOrderDO getOrderByStatus(Long id) {
         //添加验证是否支付成功
         PayOrderDO payOrderDO = orderMapper.selectById(id);
-        if(payOrderDO.getStatus().equals(PayOrderStatusEnum.WAITING.getStatus())){
+        if (payOrderDO.getStatus().equals(PayOrderStatusEnum.WAITING.getStatus())) {
             //修改程序,当微信支付回调的时候再次向微信请求查询pay订单的支付状态
-            log.info("============支付成功查询:支付订单号{}",payOrderDO.getId());
-            log.info("============支付成功查询:支付订单详情{}",payOrderDO);
+            log.info("============支付成功查询:支付订单号{}", payOrderDO.getId());
+            log.info("============支付成功查询:支付订单详情{}", payOrderDO);
             PayOrderExtensionDO payOrderExtensionDO = orderExtensionMapper.selectByPayId(payOrderDO.getId());
             syncOrder(payOrderExtensionDO);
         }
@@ -195,53 +196,59 @@ public class PayOrderServiceImpl implements PayOrderService {
     @Override // 注意,这里不能添加事务注解,避免调用支付渠道失败时,将 PayOrderExtensionDO 回滚了
     public PayOrderSubmitRespVO submitOrder(PayOrderSubmitReqVO reqVO, String userIp) {
 
-        log.warn("[submitOrder--------->unifiedOrderResp][订单id({})000000支付开始]", reqVO.getId());
-
-
-        // 1.1 获得 PayOrderDO ,并校验其是否存在
-        PayOrderDO order = validateOrderCanSubmit(reqVO.getId());
-        // 1.32 校验支付渠道是否有效
-        PayChannelDO channel = validateChannelCanSubmit(order.getAppId(), reqVO.getChannelCode());
-        PayClient client = channelService.getPayClient(channel.getId());
-
-        log.warn("[submitOrder--------->unifiedOrderResp][订单id({})1111111支付渠道校验通过]", order.getId());
-
-        // 2. 插入 PayOrderExtensionDO
-        String no = noRedisDAO.generate(payProperties.getOrderNoPrefix());
-        PayOrderExtensionDO orderExtension = PayOrderConvert.INSTANCE.convert(reqVO, userIp)
-                .setOrderId(order.getId()).setNo(no)
-                .setChannelId(channel.getId()).setChannelCode(channel.getCode())
-                .setStatus(PayOrderStatusEnum.WAITING.getStatus());
-        orderExtensionMapper.insert(orderExtension);
-
-        log.warn("[submitOrder--------->unifiedOrderResp][订单id({})2222222支付渠道校验通过]", order.getId());
-
-        // 3. 调用三方接口
-        PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderConvert.INSTANCE.convert2(reqVO, userIp)
-                // 商户相关的字段
-                .setOutTradeNo(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性!
-                .setSubject(order.getSubject()).setBody(order.getBody())
-                .setNotifyUrl(genChannelOrderNotifyUrl(channel))
-                .setReturnUrl(reqVO.getReturnUrl())
-                // 订单相关字段
-                .setPrice(order.getPrice()).setExpireTime(order.getExpireTime());
-        PayOrderRespDTO unifiedOrderResp = client.unifiedOrder(unifiedOrderReqDTO);
-
-        log.warn("[submitOrder--------->unifiedOrderResp][订单id({})333333支付完成,支付状态({})]", order.getId(), unifiedOrderResp.getStatus());
-
-        // 4. 如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功
-        if (unifiedOrderResp != null) {
-            getSelf().notifyOrder(channel, unifiedOrderResp);
-            // 如有渠道错误码,则抛出业务异常,提示用户
-            if (StrUtil.isNotEmpty(unifiedOrderResp.getChannelErrorCode())) {
-                throw exception(PAY_ORDER_SUBMIT_CHANNEL_ERROR, unifiedOrderResp.getChannelErrorCode(),
-                        unifiedOrderResp.getChannelErrorMsg());
+        try {
+//            int i = 0/0;
+            log.warn("[submitOrder--------->unifiedOrderResp][订单id({})000000支付开始]", reqVO.getId());
+
+
+            // 1.1 获得 PayOrderDO ,并校验其是否存在
+            PayOrderDO order = validateOrderCanSubmit(reqVO.getId());
+            // 1.32 校验支付渠道是否有效
+            PayChannelDO channel = validateChannelCanSubmit(order.getAppId(), reqVO.getChannelCode());
+            PayClient client = channelService.getPayClient(channel.getId());
+
+            log.warn("[submitOrder--------->unifiedOrderResp][订单id({})1111111支付渠道校验通过]", order.getId());
+
+            // 2. 插入 PayOrderExtensionDO
+            String no = noRedisDAO.generate(payProperties.getOrderNoPrefix());
+            PayOrderExtensionDO orderExtension = PayOrderConvert.INSTANCE.convert(reqVO, userIp)
+                    .setOrderId(order.getId()).setNo(no)
+                    .setChannelId(channel.getId()).setChannelCode(channel.getCode())
+                    .setStatus(PayOrderStatusEnum.WAITING.getStatus());
+            orderExtensionMapper.insert(orderExtension);
+
+            log.warn("[submitOrder--------->unifiedOrderResp][订单id({})2222222支付渠道校验通过]", order.getId());
+
+            // 3. 调用三方接口
+            PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderConvert.INSTANCE.convert2(reqVO, userIp)
+                    // 商户相关的字段
+                    .setOutTradeNo(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性!
+                    .setSubject(order.getSubject()).setBody(order.getBody())
+                    .setNotifyUrl(genChannelOrderNotifyUrl(channel))
+                    .setReturnUrl(reqVO.getReturnUrl())
+                    // 订单相关字段
+                    .setPrice(order.getPrice()).setExpireTime(order.getExpireTime());
+            PayOrderRespDTO unifiedOrderResp = client.unifiedOrder(unifiedOrderReqDTO);
+
+            log.warn("[submitOrder--------->unifiedOrderResp][订单id({})333333支付完成,支付状态({})]", order.getId(), unifiedOrderResp.getStatus());
+
+            // 4. 如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功
+            if (unifiedOrderResp != null) {
+                getSelf().notifyOrder(channel, unifiedOrderResp);
+                // 如有渠道错误码,则抛出业务异常,提示用户
+                if (StrUtil.isNotEmpty(unifiedOrderResp.getChannelErrorCode())) {
+                    throw exception(PAY_ORDER_SUBMIT_CHANNEL_ERROR, unifiedOrderResp.getChannelErrorCode(),
+                            unifiedOrderResp.getChannelErrorMsg());
+                }
+                // 此处需要读取最新的状态
+                order = orderMapper.selectById(order.getId());
             }
-            // 此处需要读取最新的状态
-            order = orderMapper.selectById(order.getId());
+            log.warn("如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功:{}", unifiedOrderResp);
+            return PayOrderConvert.INSTANCE.convert(order, unifiedOrderResp);
+        } catch (Exception e) {
+            ErrorCode err = new ErrorCode(1,e.getMessage());
+            throw exception(err);
         }
-        log.warn("如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功:{}", unifiedOrderResp);
-        return PayOrderConvert.INSTANCE.convert(order, unifiedOrderResp);
     }
 
     @Override
@@ -549,7 +556,7 @@ public class PayOrderServiceImpl implements PayOrderService {
                 return false;
             }
             PayOrderRespDTO respDTO = payClient.getOrder(orderExtension.getNo());
-            log.info("===========微信回调结果PayOrderRespDTO:{}",respDTO);
+            log.info("===========微信回调结果PayOrderRespDTO:{}", respDTO);
             // 1.2 回调支付结果
             notifyOrder(orderExtension.getChannelId(), respDTO);