TRX 1 gadu atpakaļ
vecāks
revīzija
ad29c17be7

+ 17 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/WxOrderPrePayParam.java

@@ -0,0 +1,17 @@
+package com.zhongshu.card.client.model.payment;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2025/1/21
+ */
+@Data
+public class WxOrderPrePayParam {
+
+    private String id;
+
+    @Schema(description = "openid")
+    private String openid;
+}

+ 14 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/WxOrderPrePayResult.java

@@ -0,0 +1,14 @@
+package com.zhongshu.card.client.model.payment;
+
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2025/1/21
+ */
+@Data
+public class WxOrderPrePayResult {
+    private String id;
+
+    private Object param;
+}

+ 3 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/payment/OrderController.java

@@ -6,6 +6,7 @@ import com.github.microservice.auth.security.type.AuthType;
 import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.model.base.IDParam;
 import com.zhongshu.card.client.model.devices.order.DeviceQrCodeParam;
+import com.zhongshu.card.client.model.payment.WxOrderPrePayParam;
 import com.zhongshu.card.server.core.service.payment.ExpenseFlowServiceImpl;
 import com.zhongshu.card.server.core.service.payment.OrderService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -50,8 +51,8 @@ public class OrderController {
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "开始支付订单")
     @RequestMapping(value = {"payOrder"}, method = {RequestMethod.POST})
-    public ResultContent payOrder(@RequestBody IDParam param) {
-        return expenseFlowService.initSurePaymentTypeOrderPay(param.getId());
+    public ResultContent payOrder(@RequestBody WxOrderPrePayParam param) {
+        return expenseFlowService.initWxSurePaymentTypeOrderPay(param);
     }
 
     @ResourceAuth(value = "user", type = AuthType.User)

+ 103 - 16
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java

@@ -3,6 +3,7 @@ package com.zhongshu.card.server.core.service.payment;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.github.microservice.core.util.JsonUtil;
 import com.github.microservice.http.APIResponseModel;
 import com.github.microservice.models.hxz.ConsumTransactionsModel;
 import com.github.microservice.models.hxz.ConsumTransactionsResult;
@@ -13,14 +14,18 @@ import com.github.microservice.models.type.DeviceState;
 import com.github.microservice.models.type.OrderFromType;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.net.ResultMessage;
+import com.github.microservice.pay.client.model.ledger.TransactionLogModel;
+import com.github.microservice.pay.client.model.weChatMiniApp.WeChatMiniAppPayRet;
 import com.github.microservice.types.OrderModeType;
 import com.github.microservice.types.OrderState;
 import com.github.microservice.types.payment.ChargeableType;
 import com.github.microservice.types.payment.PaymentDeviceType;
 import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.client.model.base.SuperSearch;
+import com.zhongshu.card.client.model.mqtt.SendMessageModel;
 import com.zhongshu.card.client.model.org.UserJoinBusOrgModel;
 import com.zhongshu.card.client.model.pay.RechargeOrderModel;
+import com.zhongshu.card.client.model.pay.WeChatPrepayParam;
 import com.zhongshu.card.client.model.payment.*;
 import com.zhongshu.card.client.model.payment.statistic.BusinessMainStatisticModel;
 import com.zhongshu.card.client.model.payment.statistic.StatisticItem;
@@ -30,11 +35,11 @@ import com.zhongshu.card.client.service.payment.ExpenseFlowService;
 import com.zhongshu.card.client.type.RefundState;
 import com.zhongshu.card.client.type.StatisticType;
 import com.zhongshu.card.client.type.UserState;
+import com.zhongshu.card.client.type.payAccount.RechargeOrderStatus;
 import com.zhongshu.card.client.type.payment.SettlementState;
 import com.zhongshu.card.client.type.school.CardState;
 import com.zhongshu.card.client.utils.DateUtils;
 import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
-import com.zhongshu.card.server.core.dao.devices.DevicePermissDao;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.org.UserCountDao;
 import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
@@ -50,9 +55,9 @@ import com.zhongshu.card.server.core.service.base.CommonService;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.devices.DeviceInfoServiceImpl;
 import com.zhongshu.card.server.core.service.devices.permiss.DevicePermissVerifyService;
+import com.zhongshu.card.server.core.service.mqtt.MqttServiceImpl;
 import com.zhongshu.card.server.core.service.org.OrganizationServiceImpl;
-import com.zhongshu.card.server.core.service.orgManager.OrganizationManagerServiceImpl;
-import com.zhongshu.card.server.core.service.paySetting.ProjectPaySettingServiceImpl;
+import com.zhongshu.card.server.core.service.pay.WechatPayService;
 import com.zhongshu.card.server.core.service.school.AreaServiceImpl;
 import com.zhongshu.card.server.core.util.*;
 import lombok.extern.slf4j.Slf4j;
@@ -97,12 +102,6 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
     @Autowired
     private OrganizationDao organizationDao;
 
-    @Autowired
-    private ProjectPaySettingServiceImpl projectPaySettingService;
-
-    @Autowired
-    private DevicePermissDao devicePermissDao;
-
     @Autowired
     private PayCallService payCallService;
 
@@ -115,11 +114,15 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
     @Autowired
     private DeviceInfoServiceImpl deviceInfoService;
 
-    @Autowired
-    private OrganizationManagerServiceImpl organizationManagerService;
     @Autowired
     private CommonService commonService;
 
+    @Autowired
+    private WechatPayService wechatPayService;
+
+    @Autowired
+    private MqttServiceImpl mqttService;
+
     /**
      * 创建流水
      *
@@ -390,10 +393,11 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
     /**
      * 开始支付订单,封装支付参数(如:微信支付)
      *
-     * @param id
+     * @param param
      * @return
      */
-    public ResultContent initSurePaymentTypeOrderPay(String id) {
+    public ResultContent initWxSurePaymentTypeOrderPay(WxOrderPrePayParam param) {
+        String id = param.getId();
         ExpenseFlow expenseFlow = expenseFlowDao.findTopById(id);
         if (ObjectUtils.isEmpty(expenseFlow)) {
             return ResultContent.buildFail("订单不存在");
@@ -403,10 +407,93 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
             return ResultContent.buildFail(orderPayModel.getPayMsg());
         }
 
-        // 组装支付参数
-
+        WxOrderPrePayResult result = new WxOrderPrePayResult();
+        result.setId(param.getId());
+        String key = PaymentType.WeChatPay.name();
+        Object value = expenseFlow.getMetaInfo().get(key);
+        if (value == null) {
+            // 组装支付参数
+            WeChatPrepayParam prepayParam = new WeChatPrepayParam();
+            prepayParam.setAppid(getCurrentAppId());
+            prepayParam.setProjectOid(expenseFlow.getProjectOid());
+            prepayParam.setOid(expenseFlow.getShopOid());
+            prepayParam.setUserId(getCurrentUserId());
+            prepayParam.setOpenid(param.getOpenid());
+            prepayParam.setDescription("扫码下单支付");
+            prepayParam.setOrderNo(expenseFlow.getPaymentNo());
+            prepayParam.setTotal(expenseFlow.getPayAmount().longValue());
+            ResultContent<Object> resultContent = wechatPayService.prepay(prepayParam);
+            if (resultContent.isSuccess()) {
+                value = resultContent.getCode();
+            } else {
+                return ResultContent.buildFail(resultContent.getMsg());
+            }
+            expenseFlow.addMetaInfo(key, value);
+            expenseFlowDao.save(expenseFlow);
+        }
+        result.setParam(value);
+        return ResultContent.buildSuccess(result);
+    }
 
-        return ResultContent.buildSuccess();
+    /**
+     * 微信支付结果回调
+     *
+     * @param ret
+     */
+    public void handleWxSurePaymentTypeOrderPayCallSuccess(WeChatMiniAppPayRet ret) {
+        String orderNo = ret.getOutTradeNo();
+        ExpenseFlow expenseFlow = expenseFlowDao.findTopByPaymentNo(orderNo);
+        if (ObjectUtils.isNotEmpty(expenseFlow)) {
+            // 支付结果状态
+            switch (ret.getTradeState()) {
+                case "SUCCESS" -> {
+                    log.info("收到的消息Success:{}", JsonUtil.toJson(ret));
+                    expenseFlow.setOrderState(OrderState.HAVE_PAID);
+                    expenseFlow.setPayRemark(ret.getTradeStateDesc());
+
+                    com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> content = wechatPayService.handleTransactions(expenseFlow.getProjectOid(), expenseFlow.getShopOid(), expenseFlow.getUserId(), expenseFlow.getPaymentNo(), expenseFlow.getPayAmount());
+                    expenseFlow.setIsPaySuccess(Boolean.TRUE);
+
+                    if (content.getState() == com.github.microservice.pay.client.ret.ResultState.Success) {
+                        // 关联参数
+                        String msg = "支付成功";
+                        List<TransactionLogModel> list = content.getContent();
+                        expenseFlow.setTransactionIds(list);
+                        expenseFlow.setPaymentStatus(msg);
+                        expenseFlow.setPayRemark(msg);
+                    } else {
+                        expenseFlow.setPayRemark(String.format("调用支付中心失败: {}", content.getMsg()));
+                    }
+                    expenseFlowDao.save(expenseFlow);
+
+                    // 发送消息
+                    SendMessageModel sendMessageModel = new SendMessageModel();
+                    sendMessageModel.setMessage(JsonUtil.toJson(Map.of("status", RechargeOrderStatus.Success.name(),
+                            "orderNo", expenseFlow.getPaymentNo())));
+
+                    String userId = expenseFlow.getUserId();
+                    String topic = String.format("/wechat/pay/%s", userId);
+                    sendMessageModel.setTopic(topic);
+                    sendMessageModel.setUserId(userId);
+                    log.info("mq topic : {}", topic);
+                    mqttService.sendMessage(sendMessageModel);
+                }
+                case "PAYERROR", "REFUND" -> {
+                    expenseFlow.setOrderState(OrderState.PAID_ERROR);
+                    expenseFlow.setPayRemark(ret.getTradeStateDesc());
+                    expenseFlow.setIsPaySuccess(Boolean.FALSE);
+                    expenseFlowDao.save(expenseFlow);
+                }
+                case "CLOSED" -> {
+                    expenseFlow.setOrderState(OrderState.CLOSED);
+                    expenseFlow.setPayRemark(ret.getTradeStateDesc());
+                    expenseFlow.setIsPaySuccess(Boolean.FALSE);
+                    expenseFlowDao.save(expenseFlow);
+                }
+            }
+        } else {
+            log.error("wxSurePaymentTypeOrderPayCallSuccess 订单为空: {}", orderNo);
+        }
     }
 
     /**

+ 5 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/stream/WeChatMiniAppPayStream.java

@@ -3,6 +3,7 @@ package com.zhongshu.card.server.core.stream;
 import com.github.microservice.app.stream.StreamConsumer;
 import com.github.microservice.pay.client.model.weChatMiniApp.WeChatMiniAppPayRet;
 import com.zhongshu.card.server.core.service.pay.BalancePayService;
+import com.zhongshu.card.server.core.service.payment.ExpenseFlowServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -14,9 +15,13 @@ public class WeChatMiniAppPayStream extends StreamConsumer<WeChatMiniAppPayRet>
     @Autowired
     BalancePayService balancePayService;
 
+    @Autowired
+    private ExpenseFlowServiceImpl expenseFlowService;
+
     @Override
     public void accept(WeChatMiniAppPayRet weChatMiniAppPayRet) {
         log.info("---------------收到微信支付结果通知广播----------------");
         balancePayService.handleWeChatCallback(weChatMiniAppPayRet);
+        expenseFlowService.handleWxSurePaymentTypeOrderPayCallSuccess(weChatMiniAppPayRet);
     }
 }