Day08

23 阅读4分钟

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 支付链路必须记住的两步

完成微信支付有两个关键步骤:

  1. 商户系统调用微信“下单接口”生成 预支付交易单(prepay)
  2. 支付成功后,微信会 推送支付结果(回调)

并且这两步的安全性要求很高,需要证书、加解密/签名机制。

3.2 为什么要“内网穿透”

因为微信后台要回调你的 /notify/... 接口,但你本地 localhost 在公网不可达。解决方案是 内网穿透(cpolar)拿临时域名

3.3 支付回调你要看懂什么

讲义给了 PayNotifyController 的核心流程:

  • 读取回调 body
  • 解密数据拿到 out_trade_no(商户订单号)和 transaction_id
  • orderService.paySuccess(outTradeNo) 更新业务状态
  • 最后返回响应给微信

你今天的目标不是写出完整的加解密细节,而是:能跟着代码把“回调进来之后订单怎么变更”这条链路跑通


4. Day08 最佳学习节奏

第一轮:地址簿闭环

  • 前后端联调:个人中心 → 地址管理 → 新增/设默认/删除
  • 验收:数据库默认地址只有一个

第二轮:下单闭环

  • 用已有购物车数据下单
  • 重点打断点:submitOrder()
  • 验收:orders 1条、order_detail 多条、购物车清空

第三轮:支付闭环

  • 发起支付拿到预支付单(prepay相关返回)
  • 配好内网穿透域名,让微信能回调到你本机
  • 验收:回调日志出现 out_trade_no,订单状态被更新

5. 可能会踩的坑

  1. submitOrder 报“购物车为空”
    说明你当前登录用户的购物车确实没数据(注意 userId 是否一致)
  2. 下单成功但没有明细
    多半是“order_detail 插入没做/没带 orderId”,或事务中途异常回滚。一定要对照“orders一条 + detail多条”验收。
  3. 微信回调收不到
    99% 是域名不可达/回调地址没配对(必须用内网穿透域名)。
  4. 回调收到但订单没变更
    优先看:是否拿到了正确的 out_trade_no,以及 orderService.paySuccess(outTradeNo) 是否被执行。