Day08 用户下单
今天继续做苍穹外卖的 Day08。用户下单的接口昨天写完了,但下单之后还有一堆事:怎么支付?如果一直不支付怎么办?怎么提醒老板有新订单?
我一开始觉得这些功能离我很远,结果写起来发现:其实代码不复杂,复杂的是想清楚“为什么要这样做”。
---
一、微信支付:我只理解了“统一下单”和“回调”两个词
1. 我一直以为支付就是前端调一下微信就完了
直到我看了代码才发现:后端也要参与。
流程大概是这样:
1. 用户在小程序点“支付”
2. 后端调用微信的“统一下单”接口(用 HttpClient 发请求)
3. 微信返回一堆参数(prepay_id、timeStamp、nonceStr 等)
4. 后端把这些参数返回给小程序
5. 小程序拿着这些参数调起微信支付界面
6. 用户输入密码支付
7. 微信异步回调我后端的一个地址(/pay/notify),告诉我“钱收到了”
8. 在回调里,我把订单状态从“待支付”改成“已支付”
2. 我问了自己两个问题
Q1:为什么不能前端直接调微信?
A:因为需要后端生成自己的订单号,并且要记录支付状态。如果前端直接调,那谁告诉我支付成功了?
Q2:回调里改订单状态,那回调要是没来呢?
A:老师说还有“主动查询订单状态”的兜底方案。我先记下来,暂时不深入。
3. 我现在的理解
· 支付不是“前端的事”,是前后端 + 微信三方协同
· 回调是关键:微信叫我,我才知道钱到了
· 回调里要做签名验证(防止别人伪造),我暂时只写了修改订单状态的逻辑,验证部分先抄的
代码片段(简化):
```java
@PostMapping("/pay/notify")
public String payNotify(HttpServletRequest request) {
// 解析微信回调的参数
// 验证签名(先不管细节)
// 修改订单状态为“已支付”
return "SUCCESS";
}
```
今天的收获:支付不是魔法,就是“后端等微信打电话告诉我”。
---
二、超时订单取消:Spring Task 真香
1. 场景:用户下单但不支付
用户下了单,但一直没支付。半小时后,这笔订单应该自动取消,库存也要释放(如果有)。
我一开始的想法:写个定时任务,每分钟扫一次数据库。
然后我发现 Spring 已经帮我做好了:@Scheduled
2. 三步搞定(对我来说很神奇)
第一步:在启动类上加 @EnableScheduling
第二步:写一个方法,加上 @Scheduled(cron = "0 */1 * * * ?")
(cron 表达式我背不住,直接复制了一个“每分钟执行一次”)
第三步:方法里写 SQL:
查询 orders 表里 status = “待支付” 且 create_time < 当前时间减30分钟
把这些订单的 status 改成 “已取消”
3. 我问了一个问题:会不会重复取消?
我测试了一下:同一个订单,第一次扫描时取消了,第二次扫描还会不会再次更新?
SQL 里写了只查“待支付”的订单,所以已经取消的不会再查到,不会重复执行。
4. 我现在理解的定时任务
· 适合做批量、周期性、不要求实时的事情
· cron 表达式不用背,有在线生成器
· 注意:如果部署了多台服务器,这个任务会每台都执行一次(需要分布式锁,我先记着)
```java
@Component
public class OrderTask {
@Scheduled(cron = "0 */1 * * * ?")
public void cancelTimeoutOrder() {
// 查询超时订单,批量取消
}
}
```
今天的收获:定时任务不是黑科技,就是让代码在固定时间自动跑一遍。
---
三、来单提醒:WebSocket 让我知道了“后端也能主动找前端”
1. 场景:老板怎么知道有新订单?
以前我一直以为:前端想拿数据,必须发请求。
今天学了 WebSocket,才知道后端也能主动给前端发消息。
2. 我做了一个最简单的理解
· 老板的管理后台(电脑网页)和后端之间,建立了一条 “电话线”(WebSocket 连接)
· 用户在小程序下单成功
· 后端不等着前端来问,而是直接通过这条“电话线”发一条消息:“新订单来了”
· 前端收到消息,弹个框或者放个语音
3. 我只写了最核心的逻辑
后端推送消息的那一行代码:
```java
// 用户下单成功后
webSocketServer.sendToAllClient("新订单:" + orderId);
```
前端(Vue)监听消息,收到后就 alert 或者播放音频。
4. 我现在的认知
· WebSocket 适合实时性要求高的场景(来单提醒、聊天、游戏)
· 如果只是查一次数据,用 Ajax 就够了
· WebSocket 的连接需要管理(断开重连等),我暂时只用了最简单的
今天的收获:后端不是只能“被动回答”,也能“主动打招呼”。
---
如果你有更好的理解,欢迎指正,谢谢 🙏
