小程序开发-服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

5.6 KiB

支付回调代码修复说明

🔍 问题描述

在支付回调处理代码中发现了一行红色的错误代码:

shopOrderGoodsService.addSaleCount(order.getOrderGoods());

问题原因

  1. 方法不存在ShopOrderGoodsService中没有addSaleCount方法
  2. 参数类型错误order.getOrderGoods()返回的可能是订单商品列表,不是单个商品
  3. 重复处理:销量累加逻辑已经在ShopOrderServiceImpl.updateByOutTradeNo中处理了

修复方案

删除多余代码

修复前

shopOrderService.updateByOutTradeNo(order);
// 6. TODO 累加商品销售数量
shopOrderGoodsService.addSaleCount(order.getOrderGoods());
return "SUCCESS";

修复后

// 更新订单状态并处理支付成功后的业务逻辑(包括累加商品销量)
shopOrderService.updateByOutTradeNo(order);
return "SUCCESS";

🔄 正确的销量累加流程

销量累加已经在ShopOrderServiceImpl中正确实现:

支付回调成功
    ↓
shopOrderService.updateByOutTradeNo(order)
    ↓
handlePaymentSuccess(order)
    ↓
updateGoodsSales(order)
    ↓
获取订单商品列表:shopOrderGoodsService.list(orderId)
    ↓
遍历每个商品:updateSingleGoodsSales(orderGoods)
    ↓
累加销量:shopGoodsService.addSaleCount(goodsId, saleCount)
    ↓
数据库更新:@InterceptorIgnore 忽略租户隔离

📋 核心实现代码

1. ShopOrderServiceImpl.updateByOutTradeNo

@Override
public void updateByOutTradeNo(ShopOrder order) {
    baseMapper.updateByOutTradeNo(order);
    
    // 处理支付成功后的业务逻辑
    handlePaymentSuccess(order);
    
    if (order.getTenantId().equals(10550)) {
        shopOrderUpdate10550Service.update(order);
    }
}

2. handlePaymentSuccess

private void handlePaymentSuccess(ShopOrder order) {
    try {
        // 1. 使用优惠券
        if (order.getCouponId() != null && order.getCouponId() > 0) {
            markCouponAsUsed(order);
        }

        // 2. 累计商品销量
        updateGoodsSales(order);

        log.info("支付成功后业务逻辑处理完成 - 订单号:{}", order.getOrderNo());
    } catch (Exception e) {
        log.error("处理支付成功后业务逻辑失败 - 订单号:{}", order.getOrderNo(), e);
    }
}

3. updateGoodsSales

private void updateGoodsSales(ShopOrder order) {
    try {
        // 获取订单商品列表
        List<ShopOrderGoods> orderGoodsList = shopOrderGoodsService.list(
            new LambdaQueryWrapper<ShopOrderGoods>()
                .eq(ShopOrderGoods::getOrderId, order.getOrderId())
        );

        if (orderGoodsList == null || orderGoodsList.isEmpty()) {
            log.warn("订单商品列表为空,无法累计销量 - 订单号:{}", order.getOrderNo());
            return;
        }

        // 累计每个商品的销量
        for (ShopOrderGoods orderGoods : orderGoodsList) {
            updateSingleGoodsSales(orderGoods);
        }

        log.info("商品销量累计完成 - 订单号:{},商品数量:{}", order.getOrderNo(), orderGoodsList.size());
    } catch (Exception e) {
        log.error("累计商品销量失败 - 订单号:{}", order.getOrderNo(), e);
    }
}

4. updateSingleGoodsSales

private void updateSingleGoodsSales(ShopOrderGoods orderGoods) {
    try {
        if (orderGoods.getGoodsId() == null || orderGoods.getTotalNum() == null || orderGoods.getTotalNum() <= 0) {
            log.warn("商品销量累计参数无效 - 商品ID:{},购买数量:{}", 
                orderGoods.getGoodsId(), orderGoods.getTotalNum());
            return;
        }

        // 使用新的addSaleCount方法,忽略租户隔离
        boolean updated = shopGoodsService.addSaleCount(orderGoods.getGoodsId(), orderGoods.getTotalNum());
        
        if (updated) {
            log.info("商品销量累计成功 - 商品ID:{},商品名称:{},购买数量:{}",
                orderGoods.getGoodsId(), orderGoods.getGoodsName(), orderGoods.getTotalNum());
        } else {
            log.warn("商品销量累计失败 - 商品ID:{},商品名称:{},购买数量:{}",
                orderGoods.getGoodsId(), orderGoods.getGoodsName(), orderGoods.getTotalNum());
        }
    } catch (Exception e) {
        log.error("累计单个商品销量异常 - 商品ID:{},商品名称:{},购买数量:{}",
            orderGoods.getGoodsId(), orderGoods.getGoodsName(), orderGoods.getTotalNum(), e);
    }
}

修复验证

1. 编译检查

  • 删除了错误的代码行
  • 不再有红色错误提示
  • 代码可以正常编译

2. 功能验证

  • 支付回调正常处理
  • 订单状态正确更新
  • 商品销量正确累加
  • 忽略租户隔离,确保更新成功

3. 日志验证

支付成功后会看到以下日志:

支付成功后业务逻辑处理完成 - 订单号:xxx
商品销量累计完成 - 订单号:xxx,商品数量:2
商品销量累计成功 - 商品ID:123,商品名称:测试商品,购买数量:1
商品销量累加成功 - 商品ID: 123, 累加数量: 1, 影响行数: 1

🎯 总结

  • 删除了错误代码shopOrderGoodsService.addSaleCount(order.getOrderGoods())
  • 保留了正确实现:通过shopOrderService.updateByOutTradeNo(order)自动处理
  • 功能完整:销量累加逻辑已经完整实现并集成到支付流程中
  • 租户隔离:使用@InterceptorIgnore确保跨租户更新成功

现在支付回调代码没有错误,销量累加功能正常工作!