From 1af77abfa06a1a0d537bb120ae0c362aae9d3b83 Mon Sep 17 00:00:00 2001
From: huliguo <2023611923@qq.com>
Date: 星期三, 30 七月 2025 10:14:40 +0800
Subject: [PATCH] bug修改
---
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/NotifyController.java | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 117 insertions(+), 2 deletions(-)
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/NotifyController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/NotifyController.java
index c477d06..6574ab5 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/NotifyController.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/NotifyController.java
@@ -1,5 +1,6 @@
package com.ruoyi.order.controller.miniapp;
+import com.alibaba.fastjson.JSONObject;
import com.github.binarywang.wxpay.bean.ecommerce.*;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Response;
import com.github.binarywang.wxpay.bean.profitsharingV3.ProfitSharingNotifyData;
@@ -11,11 +12,22 @@
import com.github.binarywang.wxpay.v3.util.AesUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.order.domain.dto.WechatPaymentRefundDto;
+import com.ruoyi.order.domain.dto.WeixinPaymentNotifyDto;
+import com.ruoyi.order.domain.pojo.account.OrderRefund;
import com.ruoyi.order.domain.vo.ProfitSharingNotifyNewResult;
+import com.ruoyi.order.domain.vo.WeixinPaymentNotifyVo;
+import com.ruoyi.order.domain.vo.WeixinPaymentRefundVo;
+import com.ruoyi.order.enums.RefundStatusEnum;
import com.ruoyi.order.enums.WxPayNotifyEventTypeEnum;
+import com.ruoyi.order.enums.dict.IDict;
import com.ruoyi.order.service.account.BackMessageService;
+import com.ruoyi.order.service.account.OrderRefundService;
import com.ruoyi.order.service.order.OrderService;
+import com.ruoyi.order.util.HuiFuTianXiaUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.log4j.Log4j2;
@@ -26,12 +38,15 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
+import java.io.PrintWriter;
+import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Map;
import java.util.Objects;
+import java.util.concurrent.TimeUnit;
/**
* @program: ruoyi
@@ -60,6 +75,12 @@
@Resource
private BackMessageService backMessageService;
+ @Resource
+ private OrderRefundService orderRefundService;
+
+ @Resource
+ private RedisService redisService;
+
@PostMapping(value = "/payNotify")
@ApiOperation(value = "微信支付/退款通知")
public String payNotify(@RequestBody String notifyData, HttpServletRequest request, HttpServletResponse response) throws WxPayException {
@@ -81,20 +102,21 @@
PartnerTransactionsResult result = notifyResult.getResult();
// 支付通知回调
if ("SUCCESS".equals(result.getTradeState())) {
- orderService.payBack(result);
+ orderService.payBack(result, BigDecimal.ONE);
}
resultMessage = GSON.toJson(notifyResult);
} else if (WxPayNotifyEventTypeEnum.REFUND_SUCCESS.getCode().equals(eventType)
|| WxPayNotifyEventTypeEnum.REFUND_ABNORMAL.getCode().equals(eventType)
|| WxPayNotifyEventTypeEnum.REFUND_CLOSED.getCode().equals(eventType)) {
- RefundNotifyResult result = wxService.getEcommerceService().parseRefundNotifyResult(notifyData, signatureHeader);
+ RefundNotifyResult result = this.parseRefundNotifyResult(notifyData, signatureHeader);
orderService.orderRefundBack(result);
resultType = 2;
resultMessage = GSON.toJson(result);
}
}catch (Exception e){
+ e.printStackTrace();
log.info("微信支付/退款通知异常: {}", e.getMessage());
}
// 保存支付/退款回调信息
@@ -164,6 +186,24 @@
}
}
+ private RefundNotifyResult parseRefundNotifyResult(String notifyData, SignatureHeader header) throws WxPayException {
+
+ NotifyResponse response = GSON.fromJson(notifyData, NotifyResponse.class);
+ NotifyResponse.Resource resource = response.getResource();
+ String cipherText = resource.getCiphertext();
+ String associatedData = resource.getAssociatedData();
+ String nonce = resource.getNonce();
+ String apiV3Key = this.wxService.getConfig().getApiV3Key();
+ try {
+ String result = AesUtils.decryptToString(associatedData, nonce, cipherText, apiV3Key);
+ RefundNotifyResult notifyResult = GSON.fromJson(result, RefundNotifyResult.class);
+ notifyResult.setRawData(response);
+ return notifyResult;
+ } catch (GeneralSecurityException | IOException e) {
+ throw new WxPayException("解析报文异常!", e);
+ }
+ }
+
private boolean verifyNotifySign(SignatureHeader header, String data) throws WxPayException {
String beforeSign = String.format("%s\n%s\n%s\n",
header.getTimeStamp(),
@@ -192,4 +232,79 @@
return signatureHeader;
}
+
+
+
+ @RequestMapping(value = "/wechatPaymentCallback", method = RequestMethod.POST)
+ @ApiOperation(value = "微信支付通知(汇付天下)")
+ public void wechatPaymentCallback(WeixinPaymentNotifyDto dto, HttpServletResponse response){
+ R<WeixinPaymentNotifyVo> r = HuiFuTianXiaUtil.weixinPaymentNotify(dto);
+ if(r.getCode() == 200){
+ WeixinPaymentNotifyVo data = r.getData();
+ String transStat = data.getTransStat();
+ if("S".equals(transStat)){
+ PartnerTransactionsResult transaction = new PartnerTransactionsResult();
+ transaction.setOutTradeNo(data.getReqSeqId());
+
+ //防止回调频繁导致时间处理异常
+ Object cacheObject = redisService.getCacheObject(data.getReqSeqId());
+ if(null == cacheObject){
+ redisService.setCacheObject(data.getReqSeqId(), "", 10L, TimeUnit.SECONDS);
+ }else{
+ return;
+ }
+ //开始处理业务数据
+ orderService.payBack(transaction, data.getFeeFlag() == 1 ? BigDecimal.ZERO : new BigDecimal(data.getFeeAmount()));
+
+ response.setStatus(200);
+ PrintWriter out = null;
+ try {
+ out = response.getWriter();
+ out.print("RECV_ORD_ID_" + data.getReqSeqId());
+ out.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }finally {
+ out.close();
+ }
+
+ }
+ }
+ }
+
+
+
+ @RequestMapping(value = "/wechatPaymentRefundCallback", method = RequestMethod.POST)
+ @ApiOperation(value = "微信支付退款通知(汇付天下)")
+ public void wechatPaymentRefundCallback(WechatPaymentRefundDto dto, HttpServletResponse response){
+ R<WeixinPaymentRefundVo> r = HuiFuTianXiaUtil.weixinPaymentRefundNotify(dto);
+ if(r.getCode() == 200){
+ WeixinPaymentRefundVo data = r.getData();
+ String transStat = data.getTransStat();
+ if("S".equals(transStat)){
+ //开始处理业务数据
+ String reqSeqId = data.getReqSeqId();
+ OrderRefund orderRefund = orderRefundService.getById(reqSeqId);
+ if(null != orderRefund && orderRefund.getRefundStatus() != 2){
+ orderRefund.setWxRefundId(data.getPartyOrderId());
+ orderRefund.setBackTime(data.getTransDate() + data.getTransTime());
+ orderRefund.setRefundStatus(2);
+ orderRefundService.saveOrUpdate(orderRefund);
+ }
+
+ response.setStatus(200);
+ PrintWriter out = null;
+ try {
+ out = response.getWriter();
+ out.print("RECV_ORD_ID_" + data.getReqSeqId());
+ out.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }finally {
+ out.close();
+ }
+
+ }
+ }
+ }
}
--
Gitblit v1.7.1