From 128b41b50a0524304f4a586d64ec105a050a95fc Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期五, 27 二月 2026 14:56:03 +0800
Subject: [PATCH] 优化
---
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