From a8b24cf4e345a8ca58605ce4f4112a39d91a3b7b99438bfb79994e5de28f8289 Mon Sep 17 00:00:00 2001 From: yanglei Date: Tue, 20 Jan 2026 13:48:58 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=80=E6=AC=BE=E5=A4=B1=E8=B4=A5=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E8=AF=A6=E7=BB=86=E5=8E=9F=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EbikeRefundReviewController.java | 3 +- .../model/dto/EbikeRefundReviewDto.java | 2 + .../controller/EbikeWxPaymentController.java | 4 +- .../payment/service/EbikeWxPayService.java | 3 +- .../service/impl/EbikeWxPayServiceImpl.java | 50 ++++++++++++++----- 5 files changed, 45 insertions(+), 17 deletions(-) diff --git a/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeRefundReviewController.java b/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeRefundReviewController.java index 0b926fb..cc44397 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeRefundReviewController.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeRefundReviewController.java @@ -10,6 +10,7 @@ import com.ebike.feign.model.vo.FeignEbikeRefundOrderDetailVo; import com.ebike.feign.model.vo.FeignEbikeRefundReviewVo; import com.mybatisflex.core.paginate.Page; import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -38,7 +39,7 @@ public class EbikeRefundReviewController { * @return 审核成功返回true,否则返回false */ @PostMapping("/reviewRefund") - public JsonResult reviewRefund(@RequestBody EbikeRefundReviewDto processDto) { + public JsonResult reviewRefund(@RequestBody @Validated EbikeRefundReviewDto processDto) { boolean result = refundReviewService.refundReview(processDto); return JsonResult.success(result); } diff --git a/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeRefundReviewDto.java b/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeRefundReviewDto.java index c33efa8..8454e75 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeRefundReviewDto.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeRefundReviewDto.java @@ -21,11 +21,13 @@ public class EbikeRefundReviewDto { /** * 主键id */ + @NotNull(message = "主键id不能为空") private Long reviewId; /** * 审核操作, 1-通过 3-驳回 */ + @NotNull(message = "审核操作不能为空") private Integer operate; /** diff --git a/ebike-payment/src/main/java/com/cdzy/payment/controller/EbikeWxPaymentController.java b/ebike-payment/src/main/java/com/cdzy/payment/controller/EbikeWxPaymentController.java index d111861..a0fdb6f 100644 --- a/ebike-payment/src/main/java/com/cdzy/payment/controller/EbikeWxPaymentController.java +++ b/ebike-payment/src/main/java/com/cdzy/payment/controller/EbikeWxPaymentController.java @@ -87,8 +87,8 @@ public class EbikeWxPaymentController { */ @PostMapping("/api/refund") public JsonResult refund(@RequestBody FeignEbikeRefundDto refundDto) { - EbikeWxHandleNotifyVo notifyVo = wxPayService.refund(refundDto); - return JsonResult.success(notifyVo); + wxPayService.refund(refundDto); + return JsonResult.success(); } /** 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 98011d7..add1ca2 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 @@ -72,9 +72,8 @@ public interface EbikeWxPayService { * 调用微信退款接口 * * @param refundDto 退款请求 - * @return 退款信息id */ - EbikeWxHandleNotifyVo refund(FeignEbikeRefundDto refundDto); + void refund(FeignEbikeRefundDto refundDto); /** 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 139b39a..bf5ca4e 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 @@ -406,9 +406,7 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService { } @Override - public EbikeWxHandleNotifyVo refund(FeignEbikeRefundDto refundDto) { - EbikeWxHandleNotifyVo notifyVo = new EbikeWxHandleNotifyVo(); - notifyVo.setSuccess(false); + public void refund(FeignEbikeRefundDto refundDto) { // 检查退款记录是否存在 EbikeRefund ebikeRefund = ebikeRefundService.getById(refundDto.getRefundId()); if (Objects.isNull(ebikeRefund)) { @@ -447,8 +445,7 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService { Refund result = wxRefundService.create(request); if (result == null) { log.error("调用微信退款接口返回空,订单号: {}", orderId); - notifyVo.setMessage("退款请求失败"); - return notifyVo; + throw new EbikeException("退款失败:微信服务无响应"); } orderService.refund(orderId); // 更新退款信息 @@ -462,14 +459,17 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService { ebikeRefund.setRefundTime(LocalDateTime.now()); ebikeRefund.setRefundTransactionId(result.getRefundId()); ebikeRefundService.updateById(ebikeRefund); - notifyVo.setSuccess(true); - notifyVo.setMessage("退款已提交"); - return notifyVo; + } catch (ServiceException e) { + String httpResponseBody = e.getResponseBody(); + log.error("微信退款失败 | refundId: {}, orderId: {} | HTTP状态码: {}, 响应体: {}", + refundDto.getRefundId(), orderId, e.getHttpStatusCode(), httpResponseBody, e); + // 解析微信退款回调参数 + String userMessage = parseWechatErrorMessage(httpResponseBody); + throw new EbikeException(userMessage); } catch (Exception e) { - log.error("发起退款异常,refundId: {}, orderId: {}, error: {}", - refundDto.getRefundId(), orderId, e.getMessage(), e); - notifyVo.setMessage("退款失败: " + e.getMessage()); - return notifyVo; + log.error("发起退款发生系统异常,refundId: {}, orderId: {}", + refundDto.getRefundId(), orderId, e); + throw new EbikeException("退款失败:系统内部错误,请稍后重试"); } } @@ -603,4 +603,30 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService { .setScale(0, RoundingMode.HALF_UP) .longValue(); } + + /** + * 解析微信返回的错误信息,提取用户友好提示 + */ + private String parseWechatErrorMessage(String responseBody) { + try { + JsonNode root = objectMapper.readTree(responseBody); + JsonNode codeNode = root.get("code"); + JsonNode messageNode = root.get("message"); + + String code = codeNode != null ? codeNode.asText() : ""; + String msg = messageNode != null ? messageNode.asText() : "未知错误"; + + return switch (code) { + case "NOT_ENOUGH" -> "商户账户余额不足,请联系客服处理"; + case "RESOURCE_NOT_EXISTS" -> "原支付订单不存在或已过期"; + case "ORDER_PAID" -> "订单已支付,不能重复退款"; + case "REFUND_NOT_ALLOWED" -> "该订单不支持退款"; + case "FREQ_LIMIT" -> "退款频率过高,请稍后再试"; + default -> msg; + }; + } catch (Exception ex) { + log.warn("解析微信错误信息失败: {}", ex.getMessage()); + return "微信服务返回异常,请稍后重试"; + } + } }