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
3.9 KiB
订单下单方法改进说明
问题分析
通过分析您的下单方法,发现了以下安全和业务逻辑问题:
原有问题:
- 缺乏商品验证:没有从数据库查询商品信息进行验证
- 价格安全风险:完全依赖前端传递的价格,存在被篡改的风险
- 库存未验证:没有检查商品库存是否充足
- 商品状态未检查:没有验证商品是否上架、是否删除等
改进方案
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
,覆盖:
- 正常下单流程
- 商品不存在场景
- 库存不足场景
- 价格不匹配场景
- 商品状态异常场景
建议
- 运行测试:执行单元测试确保功能正常
- 前端配合:前端仍需传递商品ID和数量,但价格以服务端计算为准
- 监控日志:关注商品验证相关的日志,及时发现异常情况
- 性能优化:如果商品查询频繁,可考虑添加缓存
总结
通过这次改进,您的下单方法现在:
- ✅ 安全可靠:防止价格篡改和恶意下单
- ✅ 业务完整:包含完整的商品验证逻辑
- ✅ 代码健壮:有完善的异常处理和空指针保护
- ✅ 易于维护:有清晰的日志和测试覆盖
这样的改进确保了订单系统的安全性和可靠性,符合电商系统的最佳实践。