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