diff --git a/ebike-payment/src/main/java/com/cdzy/payment/controller/EbikeWxPayNotifyController.java b/ebike-payment/src/main/java/com/cdzy/payment/controller/EbikeWxPayNotifyController.java index 8e07137..3be808f 100644 --- a/ebike-payment/src/main/java/com/cdzy/payment/controller/EbikeWxPayNotifyController.java +++ b/ebike-payment/src/main/java/com/cdzy/payment/controller/EbikeWxPayNotifyController.java @@ -6,14 +6,14 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; /** * 微信支付通知回调接口 diff --git a/ebike-payment/src/main/java/com/cdzy/payment/service/EbikeRefundService.java b/ebike-payment/src/main/java/com/cdzy/payment/service/EbikeRefundService.java index 5b869f5..d0babad 100644 --- a/ebike-payment/src/main/java/com/cdzy/payment/service/EbikeRefundService.java +++ b/ebike-payment/src/main/java/com/cdzy/payment/service/EbikeRefundService.java @@ -3,6 +3,7 @@ package com.cdzy.payment.service; import com.cdzy.payment.model.entity.EbikeRefund; import com.mybatisflex.core.service.IService; import com.wechat.pay.java.service.refund.model.Refund; +import com.wechat.pay.java.service.refund.model.RefundNotification; import java.util.List; @@ -31,4 +32,12 @@ public interface EbikeRefundService extends IService { */ Boolean updateRefundStatus(Refund refund); + + /** + * 更新退款回调通知 + * + * @param refund 退款回调通知 + * @return 更新成功返回true,否则返回false + */ + Boolean updateRefundCallbackStatus(RefundNotification refund); } diff --git a/ebike-payment/src/main/java/com/cdzy/payment/service/EbikeWxPayService.java b/ebike-payment/src/main/java/com/cdzy/payment/service/EbikeWxPayService.java index 705170d..98011d7 100644 --- a/ebike-payment/src/main/java/com/cdzy/payment/service/EbikeWxPayService.java +++ b/ebike-payment/src/main/java/com/cdzy/payment/service/EbikeWxPayService.java @@ -5,8 +5,8 @@ import com.ebike.feign.model.dto.FeignEbikeRefundDto; import com.fasterxml.jackson.databind.JsonNode; import com.wechat.pay.java.service.payments.model.Transaction; import com.wechat.pay.java.service.refund.model.Refund; +import jakarta.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequest; /** * 微信支付服务类(JSAPI支付),小程序 diff --git a/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeRefundServiceImpl.java b/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeRefundServiceImpl.java index 45d515f..b899d80 100644 --- a/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeRefundServiceImpl.java +++ b/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeRefundServiceImpl.java @@ -9,6 +9,7 @@ import com.cdzy.payment.utils.StringUtils; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import com.wechat.pay.java.service.refund.model.Refund; +import com.wechat.pay.java.service.refund.model.RefundNotification; import com.wechat.pay.java.service.refund.model.Status; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -64,6 +65,9 @@ public class EbikeRefundServiceImpl extends ServiceImpl ebikeOrderService.refund(orderId); + case SUCCESS -> ebikeOrderService.doneRefund(orderId); + case ABNORMAL -> ebikeOrderService.failRefund(orderId); + } + return updateById(ebikeRefund); + } - private BigDecimal calculateRefundAmount(Refund refund) { - if (refund == null || refund.getAmount() == null - || refund.getAmount().getRefund() == null) { - log.warn("Refund amount information is incomplete"); + private BigDecimal calculateRefundAmountInternal(Long refundInFen, String outRefundNo) { + if (refundInFen == null) { + log.warn("Refund amount is null for refund: {}", outRefundNo); return BigDecimal.ZERO; } + try { - BigDecimal refundInFen = BigDecimal.valueOf(refund.getAmount().getRefund()); - return refundInFen.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + BigDecimal amount = BigDecimal.valueOf(refundInFen); + return amount.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); } catch (Exception e) { - log.error("Error calculating refund amount for refund: {}", refund.getOutRefundNo(), e); + log.error("Error calculating refund amount for refund: {}", outRefundNo, e); return BigDecimal.ZERO; } } + /** + * 退款回调金额计算 + */ + private BigDecimal calculateRefundCallbackAmount(RefundNotification refund) { + if (refund == null || refund.getAmount() == null) { + log.warn("RefundNotification amount information is incomplete"); + return BigDecimal.ZERO; + } + + Long refundInFen = refund.getAmount().getRefund(); + return calculateRefundAmountInternal(refundInFen, refund.getOutRefundNo()); + } + + /** + * 退款金额计算 + */ + private BigDecimal calculateRefundAmount(Refund refund) { + if (refund == null || refund.getAmount() == null) { + log.warn("Refund amount information is incomplete"); + return BigDecimal.ZERO; + } + + Long refundInFen = refund.getAmount().getRefund(); + return calculateRefundAmountInternal(refundInFen, refund.getOutRefundNo()); + } + + /** + * 查询订单号 + * + * @param refundOrderId 根据退款回调退款订单号查询订单号 + */ + private Long queryOrderId(Long refundOrderId) { + if (refundOrderId == null) { + log.warn("退款订单ID为空,无法查询主订单ID"); + return null; + } + //查询退款中且状态为2的订单 + QueryWrapper queryWrapper = QueryWrapper.create() + .where(EBIKE_REFUND.REFUND_ORDER_ID.eq(refundOrderId)) + .where(EBIKE_REFUND.REFUND_STATUS.eq(RefundStatus.PROCESSED)); + EbikeRefund ebikeRefund = this.mapper.selectOneByQuery(queryWrapper); + + if (ebikeRefund == null) { + log.warn("未找到状态为'退款中'的退款记录,退款单ID: {}", refundOrderId); + return null; + } + return ebikeRefund.getOrderId(); + } } diff --git a/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeWxPayServiceImpl.java b/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeWxPayServiceImpl.java index 69d072a..49e8db9 100644 --- a/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeWxPayServiceImpl.java +++ b/ebike-payment/src/main/java/com/cdzy/payment/service/impl/EbikeWxPayServiceImpl.java @@ -33,10 +33,10 @@ import com.wechat.pay.java.service.payments.model.Transaction; import com.wechat.pay.java.service.refund.RefundService; import com.wechat.pay.java.service.refund.model.*; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Duration; @@ -543,9 +543,9 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService { // 验签并解析通知 NotificationParser parser = new NotificationParser((NotificationConfig) certificateConfig); // 解析解密后的通知 - Refund refund = parser.parse(requestParam, Refund.class); + RefundNotification refund = parser.parse(requestParam, RefundNotification.class); // 更新状态 - ebikeRefundService.updateRefundStatus(refund); + ebikeRefundService.updateRefundCallbackStatus(refund); // 处理成功 result.setSuccess(true); result.setMessage("success"); diff --git a/ebike-payment/src/main/java/com/cdzy/payment/utils/HttpServletUtils.java b/ebike-payment/src/main/java/com/cdzy/payment/utils/HttpServletUtils.java index 1a4f7b2..d1e0a3e 100644 --- a/ebike-payment/src/main/java/com/cdzy/payment/utils/HttpServletUtils.java +++ b/ebike-payment/src/main/java/com/cdzy/payment/utils/HttpServletUtils.java @@ -1,7 +1,8 @@ package com.cdzy.payment.utils; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;