小程序开发-服务端
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.
 
 

3.9 KiB

订单下单方法改进说明

问题分析

通过分析您的下单方法,发现了以下安全和业务逻辑问题:

原有问题:

  1. 缺乏商品验证:没有从数据库查询商品信息进行验证
  2. 价格安全风险:完全依赖前端传递的价格,存在被篡改的风险
  3. 库存未验证:没有检查商品库存是否充足
  4. 商品状态未检查:没有验证商品是否上架、是否删除等

改进方案

1. 新增商品验证逻辑

OrderBusinessService.createOrder() 方法中添加了商品验证步骤:

// 2. 验证商品信息(从数据库查询)
ShopGoods goods = validateAndGetGoods(request);

2. 实现商品信息验证方法

新增 validateAndGetGoods() 方法,包含以下验证:

  • 商品存在性验证:检查商品ID是否存在
  • 商品状态验证
    • 检查商品是否已删除 (deleted != 1)
    • 检查商品是否上架 (status == 0)
    • 检查商品是否展示 (isShow == true)
  • 库存验证:检查库存是否充足
  • 价格验证:对比数据库价格与请求价格(允许0.01元误差)

3. 价格安全保护

修改 buildShopOrder() 方法,使用数据库中的商品价格:

// 使用数据库中的商品信息覆盖价格(确保价格准确性)
if (goods.getPrice() != null && request.getTotalNum() != null) {
    BigDecimal totalPrice = goods.getPrice().multiply(new BigDecimal(request.getTotalNum()));
    shopOrder.setTotalPrice(totalPrice);
    shopOrder.setPrice(totalPrice);
}

4. 空指针保护

为所有配置相关的调用添加了空指针检查,提高代码健壮性。

主要改进点

安全性提升

  • 防止价格篡改:使用数据库价格计算订单金额
  • 商品状态验证:确保只能购买正常上架的商品
  • 库存保护:防止超卖

业务逻辑完善

  • 商品存在性检查
  • 商品状态检查(上架、展示、未删除)
  • 库存充足性检查
  • 价格一致性验证

代码质量

  • 添加详细的日志记录
  • 异常信息更加明确
  • 空指针保护
  • 单元测试覆盖

使用示例

正常下单流程

OrderCreateRequest request = new OrderCreateRequest();
request.setFormId(1);           // 商品ID
request.setTotalNum(2);         // 购买数量
request.setTotalPrice(new BigDecimal("200.00")); // 前端计算的总价
request.setTenantId(1);

// 系统会自动:
// 1. 查询商品ID=1的商品信息
// 2. 验证商品状态(上架、未删除、展示中)
// 3. 检查库存是否>=2
// 4. 验证价格是否与数据库一致
// 5. 使用数据库价格重新计算订单金额

异常处理

系统会在以下情况抛出异常:

  • 商品不存在:"商品不存在"
  • 商品已删除:"商品已删除"
  • 商品未上架:"商品未上架"
  • 库存不足:"商品库存不足,当前库存:X"
  • 价格异常:"商品价格异常,数据库价格:X,请求价格:Y"

测试验证

创建了完整的单元测试 OrderBusinessServiceTest.java,覆盖:

  • 正常下单流程
  • 商品不存在场景
  • 库存不足场景
  • 价格不匹配场景
  • 商品状态异常场景

建议

  1. 运行测试:执行单元测试确保功能正常
  2. 前端配合:前端仍需传递商品ID和数量,但价格以服务端计算为准
  3. 监控日志:关注商品验证相关的日志,及时发现异常情况
  4. 性能优化:如果商品查询频繁,可考虑添加缓存

总结

通过这次改进,您的下单方法现在:

  • 安全可靠:防止价格篡改和恶意下单
  • 业务完整:包含完整的商品验证逻辑
  • 代码健壮:有完善的异常处理和空指针保护
  • 易于维护:有清晰的日志和测试覆盖

这样的改进确保了订单系统的安全性和可靠性,符合电商系统的最佳实践。