0. Day08 学完你要交付的结果
最终要跑通一条完整链路:
选择收货地址 → 购物车去结算 → 提交订单(生成 orders + order_detail)→ 发起微信支付(预支付单)→ 支付回调更新订单状态
同时,要能讲清楚两类“项目级能力”:
- 一对多落库:订单表 + 订单明细表(以及购物车清空)
- 第三方支付对接:商户侧下单(预支付单)+ 支付结果回调(notify)
1. 地址簿 AddressBook(导入代码)
1.1 需求与关键规则
地址簿就是用户维护自己的收货地址:同一用户可有多个地址,但只能有一个默认地址。
要实现的功能(讲义明确列出):
- 查询地址列表、新增、修改、删除
- 设置默认地址、查询默认地址
1.2 接口全景(7个接口)
讲义给出的粗粒度接口共 7 个:新增地址、查当前用户所有地址、查默认地址、按id改、按id删、按id查、设置默认地址。
学习建议:不用一开始就抠每个字段,先把 “默认地址如何保证唯一” 这件事看懂,后面下单会依赖它。
1.3 你必须理解的“默认地址唯一”实现逻辑
典型做法是:
- 设置默认地址时:先把该用户所有地址置为非默认,再把目标id置为默认(或同等效果)
- 查询默认地址:按
userId + isDefault=1查一条(查不到就提示)
2. 用户下单
2.1 下单在业务上做了什么
用户从购物车点击“去结算/去支付”,会生成订单数据。
订单对应两张表:
orders:订单基本信息(订单号、状态、金额、支付方式、下单用户、收货地址等)order_detail:订单明细(一对多,一个订单多条明细)
2.2 “下单核心流程”(面试常问)
在 OrderServiceImpl.submitOrder 里,讲义给了非常清晰的骨架,照着理解即可:
Step 1:异常校验(先挡住错误输入)
- 收货地址不存在:抛异常
- 当前用户购物车为空:抛异常
Step 2:构造订单主表 orders
把提交DTO拷贝到 Orders,再补齐:
- phone/address/consignee 来自地址簿
- number 用时间戳生成
- userId 来自当前登录用户
- status = 待支付、payStatus = 未支付、orderTime = now
Step 3:插入 orders(拿到订单id)
orderMapper.insert(order) 写入一条订单记录。
后面你在写 order_detail 时,会用到这个订单id,把购物车每一项变成一条明细。
Step 4:插入 order_detail(购物车 → 明细)
做法通常是:遍历购物车列表,把每条 cart item 转成 OrderDetail,带上 orderId,批量插入。
Step 5:清空购物车
下单成功后清空当前用户购物车,避免重复下单。
关键点:必须事务
整个 submitOrder 用 @Transactional 包起来,保证“订单主表、订单明细、购物车清空”要么全成功要么全回滚。
3. 订单支付(微信支付:预支付单 + 回调)
重点是理解流程 + 会看官方文档并对接。
本项目选择 小程序支付。
3.1 支付链路必须记住的两步
完成微信支付有两个关键步骤:
- 商户系统调用微信“下单接口”生成 预支付交易单(prepay)
- 支付成功后,微信会 推送支付结果(回调)
并且这两步的安全性要求很高,需要证书、加解密/签名机制。
3.2 为什么要“内网穿透”
因为微信后台要回调你的 /notify/... 接口,但你本地 localhost 在公网不可达。解决方案是 内网穿透(cpolar)拿临时域名。
3.3 支付回调你要看懂什么
讲义给了 PayNotifyController 的核心流程:
- 读取回调 body
- 解密数据拿到
out_trade_no(商户订单号)和transaction_id - 调
orderService.paySuccess(outTradeNo)更新业务状态 - 最后返回响应给微信
你今天的目标不是写出完整的加解密细节,而是:能跟着代码把“回调进来之后订单怎么变更”这条链路跑通。
4. Day08 最佳学习节奏
第一轮:地址簿闭环
- 前后端联调:个人中心 → 地址管理 → 新增/设默认/删除
- 验收:数据库默认地址只有一个
第二轮:下单闭环
- 用已有购物车数据下单
- 重点打断点:
submitOrder() - 验收:
orders1条、order_detail多条、购物车清空
第三轮:支付闭环
- 发起支付拿到预支付单(prepay相关返回)
- 配好内网穿透域名,让微信能回调到你本机
- 验收:回调日志出现 out_trade_no,订单状态被更新
5. 可能会踩的坑
- submitOrder 报“购物车为空”
说明你当前登录用户的购物车确实没数据(注意 userId 是否一致) - 下单成功但没有明细
多半是“order_detail 插入没做/没带 orderId”,或事务中途异常回滚。一定要对照“orders一条 + detail多条”验收。 - 微信回调收不到
99% 是域名不可达/回调地址没配对(必须用内网穿透域名)。 - 回调收到但订单没变更
优先看:是否拿到了正确的out_trade_no,以及orderService.paySuccess(outTradeNo)是否被执行。