当前位置: 首页 > news >正文

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 的连接需要管理(断开重连等),我暂时只用了最简单的

今天的收获:后端不是只能“被动回答”,也能“主动打招呼”。

---

如果你有更好的理解,欢迎指正,谢谢 🙏

http://www.jsqmd.com/news/825905/

相关文章:

  • 基于LLM视觉的智能家居自动化:ha-llmvision集成部署与实战指南
  • YoungsDB:为什么它能同时扛住持续写入与高频分析?
  • 别再傻傻分不清了!用Python和NumPy实战理解概率论中的‘相关’与‘独立’
  • AMD NPU加速GPT-2微调:边缘AI训练实战解析
  • 搞定了-----
  • 2026年质量好的江苏球型伸缩接头厂家综合对比分析 - 品牌宣传支持者
  • 3分钟搞定!WarcraftHelper终极指南:让魔兽争霸3在现代电脑上完美运行
  • CRUD 入门:数据的增、查、改、删
  • 湖南防火门技术选型指南:国曼消防工艺解析与新国标验收要点
  • Ai小程序入门06-数据绑定(小白入门:从静态到动态,让页面数据显示得活灵活现)
  • AI教材生成秘籍:利用AI写教材,轻松实现低查重与高质量内容!
  • LeRobot SO-ARM101机械臂教程:三、遥感操作
  • 基于CRICKIT与CircuitPython的蛇形机器人避障项目实践
  • 数据不出本机、全程离线运行,这个AI工具让我告别手动办公
  • AI进阶,韧性必修:从传统灾备到数据韧性“变形记”
  • 15种logo检测数据集9626张VOC+YOLO格式
  • 从图论到解析分子结构的应用:Floyd-Warshall 算法
  • 强化学习如何优化大语言模型:TextRL实战指南
  • OpenCV LineMod算法实战:从模板创建到目标检测的完整调用指南
  • LLM提示词编排引擎:构建可维护AI工作流的工程化实践
  • Mali GPU着色器优化与性能分析实战
  • 抖音直播数据抓取实战:6步构建实时WebSocket采集系统
  • 别再手动改标注了!一个Python脚本搞定Labelme、LabelImg、YOLO格式互转(附完整代码)
  • 1688代运营/一个月询盘暴涨325%!1688代运营是怎么做到的?
  • 构建个人代码库:从零到一打造高效开发工具箱
  • C++学习笔记10:auto关键字
  • 为什么92%的团队GitOps落地失败?DeepSeek内部未公开的4层权限治理模型首次披露
  • AI编程助手规则配置指南:提升Cursor代码生成质量与规范一致性
  • Simics在网络转型与SDN迁移中的核心价值与应用
  • Ghost-Cursor:模拟人类鼠标轨迹,提升Web自动化隐蔽性