From a7c51c7f80740611e622ffb345cddb1963c833b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Sat, 30 Aug 2025 21:54:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(payment):=20=E6=B7=BB=E5=8A=A0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=94=AF=E4=BB=98=E7=8A=B6=E6=80=81=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 ShopOrderController 中添加更新订单支付状态的 API 接口- 在 ShopOrderService 中实现 getByOrderNo 和 syncPaymentStatus 方法- 在 WechatNativeStrategy 中添加创建订单和查询支付状态的日志记录 - 优化订单号生成逻辑,支持使用请求中的订单号 --- .../strategy/WechatNativeStrategy.java | 6 ++ .../shop/controller/ShopOrderController.java | 59 +++++++++++++++++++ .../shop/dto/UpdatePaymentStatusRequest.java | 32 ++++++++++ .../shop/service/OrderBusinessService.java | 13 ++-- .../shop/service/ShopOrderService.java | 21 +++++++ .../service/impl/ShopOrderServiceImpl.java | 54 +++++++++++++++++ 6 files changed, 180 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gxwebsoft/shop/dto/UpdatePaymentStatusRequest.java diff --git a/src/main/java/com/gxwebsoft/payment/strategy/WechatNativeStrategy.java b/src/main/java/com/gxwebsoft/payment/strategy/WechatNativeStrategy.java index 9403ff1..6c43eaa 100644 --- a/src/main/java/com/gxwebsoft/payment/strategy/WechatNativeStrategy.java +++ b/src/main/java/com/gxwebsoft/payment/strategy/WechatNativeStrategy.java @@ -264,6 +264,9 @@ public class WechatNativeStrategy implements PaymentStrategy { prepayRequest.setOutTradeNo(orderNo); prepayRequest.setDescription(request.getEffectiveDescription()); + log.info("创建微信支付订单 - 订单号: {}, 商户号: {}, 金额: {}分", + orderNo, paymentConfig.getMchId(), request.getAmountInCents()); + // 设置回调URL(必填字段) String notifyUrl = null; if (StringUtils.hasText(request.getNotifyUrl())) { @@ -289,6 +292,9 @@ public class WechatNativeStrategy implements PaymentStrategy { */ private PaymentResponse queryWechatPaymentStatus(String orderNo, Integer tenantId, Payment paymentConfig, Config wxPayConfig) throws PaymentException { try { + log.info("开始查询微信支付状态 - 订单号: {}, 商户号: {}, 租户ID: {}", + orderNo, paymentConfig.getMchId(), tenantId); + // 构建查询请求 QueryOrderByOutTradeNoRequest queryRequest = new QueryOrderByOutTradeNoRequest(); queryRequest.setOutTradeNo(orderNo); diff --git a/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java b/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java index 436f63e..b43425b 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java @@ -22,6 +22,7 @@ import com.gxwebsoft.shop.task.OrderAutoCancelTask; import com.gxwebsoft.shop.entity.ShopOrder; import com.gxwebsoft.shop.param.ShopOrderParam; import com.gxwebsoft.shop.dto.OrderCreateRequest; +import com.gxwebsoft.shop.dto.UpdatePaymentStatusRequest; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.core.web.BatchParam; @@ -460,6 +461,64 @@ public class ShopOrderController extends BaseController { return "fail"; } + @Operation(summary = "更新订单支付状态", description = "用户支付成功后主动同步订单状态") + @PutMapping("/payment-status") + public ApiResult updateOrderPaymentStatus(@RequestBody UpdatePaymentStatusRequest request) { + logger.info("收到更新订单支付状态请求: orderNo={}, paymentStatus={}, transactionId={}", + request.getOrderNo(), request.getPaymentStatus(), request.getTransactionId()); + + final User loginUser = getLoginUser(); + if (loginUser == null) { + return fail("请先登录"); + } + + try { + // 参数验证 + if (StrUtil.isBlank(request.getOrderNo())) { + return fail("订单号不能为空"); + } + + // 查询订单 + ShopOrder order = shopOrderService.getByOrderNo(request.getOrderNo(), loginUser.getTenantId()); + if (order == null) { + return fail("订单不存在"); + } + + // 权限验证:只能更新自己的订单 + if (!order.getUserId().equals(loginUser.getUserId())) { + return fail("无权限操作此订单"); + } + + // 如果订单已经是支付成功状态,直接返回成功 + if (order.getPayStatus()) { + logger.info("订单已经是支付成功状态,无需更新: orderNo={}", request.getOrderNo()); + return success("订单状态已是最新"); + } + + // 调用支付状态同步服务 + boolean updated = shopOrderService.syncPaymentStatus( + request.getOrderNo(), + request.getPaymentStatus(), + request.getTransactionId(), + request.getPayTime(), + loginUser.getTenantId() + ); + + if (updated) { + logger.info("订单支付状态更新成功: orderNo={}, paymentStatus={}", + request.getOrderNo(), request.getPaymentStatus()); + return success("订单状态更新成功"); + } else { + logger.warn("订单支付状态更新失败: orderNo={}", request.getOrderNo()); + return fail("订单状态更新失败"); + } + + } catch (Exception e) { + logger.error("更新订单支付状态异常: orderNo={}, error={}", request.getOrderNo(), e.getMessage(), e); + return fail("更新订单状态失败: " + e.getMessage()); + } + } + /** * 检查是否有订单取消权限 */ diff --git a/src/main/java/com/gxwebsoft/shop/dto/UpdatePaymentStatusRequest.java b/src/main/java/com/gxwebsoft/shop/dto/UpdatePaymentStatusRequest.java new file mode 100644 index 0000000..999b0a8 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/dto/UpdatePaymentStatusRequest.java @@ -0,0 +1,32 @@ +package com.gxwebsoft.shop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 更新订单支付状态请求DTO + * + * @author 科技小王子 + * @since 2025-08-30 + */ +@Data +@Schema(name = "UpdatePaymentStatusRequest", description = "更新订单支付状态请求") +public class UpdatePaymentStatusRequest { + + @Schema(description = "订单号", required = true) + @NotBlank(message = "订单号不能为空") + private String orderNo; + + @Schema(description = "支付状态:1=支付成功,0=支付失败", required = true) + @NotNull(message = "支付状态不能为空") + private Integer paymentStatus; + + @Schema(description = "微信交易号") + private String transactionId; + + @Schema(description = "支付时间,格式:yyyy-MM-dd HH:mm:ss") + private String payTime; +} diff --git a/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java b/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java index c975ffe..eb949eb 100644 --- a/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java +++ b/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java @@ -242,11 +242,14 @@ public class OrderBusinessService { log.debug("构建订单对象 - 租户ID:{},用户ID:{}", shopOrder.getTenantId(), shopOrder.getUserId()); - // 生成订单号 - shopOrder.setOrderNo(Long.toString(IdUtil.getSnowflakeNextId())); -// if (shopOrder.getOrderNo() == null) { -// shopOrder.setOrderNo(Long.toString(IdUtil.getSnowflakeNextId())); -// } + // 生成订单号(如果请求中没有提供) + if (shopOrder.getOrderNo() == null || shopOrder.getOrderNo().trim().isEmpty()) { + String generatedOrderNo = Long.toString(IdUtil.getSnowflakeNextId()); + shopOrder.setOrderNo(generatedOrderNo); + log.info("生成新订单号: {}", generatedOrderNo); + } else { + log.info("使用请求中的订单号: {}", shopOrder.getOrderNo()); + } // 设置默认备注 if (shopOrder.getComments() == null) { diff --git a/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java b/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java index 08e02ed..8644e62 100644 --- a/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java +++ b/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java @@ -55,4 +55,25 @@ public interface ShopOrderService extends IService { * @return 订单总金额 */ BigDecimal total(); + + /** + * 根据订单号查询订单 + * + * @param orderNo 订单号 + * @param tenantId 租户ID + * @return ShopOrder + */ + ShopOrder getByOrderNo(String orderNo, Integer tenantId); + + /** + * 同步支付状态 + * + * @param orderNo 订单号 + * @param paymentStatus 支付状态:1=支付成功,0=支付失败 + * @param transactionId 微信交易号 + * @param payTime 支付时间 + * @param tenantId 租户ID + * @return 是否更新成功 + */ + boolean syncPaymentStatus(String orderNo, Integer paymentStatus, String transactionId, String payTime, Integer tenantId); } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java index d569325..ba95e1f 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java @@ -245,6 +245,11 @@ public class ShopOrderServiceImpl extends ServiceImpl