فهرست منبع

feature: 微信充值
1.完成充值订单生成及支付成功后的订单处理和入账

luoyb 1 سال پیش
والد
کامیت
f74e042431

+ 10 - 10
pom.xml

@@ -91,21 +91,21 @@
         <profile>
             <id>prod</id>
             <properties>
-<!--                <profiles.active>prod</profiles.active>-->
-<!--                <nacos.server>10.32.23.157:8848</nacos.server>-->
-<!--                <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>-->
-<!--                <nacos.config.group>DEFAULT_GROUP</nacos.config.group>-->
-<!--                <nacos.username>nacos</nacos.username>-->
-<!--                <nacos.password>nacos</nacos.password>-->
-<!--                <logstash.address>10.32.23.157:4560</logstash.address>-->
-                <!-- 党校本地环境 -->
                 <profiles.active>prod</profiles.active>
-                <nacos.server>172.16.137.72:8848</nacos.server>
+                <nacos.server>10.32.23.157:8848</nacos.server>
                 <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
                 <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
                 <nacos.username>nacos</nacos.username>
                 <nacos.password>nacos</nacos.password>
-                <logstash.address>172.16.137.72:4560</logstash.address>
+                <logstash.address>10.32.23.157:4560</logstash.address>
+                <!-- 党校本地环境 -->
+<!--                <profiles.active>prod</profiles.active>-->
+<!--                <nacos.server>172.16.137.72:8848</nacos.server>-->
+<!--                <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>-->
+<!--                <nacos.config.group>DEFAULT_GROUP</nacos.config.group>-->
+<!--                <nacos.username>nacos</nacos.username>-->
+<!--                <nacos.password>nacos</nacos.password>-->
+<!--                <logstash.address>172.16.137.72:4560</logstash.address>-->
             </properties>
             <activation>
                 <!-- 默认环境 -->

+ 17 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CreditTypeEnum.java

@@ -171,6 +171,23 @@ public enum CreditTypeEnum {
         return null;
     }
 
+    public static CreditTypeEnum fromCode(Integer code) {
+        for (CreditTypeEnum item : CreditTypeEnum.values()) {
+            if (item.code().equals(code)) {
+                return item;
+            }
+        }
+        return null;
+    }
+    public static CreditTypeEnum fromMessage(String message) {
+        for (CreditTypeEnum item : CreditTypeEnum.values()) {
+            if (item.message().equals(message)) {
+                return item;
+            }
+        }
+        return null;
+    }
+
     @Override
     public String toString() {
         return this.name();

+ 94 - 22
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/ThirdPayBusiness.java

@@ -1,5 +1,7 @@
 package org.dromara.backstage.business.payments;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -34,6 +36,11 @@ public class ThirdPayBusiness {
     private final IPayOrderService payOrderService;
     private final PayOrderBusiness payOrderBusiness;
 
+    /**
+     * 生成充值收款二维码
+     * @param bo 充值订单
+     * @return 二维码信息
+     */
     public R<Map<String,String>> createCollectQrCode(PayOrderBo bo){
         R<PayOrderVo> result = createThirdPayOrder(bo);
         if (R.isError(result)) {
@@ -42,20 +49,48 @@ public class ThirdPayBusiness {
         Map<String, String> mapCode = new HashMap<>();
         // TODO 2025-01-13 19:36:29 luoyibo 生成微信收款码
         mapCode.put("qrCode", "");
-        mapCode.put("orderSn", "");
+        mapCode.put("orderSn", result.getData().getOrderId().toString());
         return R.ok(mapCode);
     }
-    //public R<String> createWechatQrCode(PayOrderBo bo) {
-    //    R<PayOrderVo> result = createThirdPayOrder(bo);
-    //    if (R.isError(result)) {
-    //        return R.fail(result.getMsg());
-    //    }
-    //    // TODO 2025-01-13 19:36:29 luoyibo 生成微信收款码
-    //    return R.ok();
-    //}
-    public R<String> payCallBackHandler(PayOrderBo bo){
-        // TODO 2025-01-13 19:38:22 luoyibo 根据支付成功与否处理
-        R<Void> postResult = postThirdPayOrder(bo);
+
+    /**
+     * 第三方支付回调处理
+     * 1.更新订单的支付状态
+     * 2.订单充值入账
+     * 3.更新订单的入账状态
+     *
+     * @param bo 订单信息
+     * @return 处理结果
+     */
+    public R<PayOrderVo> payCallBackHandler(PayOrderBo bo){
+        // 1.设置支付订单的支付状态
+        R<PayOrderVo> result = setOrderPayResult(bo);
+        if (R.isError(result)) {
+            return R.fail(result.getMsg());
+        }
+        PayOrderVo vo = result.getData();
+        String creditStatus = CreditStatusEnum.SUCCESS.code().toString();
+        if (ObjectUtil.equals(vo.getCreditStatus(), creditStatus) && ObjectUtil.isNotEmpty(vo.getOriginalId())) {
+            log.warn("[订单已入账]-[{}]", JSONUtil.toJsonStr(bo));
+            return R.ok();
+        }
+        PayOrderBo postBo = BeanUtil.copyProperties(result.getData(), PayOrderBo.class);
+        // 2.订单入账一卡通账户
+        R<PurseInOutBo> postResult = postThirdPayOrder(postBo);
+        if (R.isError(postResult)) {
+            log.error("[订单入账失败]-[{}]", JSONUtil.toJsonStr(postBo));
+            return R.fail("订单入账失败");
+        }
+        // 3.更新订单的入账状态
+        if (R.isSuccess(postResult)) {
+            // 更新支付订单表的入账状态
+            PayOrderBo updateBo = new PayOrderBo();
+            updateBo.setOrderId(postBo.getOrderId());
+            updateBo.setOriginalId(postResult.getData().getOriginalId());
+            updateBo.setCreditStatus(CreditStatusEnum.SUCCESS.code().toString());
+
+            return setOrderPostResult(updateBo);
+        }
         return R.ok();
     }
 
@@ -72,8 +107,12 @@ public class ThirdPayBusiness {
         return R.fail(MessageFormat.format("[{0}]-[订单创建失败]", CreditTypeEnum.getMessage(bo.getCreditType())));
     }
 
-    public R<Void> postThirdPayOrder(PayOrderBo bo) {
-        payOrderService.updateByBo(bo);
+    /**
+     * 第三方支付订单入账
+     * @param bo 订单信息
+     * @return 入账结果
+     */
+    public R<PurseInOutBo> postThirdPayOrder(PayOrderBo bo) {
         // 将支付订单信息转换成一卡通充值数据进行充值
         PurseInOutBo purseInOutBo = new PurseInOutBo();
         purseInOutBo.setUserId(bo.getUserId());
@@ -81,20 +120,53 @@ public class ThirdPayBusiness {
         purseInOutBo.setTakeCommission("0");
         purseInOutBo.setReceiptMoney(bo.getReceiptMoney());
         purseInOutBo.setOperationMode(BalanceUpdateEnum.RECHARGE);
-        purseInOutBo.setCreditType(CreditTypeEnum.valueOf(CreditTypeEnum.getMessage(bo.getCreditType())));
+        purseInOutBo.setCreditType(CreditTypeEnum.fromCode(Integer.valueOf(bo.getCreditType())));
         //purseInOutBo.setStationId();
         purseInOutBo.setOperatorId(bo.getUserId());
         purseInOutBo.setOperatorName(bo.getRealName());
         purseInOutBo.setCustomerSn(bo.getOrderId().toString());
         purseInOutBo.setPayeeSn(bo.getPaySn());
+        //充值默认充值至现金钱包
+        purseInOutBo.setBagCode("1");
 
-        R<PurseInOutBo> rechargeResult = payOrderBusiness.recharge(purseInOutBo);
-        if (R.isSuccess(rechargeResult)) {
-            // 更新支付订单表的入账状态
-            bo.setCreditStatus(CreditStatusEnum.SUCCESS.code().toString());
-            bo.setOriginalId(purseInOutBo.getOriginalId());
-            payOrderService.updateByBo(bo);
+        return payOrderBusiness.recharge(purseInOutBo);
+    }
+
+    /**
+     * 更新订单的支付状态
+     * @param bo 订单信息
+     * @return 更新结果
+     */
+    public R<PayOrderVo> setOrderPayResult(PayOrderBo bo) {
+        PayOrderVo vo = payOrderService.queryById(bo.getOrderId());
+        if (ObjectUtil.isEmpty(vo)) {
+            log.error("[更新订单状状态失败]-[无此支付订单]-[{}]", JSONUtil.toJsonStr(bo));
+            return R.fail("[更新订单状状态失败]-[无此支付订单]");
         }
-        return R.ok();
+        String paySn = vo.getPaySn();
+        if (ObjectUtil.isNotEmpty(paySn) && ObjectUtil.notEqual(paySn, bo.getPaySn())) {
+            log.error("[更新订单状状态失败]-[收款方流水号和系统不一致]-[{}]", JSONUtil.toJsonStr(bo));
+            return R.fail("[更新订单状状态失败]-[收款方流水号和系统不一致]");
+        }
+        vo = payOrderService.updateOrderStatus(bo);
+        if (ObjectUtil.isEmpty(vo)) {
+            log.error("[更新订单支付状态失败]-[{}]", JSONUtil.toJsonStr(bo));
+            return R.fail("[更新订单支付状态失败]");
+        }
+        return R.ok(vo);
+    }
+
+    /**
+     * 更新订单的入账状态
+     * @param bo 订单信息
+     * @return 更新结果
+     */
+    public R<PayOrderVo> setOrderPostResult(PayOrderBo bo) {
+        PayOrderVo vo = payOrderService.updateOrderStatus(bo);
+        if (ObjectUtil.isEmpty(vo)) {
+            log.error("[更新订单入账状态失败]-[{}]", JSONUtil.toJsonStr(bo));
+            return R.fail("[更新订单入账状态失败]");
+        }
+        return R.ok(vo);
     }
 }

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/self/TraineeBusiness.java

@@ -155,7 +155,7 @@ public class TraineeBusiness {
         // 学员培训班级信息
         RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptById(Long.valueOf(bo.getDeptId()));
         bo.setTeamName(remoteDeptVo.getDeptName());
-        bo.setCheckInDate(remoteDeptVo.getCheckDate());
+        bo.setCheckInDate(DateUtil.date());
         bo.setCheckoutDate(remoteDeptVo.getEndDate());
         // 获取学员作为入住客人的信息
         bo.setOtherUserId(ycTraineeVo.getOtherId());

+ 25 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/ThirdPayController.java

@@ -1,16 +1,24 @@
 package org.dromara.backstage.payment.controller;
 
+import cn.hutool.core.date.DateUtil;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.dromara.backstage.business.payments.ThirdPayBusiness;
+import org.dromara.backstage.payment.domain.bo.PayOrderBo;
+import org.dromara.backstage.payment.domain.vo.PayOrderVo;
 import org.dromara.common.core.api.ResponseResult;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.enums.PayStatusEnum;
 import org.dromara.common.web.core.BaseController;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
  * name: ThirdPayController
  * package: org.dromara.backstage.payment.controller
- * description: 第三方支付Controller
+ * description: 第三方支付控制器
  * date: 2025-01-13 19:05:09 19:05
  *
  * @author luoyibo
@@ -23,4 +31,20 @@ import org.springframework.web.bind.annotation.RestController;
 @ResponseResult
 @RequestMapping("/third-pay")
 public class ThirdPayController extends BaseController {
+    private final ThirdPayBusiness thirdPayBusiness;
+    /**
+     * 第三方支付结果回调
+     * @param orderSn 订单号(一卡通创建)
+     * @param paySn 支付流水号(第三方支付收款方创建)
+     */
+    @RequestMapping("/result/{orderSn}/{paySn}")
+    public R<PayOrderVo> callBackThirdPay(@PathVariable("orderSn") String orderSn,@PathVariable("paySn") String paySn){
+        PayOrderBo bo = new PayOrderBo();
+        bo.setOrderId(Long.valueOf(orderSn));
+        bo.setPaySn(paySn);
+        bo.setPayStatus(PayStatusEnum.SUCCESS.code().toString());
+        bo.setCreditTime(DateUtil.date());
+
+        return thirdPayBusiness.payCallBackHandler(bo);
+    }
 }

+ 14 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPayOrderService.java

@@ -65,4 +65,18 @@ public interface IPayOrderService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 更新订单信息
+     * @param bo 待更新订单
+     * @return 订单信息
+     */
+    PayOrderVo updateOrderStatus(PayOrderBo bo);
+
+    /**
+     * 查询订单信息
+     * @param bo 查询条件
+     * @return 订单信息
+     */
+    PayOrderVo queryByBo(PayOrderBo bo);
 }

+ 40 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PayOrderServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.backstage.payment.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.dromara.backstage.payment.domain.PayOrder;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -120,9 +121,48 @@ public class PayOrderServiceImpl implements IPayOrderService {
         return baseMapper.deleteByIds(ids) > 0;
     }
 
+    /**
+     * 查询订单信息
+     * @param bo 查询条件
+     * @return 订单信息
+     */
+    @Override
+    public PayOrderVo queryByBo(PayOrderBo bo) {
+        LambdaQueryWrapper<PayOrder> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoOne(lqw);
+    }
+
+    /**
+     * 更新订单信息
+     * @param bo 待更新订单
+     * @return 订单信息
+     */
+    @Override
+    public PayOrderVo updateOrderStatus(PayOrderBo bo) {
+        LambdaUpdateWrapper<PayOrder> luw = new LambdaUpdateWrapper<>();
+        luw.set(StringUtils.isNotBlank(bo.getPaySn()),PayOrder::getPaySn, bo.getPaySn());
+        luw.set(StringUtils.isNotBlank(bo.getPayStatus()), PayOrder::getPayStatus, bo.getPayStatus());
+        luw.set(bo.getCreditTime() != null, PayOrder::getCreditTime, bo.getCreditTime());
+        luw.set(StringUtils.isNotBlank(bo.getCreditStatus()), PayOrder::getCreditStatus, bo.getCreditStatus());
+        luw.set(StringUtils.isNotBlank(bo.getOriginalId()), PayOrder::getOriginalId, bo.getOriginalId());
+
+        luw.eq(PayOrder::getOrderId, bo.getOrderId());
+
+        if(baseMapper.update(null, luw)>0){
+            return baseMapper.selectVoById(bo.getOrderId());
+        }
+        return null;
+    }
+
+    /**
+     * 通用查询条件构建
+     * @param bo 查询条件
+     * @return 查询条件表达式
+     */
     private LambdaQueryWrapper<PayOrder> buildQueryWrapper(PayOrderBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<PayOrder> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getOrderId() != null, PayOrder::getOrderId, bo.getOrderId());
         lqw.eq(StringUtils.isNotBlank(bo.getPaySn()), PayOrder::getPaySn, bo.getPaySn());
         lqw.eq(bo.getCreditTime() != null, PayOrder::getCreditTime, bo.getCreditTime());
         lqw.eq(StringUtils.isNotBlank(bo.getCreditType()), PayOrder::getCreditType, bo.getCreditType());