From 98217a5cfed0ed1b499c91ea98ec96361bbd041e Mon Sep 17 00:00:00 2001 From: Wang Date: Fri, 30 Jan 2026 14:54:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=94=AF=E4=BB=98=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E7=9A=84=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=89=AB=E7=A0=81=E6=94=AF=E4=BB=98=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/seer/teach/common/utils/IpUtils.java | 32 +++++++++++++++++++ .../pay/app/client/dto/PayRefundReqDTO.java | 5 +++ .../client/wechat/AbstractWxPayClient.java | 2 +- .../service/impl/AppPayOrderServiceImpl.java | 3 ++ .../impl/AppRefundOrderServiceImpl.java | 11 +++++++ 5 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 seer-common/common-web/src/main/java/com/seer/teach/common/utils/IpUtils.java diff --git a/seer-common/common-web/src/main/java/com/seer/teach/common/utils/IpUtils.java b/seer-common/common-web/src/main/java/com/seer/teach/common/utils/IpUtils.java new file mode 100644 index 0000000..1848f96 --- /dev/null +++ b/seer-common/common-web/src/main/java/com/seer/teach/common/utils/IpUtils.java @@ -0,0 +1,32 @@ +package com.seer.teach.common.utils; + +import cn.hutool.extra.servlet.JakartaServletUtil; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +public class IpUtils { + + /** + * 获取当前请求 + * + * @return + */ + public static HttpServletRequest getRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (!(requestAttributes instanceof ServletRequestAttributes)) { + return null; + } + return ((ServletRequestAttributes) requestAttributes).getRequest(); + } + + /** + * 获取当前请求的IP + * + * @return + */ + public static String getIp() { + return JakartaServletUtil.getClientIP(getRequest()); + } +} diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/dto/PayRefundReqDTO.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/dto/PayRefundReqDTO.java index bede303..e939029 100644 --- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/dto/PayRefundReqDTO.java +++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/dto/PayRefundReqDTO.java @@ -49,4 +49,9 @@ public class PayRefundReqDTO { * 渠道编码 */ private String channelCode; + + /** + * 回调地址 + */ + private String notifyUrl; } diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/AbstractWxPayClient.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/AbstractWxPayClient.java index 247e8af..8e3953a 100644 --- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/AbstractWxPayClient.java +++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/client/wechat/AbstractWxPayClient.java @@ -150,7 +150,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient { .setAmount(new WxPayRefundV3Request.Amount().setRefund(reqDTO.getRefundPrice()) .setTotal(reqDTO.getPayPrice()).setCurrency("CNY")) .setReason(reqDTO.getReason()) - .setNotifyUrl(this.refundNotifyUrl); + .setNotifyUrl(reqDTO.getNotifyUrl()); try { WxPayRefundV3Result response = client.refundV3(request); diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/impl/AppPayOrderServiceImpl.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/impl/AppPayOrderServiceImpl.java index 14772c0..4b68ee9 100644 --- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/impl/AppPayOrderServiceImpl.java +++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/pay/service/impl/AppPayOrderServiceImpl.java @@ -1,5 +1,6 @@ package com.seer.teach.pay.app.pay.service.impl; +import cn.hutool.extra.servlet.ServletUtil; import com.alibaba.nacos.shaded.com.google.common.collect.Maps; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.seer.teach.common.constants.CommonConstant; @@ -8,6 +9,7 @@ import com.seer.teach.common.enums.pay.PayChannelEnum; import com.seer.teach.common.enums.pay.PayOrderSourceEnum; import com.seer.teach.common.enums.pay.PayStatusEnum; import com.seer.teach.common.utils.AssertUtils; +import com.seer.teach.common.utils.IpUtils; import com.seer.teach.pay.app.client.PayClient; import com.seer.teach.pay.app.client.PayClientFactory; import com.seer.teach.pay.app.client.convert.PayClientConvert; @@ -83,6 +85,7 @@ public class AppPayOrderServiceImpl implements IAppPayOrderService { } payOrderReqDTO.setNotifyUrl(getNotifyUrl(payChannel)); payOrderReqDTO.setReturnUrl(orderPayReq.getReturnUrl()); + payOrderReqDTO.setUserIp(IpUtils.getIp()); // 6,执行支付 PayOrderRespDTO response = payClient.payOrder(payOrderReqDTO); response.setChannelId(payChannel.getId()); diff --git a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/refund/service/impl/AppRefundOrderServiceImpl.java b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/refund/service/impl/AppRefundOrderServiceImpl.java index be76527..9a08933 100644 --- a/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/refund/service/impl/AppRefundOrderServiceImpl.java +++ b/seer-pay/seer-pay-service-app/src/main/java/com/seer/teach/pay/app/refund/service/impl/AppRefundOrderServiceImpl.java @@ -26,6 +26,7 @@ import com.seer.teach.pay.service.IPayOrderService; import com.seer.teach.pay.service.IRefundOrderService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -50,6 +51,10 @@ public class AppRefundOrderServiceImpl implements IAppRefundOrderService { private final OrderProcessStrategyFactory orderProcessStrategyFactory; + + @Value("${server.servlet.context-path:}") + private String contextPath; + /** * 执行退款订单 * @@ -112,6 +117,8 @@ public class AppRefundOrderServiceImpl implements IAppRefundOrderService { .payPrice(refundRequest.getTotalAmount().intValue()) .refundPrice(refundRequest.getRefundAmount().intValue()) .userId(refundRequest.getUserId()) + .channelCode(channelCode) + .notifyUrl(getRefundNotifyUrl(payChannel)) .build(); log.info("构建退款请求参数完成,请求参数:{}", payRefundReqDTO); @@ -135,6 +142,10 @@ public class AppRefundOrderServiceImpl implements IAppRefundOrderService { } } + private String getRefundNotifyUrl(PayChannelEntity payChannel) { + return payChannel.getNotifyDomain() + contextPath + "/app/callback/refund/" + payChannel.getChannelCode(); + } + /** * 查询退款状态 *