From 70fab9b9607f18df92fc2c7c0efced0dcd55d5fc Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期一, 02 三月 2026 09:46:04 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java |  236 +++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 198 insertions(+), 38 deletions(-)

diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java
index b18935b..b13116e 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java
@@ -1,24 +1,40 @@
 package com.ruoyi.web.controller.api;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.CodeGenerateUtils;
 import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.model.TCourseOrder;
+import com.ruoyi.system.model.TInsurance;
+import com.ruoyi.system.model.TInsuranceOrder;
+import com.ruoyi.system.service.TCourseOrderService;
+import com.ruoyi.system.service.TInsuranceOrderService;
+import com.ruoyi.system.wxPay.enums.RefundEnum;
 import com.ruoyi.system.wxPay.enums.TradeStateEnum;
 import com.ruoyi.system.wxPay.model.WeixinPayProperties;
+import com.ruoyi.system.wxPay.utils.WxTimeUtils;
 import com.ruoyi.system.wxPay.utils.WxV3Pay;
 import com.wechat.pay.contrib.apache.httpclient.util.AesUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.BufferedReader;
+import java.io.IOException;
 import java.io.PrintWriter;
+import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * 微信相关接口
@@ -36,35 +52,13 @@
     @Autowired
     private WeixinPayProperties weixinPayProperties;
 
+    @Autowired
+    private TCourseOrderService courseOrderService;
+
+    @Autowired
+    private TInsuranceOrderService tInsuranceOrderService;
 
 
-    /**
-     * 按实际修改
-     */
-    @ApiOperation("订单支付")
-    @PostMapping("orderPay")
-    public R<Map<String, Object>> orderPay(@RequestParam(value = "inspectionId") String inspectionId) {
-
-//        TSysOtherConfig sysOtherConfig = sysOtherConfigService.getById(1);
-//        if (Objects.isNull(sysOtherConfig.getAiPrice())) {
-//            return R.fail("系统未配置AI支付价格");
-//        }
-//
-//        String userId = tokenService.getLoginUserApplet().getUserId();
-//        TSysAppUser sysAppUser = sysAppUserService.getById(userId);
-//        // 价格
-//        Long totalPrice = sysOtherConfig.getAiPrice().multiply(new BigDecimal(100)).longValue();
-//        // 生成订单号
-//        String orderNo = CodeGenerateUtils.generateOrderSn();
-//        // 查询用户信息 用户openid
-//        String openId = sysAppUser.getOpenId();
-//        // 存储支付记录
-//        sysPayRecordService.saveData(orderNo, userId, sysOtherConfig.getAiPrice(), 1);
-//        // 调用支付方法
-//        Map<String, Object> result = wxV3Pay.jsApi(orderNo, totalPrice, openId,"AI检测报告支付","");
-//        log.info("支付参数:{}", result);
-        return R.ok();
-    }
 
     /**
      * 支付回调
@@ -94,20 +88,16 @@
             String trade_state = jsonInfo.getString("trade_state");
             String success_time = jsonInfo.getString("success_time");
             // 查询订单
-//            TSysPayRecord sysPayRecord = sysPayRecordService.getOne(Wrappers.lambdaQuery(TSysPayRecord.class)
-//                    .eq(TSysPayRecord::getOrderNo, out_trade_no).last("LIMIT 1"));
+
+            TCourseOrder order = courseOrderService.getOne(Wrappers.lambdaQuery(TCourseOrder.class)
+                    .eq(TCourseOrder::getOrderNumber, out_trade_no).last("LIMIT 1"));
             if (trade_state.equals(TradeStateEnum.SUCCESS.name())) {
                 log.info("回调成功");
                 // 订单号查询订单
-//                sysPayRecord.setPayState(2);
-//                sysPayRecord.setPayTime(WxTimeUtils.dateToLocalDateTime(WxTimeUtils.toRfc3339Date(success_time)));
-//                sysPayRecord.setTransactionId(transaction_id);
-//                sysPayRecordService.updateById(sysPayRecord);
-//
-//                // 处理检测报告为可见
-//                TSysInspection sysInspection = sysInspectionService.getById(sysPayRecord.getInspectionId());
-//                sysInspection.setIsPay(1);
-//                sysInspectionService.updateById(sysInspection);
+                order.setPayStatus(2);
+                order.setPayTime(WxTimeUtils.dateToLocalDateTime(WxTimeUtils.toRfc3339Date(success_time)));
+                order.setTransactionId(transaction_id);
+                courseOrderService.updateById(order);
 
                 PrintWriter out = response.getWriter();
                 out.print("SUCCESS");
@@ -119,4 +109,174 @@
             wxV3Pay.ack(false, e.getMessage());
         }
     }
+    /**
+     * 支付回调
+     */
+    @PostMapping("pay/notifyInsurance")
+    @ApiOperation("保险订单回调")
+    public void notifyInsurance(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        try {
+            System.err.println("微信回调");
+            BufferedReader reader = request.getReader();
+            StringBuilder requestBody = new StringBuilder();
+            String line;
+            while ((line = reader.readLine()) != null) {
+                requestBody.append(line);
+            }
+            System.err.println("全部请求体" + requestBody);
+            JSONObject jsonObject = JSONObject.parseObject(requestBody.toString());
+            JSONObject resource = jsonObject.getJSONObject("resource");
+
+            AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8));
+            String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8),
+                    resource.getString("ciphertext"));
+            System.err.println("微信解密的字符串信息" + decryptedData);
+            JSONObject jsonInfo = JSONObject.parse(decryptedData);
+            String out_trade_no = jsonInfo.getString("out_trade_no");
+            String transaction_id = jsonInfo.getString("transaction_id");
+            String trade_state = jsonInfo.getString("trade_state");
+            String success_time = jsonInfo.getString("success_time");
+            // 查询订单
+
+            TInsuranceOrder order = tInsuranceOrderService.getOne(Wrappers.lambdaQuery(TInsuranceOrder.class)
+                    .eq(TInsuranceOrder::getPayNo, out_trade_no).last("LIMIT 1"));
+            if (trade_state.equals(TradeStateEnum.SUCCESS.name())) {
+                log.info("回调成功");
+                // 订单号查询订单
+                order.setStatus(2);
+                order.setPayTime(LocalDateTime.now());
+                order.setTransactionId(transaction_id);
+                tInsuranceOrderService.updateById(order);
+
+                PrintWriter out = response.getWriter();
+                out.print("SUCCESS");
+                out.flush();
+                out.close();
+            }
+        } catch (Exception e) {
+            log.error("支付回调异常:{}", e, e);
+            wxV3Pay.ack(false, e.getMessage());
+        }
+    }
+
+
+    /**
+     * 退款回调
+     */
+//    @PostMapping("refund/notify")
+//    @ApiOperation("退款回调")
+//    public void refundNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
+//        try {
+////            System.err.println("微信回调");
+////            BufferedReader reader = request.getReader();
+////            StringBuilder requestBody = new StringBuilder();
+////            String line;
+////            while ((line = reader.readLine()) != null) {
+////                requestBody.append(line);
+////            }
+////            System.err.println("全部请求体" + requestBody);
+////            JSONObject jsonObject = JSONObject.parseObject(requestBody.toString());
+////            JSONObject resource = jsonObject.getJSONObject("resource");
+////            AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8));
+////            String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8), resource.getString("ciphertext"))
+//        }
+//    }
+    @PostMapping("refund/notify")
+    public void refundNotify(HttpServletRequest request) throws IOException {
+        try {
+
+            System.err.println("微信退款回调");
+            BufferedReader reader = request.getReader();
+            StringBuilder requestBody = new StringBuilder();
+            String line;
+            while ((line = reader.readLine()) != null) {
+                requestBody.append(line);
+            }
+            System.err.println("全部请求体" + requestBody);
+            JSONObject jsonObject = JSONObject.parseObject(requestBody.toString());
+            JSONObject resource = jsonObject.getJSONObject("resource");
+
+            AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8));
+            String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8),
+                    resource.getString("ciphertext"));
+            System.err.println("微信解密的字符串信息" + decryptedData);
+
+            JSONObject params = JSONObject.parseObject(decryptedData);
+
+            System.out.println("退款返回参数"+params);
+            // 商户订单号
+            String out_trade_no = params.get("out_trade_no").toString();
+            // 商户退款单号
+            String out_refund_no = params.get("out_refund_no").toString();
+            // 退款状态
+            String tradeState = params.get("refund_status").toString();
+            // 微信支付订单号
+            String transaction_id = params.get("transaction_id").toString();
+            if (tradeState.equals(RefundEnum.SUCCESS.name())) {
+                TCourseOrder order = courseOrderService.getOne(Wrappers.lambdaQuery(TCourseOrder.class)
+                        .eq(TCourseOrder::getRefundNumber, out_refund_no).last("LIMIT 1"));
+                order.setPayStatus(3);
+                order.setRefundStatus(2);
+                order.setRefundTransactionId(transaction_id);
+                courseOrderService.updateById(order);
+
+                wxV3Pay.ack();
+            }else {
+                TCourseOrder order = courseOrderService.getOne(Wrappers.lambdaQuery(TCourseOrder.class)
+                        .eq(TCourseOrder::getRefundNumber, out_refund_no).last("LIMIT 1"));
+                order.setRefundStatus(1);
+
+                courseOrderService.updateById(order);
+                wxV3Pay.ack();
+            }
+        }catch (Exception e){
+            wxV3Pay.ack(false, "不是成功的退款状态");
+        }
+    }
+
+
+    @PostMapping("refund/notifyInsurance")
+    public void notifyInsurance(HttpServletRequest request) throws IOException {
+        try {
+
+            System.err.println("微信退款回调");
+            BufferedReader reader = request.getReader();
+            StringBuilder requestBody = new StringBuilder();
+            String line;
+            while ((line = reader.readLine()) != null) {
+                requestBody.append(line);
+            }
+            System.err.println("全部请求体" + requestBody);
+            JSONObject jsonObject = JSONObject.parseObject(requestBody.toString());
+            JSONObject resource = jsonObject.getJSONObject("resource");
+
+            AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8));
+            String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8),
+                    resource.getString("ciphertext"));
+            System.err.println("微信解密的字符串信息" + decryptedData);
+
+            JSONObject params = JSONObject.parseObject(decryptedData);
+
+            // 商户订单号
+            String out_trade_no = params.get("out_trade_no").toString();
+            // 商户退款单号
+            String out_refund_no = params.get("out_refund_no").toString();
+            // 退款状态
+            String tradeState = params.get("refund_status").toString();
+            // 微信支付订单号
+            String transaction_id = params.get("transaction_id").toString();
+            if (tradeState.equals(RefundEnum.SUCCESS.name())) {
+                TInsuranceOrder order = tInsuranceOrderService.getOne(Wrappers.lambdaQuery(TInsuranceOrder.class)
+                        .eq(TInsuranceOrder::getRefundNumber, out_refund_no).last("LIMIT 1"));
+                order.setStatus(1);
+                order.setRefundStatus(2);
+                order.setRefundTransactionId(transaction_id);
+                tInsuranceOrderService.updateById(order);
+
+                wxV3Pay.ack();
+            }
+        }catch (Exception e){
+            wxV3Pay.ack(false, "不是成功的退款状态");
+        }
+    }
 }

--
Gitblit v1.7.1