From 34e64f1437ed897056bed0c3851e7a46ac220423 Mon Sep 17 00:00:00 2001 From: liujie <1793218484@qq.com> Date: 星期四, 18 九月 2025 18:01:57 +0800 Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/haizhentong --- ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 209 insertions(+), 0 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 new file mode 100644 index 0000000..d3c5629 --- /dev/null +++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java @@ -0,0 +1,209 @@ +package com.ruoyi.web.controller.api; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.fasterxml.jackson.core.type.TypeReference; +import com.ruoyi.common.core.domain.AjaxResult; +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.TSysAppUser; +import com.ruoyi.system.model.TSysInspection; +import com.ruoyi.system.model.TSysOtherConfig; +import com.ruoyi.system.model.TSysPayRecord; +import com.ruoyi.system.service.TSysAppUserService; +import com.ruoyi.system.service.TSysInspectionService; +import com.ruoyi.system.service.TSysOtherConfigService; +import com.ruoyi.system.service.TSysPayRecordService; +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.model.WxPaymentRefundModel; +import com.ruoyi.system.wxPay.utils.WxTimeUtils; +import com.ruoyi.system.wxPay.utils.WxV3Pay; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.Map; +import java.util.Objects; + +/** + * 微信相关接口 + */ +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/wx/") +@Api(tags = {"微信支付相关接口"}) +public class WxPayController { + @Autowired + private WxV3Pay wxV3Pay; + @Autowired + private TokenService tokenService; + @Autowired + private TSysAppUserService sysAppUserService; + @Autowired + private TSysOtherConfigService sysOtherConfigService; + @Autowired + private TSysPayRecordService sysPayRecordService; + @Autowired + private WeixinPayProperties weixinPayProperties; + @Autowired + private TSysInspectionService sysInspectionService; + + + + /** + * 按实际修改 + */ + @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); + // 价格 + Integer totalPrice = sysOtherConfig.getAiPrice().multiply(new BigDecimal(100)).intValue(); + // 生成订单号 + 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(result); + } + + /** + * 微信v3支付-订单退款 + * + * @return + */ + @ApiOperation("订单退款") + @PostMapping(value = "refund-order") + public AjaxResult<String> refundOrder() { + Map<String, Object> result = wxV3Pay.refund(new WxPaymentRefundModel()); + log.info("退款结果:{}", result); + // 微信支付退款单号 + String refund_id = result.get("refund_id").toString(); + // 商户退款单号 + String out_refund_no = result.get("out_refund_no").toString(); + // 微信支付订单号 + String transaction_id = result.get("transaction_id").toString(); + // 商户订单号 tradeNo + String out_trade_no = result.get("out_trade_no").toString(); + // 退款成功时间 + String success_time = Objects.nonNull(result.get("success_time")) ? result.get("success_time").toString() : null; + // 退款状态 RefundEnum + String status = result.get("status").toString(); + // TODO 退款业务处理 + return AjaxResult.success(); + } + /** + * 支付回调 + */ + @PostMapping("pay/notify") + @ApiOperation("订单回调") + public void payNotify(HttpServletRequest request) throws Exception { + try { + Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() {}); + log.info("支付回调:{}", params); + // 商户订单号 + String tradeNo = params.get("out_trade_no").toString(); + // 交易状态 + String trade_state = params.get("trade_state").toString(); + // 交易状态描述 + String trade_state_desc = params.get("trade_state_desc").toString(); + // 微信支付订单号 + String transaction_id = params.get("transaction_id").toString(); + // 支付完成时间 + // 时间不对的话,可以调用 WxTimeUtils.toRfc3339Date(success_time)转换一下 + String success_time = params.get("success_time").toString(); + // 附加数据 + Integer attach = Integer.parseInt(params.get("attach").toString()); + // 查询订单 + TSysPayRecord sysPayRecord = sysPayRecordService.getOne(Wrappers.lambdaQuery(TSysPayRecord.class) + .eq(TSysPayRecord::getOrderNo, tradeNo).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); + + wxV3Pay.ack(); + } + wxV3Pay.ack(); + } catch (Exception e) { + log.error("支付回调异常:{}", e, e); + wxV3Pay.ack(false, e.getMessage()); + } + } + + /** + * 支付回调成功后 + */ + @PostMapping("pay/ack") + public void ack(){ + try { + wxV3Pay.ack(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + + + + /** + * 退款回调 + */ + @PostMapping("refund/notify") + public void refundNotify(HttpServletRequest request) throws IOException { + try { + Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() { + }); + // 商户订单号 + String out_trade_no = params.get("out_trade_no").toString(); + // 商户退款单号 + String out_refund_no = params.get("out_refund_no").toString(); + // 微信支付订单号 + String transaction_id = params.get("transaction_id").toString(); + // 微信支付退款单号 + String refund_id = params.get("refund_id").toString(); + // 退款状态 + String tradeState = params.get("refund_status").toString(); + // 退款成功时间 + // 时间不对的话,可以调用 WxTimeUtils.toRfc3339Date(success_time)转换一下 + String success_time = params.get("success_time").toString(); + if (tradeState.equals(RefundEnum.SUCCESS.name())) { + wxV3Pay.ack(); + } else { + wxV3Pay.ack(false, "不是成功的退款状态"); + } + } catch (Exception e) { + e.printStackTrace(); + wxV3Pay.ack(false, e.getMessage()); + } + } + +} -- Gitblit v1.7.1