青橙16.2 微信支付模块、服务端推送WebSocket、RabbitMQ Web STOMP 插件、STOMP协议、超时未支付订单处理(用延时队列=(TTL+死信交换机))、消息可靠性保障、幂等性

本文介绍了青橙支付系统如何利用WebSocket进行服务端推送,通过RabbitMQ结合Web STOMP插件实现延迟队列处理超时未支付订单。同时讨论了消息的可靠性保障和幂等性设计,确保100%的消息发送成功和避免重复操作。

上一篇讲了微信支付快速入门,现在讲后端与青橙的对接

前端页面向后端传递订单号,后端根据订单号查询订单,检查是否为当前用户的未支付 订单,如果是则根据订单号和金额生成支付url返给前端,前端得到支付url生成支付二维 码。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(4)qingcheng_service_pay新增服务类在这里插入图片描述
(5)qingcheng_web_portal新增PayController在这里插入图片描述
前端代码就不放了在这里插入图片描述
3. 青橙-支付回调逻辑处理在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试后,在控制台看到输出的消息在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)OrderServiceImpl新增方法实现在这里插入图片描述
在这里插入图片描述

青橙-推送支付通知

在这里插入图片描述

服务端推送方案

在这里插入图片描述

WebSocket 双向通信

在这里插入图片描述

RabbitMQ Web STOMP 插件

在这里插入图片描述

STOMP协议

在这里插入图片描述

青橙-超时未支付订单处理

在这里插入图片描述
如何获取超过60分钟的订单?我们目前有两种实现方案?
在这里插入图片描述

2.延时队列实现:在这里插入图片描述

延时队列:延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。

延时队列可以用TTL+死信交换机(或者说死信队列)实现

死信交换机和普通的交换机、死信队列和普通队列都没有区别

当消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队 列(这就是死信队列了)
在这里插入图片描述
其实在MQ里,死信交换机和死信队列是一样的意思,但为了好区分就把正常队列成为死信后发生给死信交换机,死信交换机再发给另一个队列(这个队列通常就叫做死信队列)

在这里插入图片描述

2.1消息的TTL(Time To Live)

在这里插入图片描述这是5秒中没被消费,该消息就会被丢失
演示:
在这里插入图片描述按添加
在这里插入图片描述
点进去:
在这里插入图片描述
5秒内是有数据的:
在这里插入图片描述
5秒后就消失了,成为了死信
在这里插入图片描述

2.2死信交换器 Dead Letter Exchanges

在这里插入图片描述

我们现在可以测试一下延迟队列:在这里插入图片描述

(1)创建死信交换器 exchange.ordertimeout (fanout)

在这里插入图片描述

(2)创建队列queue.ordertimeout (死信队列)

在这里插入图片描述

(3)建立死信交换器 exchange.ordertimeout 与队列queue.ordertimeout 之间的 绑定 routingkey为 exchange.ordertimeout.key (随便起,等下对应就行

点进去刚刚(1)建的交换机绑定(2):
在这里插入图片描述

(4)创建队列queue.order,Arguments添加
x-message-ttl=5000 x-dead-letter-exchange: exchange.ordertimeout

x-dead-letter-routing-key: exchange.ordertimeout.key:在这里插入图片描述
测试:向queue.order发布信息:
点进去:
在这里插入图片描述

在这里插入图片描述
一开始是这个信息在queue.order
在这里插入图片描述然后等10秒之后,该消息会被死信交换机重新路由到死信队列queue.ordertimeout了:在这里插入图片描述

这就是延迟队列了

消息可靠性保障

需求: 100%确保消息发送成功
在这里插入图片描述

消息幂等性(乐观锁)

在这里插入图片描述
在这里插入图片描述

### 青橙电商订单管理系统的概述 青橙电商是一个典型的全栈开发项目,涵盖了从前端到后端的整体实现过程[^2]。其订单管理系统作为整个电商平台的核心模块之一,主要负责处理用户的购买请求、库存更新以及物流配送等相关功能。 #### 订单管理的主要功能 订单管理通常包括以下几个方面: 1. **订单创建**:当用户完成商品选购并提交支付后,系统会自动生成一条新的订单记录。 2. **订单状态跟踪**:支持多种订单状态(如待付款、已付款、配货中、发货中、已完成等),并通过数据库字段实时更新这些状态。 3. **订单查询与筛选**:管理员可以通过特定条件(时间范围、用户ID、订单号等)快速定位目标订单。 4. **退款与售后处理**:提供针对异常情况的解决方案,比如退货申请审批流程。 以下是基于常见技术栈实现的一个简化版订单服务接口设计示例: ```java @RestController @RequestMapping("/api/order") public class OrderController { @Autowired private IOrderService orderService; /** * 创建新订单 */ @PostMapping("") public ResponseEntity<String> createOrder(@RequestBody OrderRequest request) { try { String orderId = orderService.createOrder(request); return new ResponseEntity<>("Order created successfully with ID: " + orderId, HttpStatus.CREATED); } catch (Exception e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } /** * 查询单个订单详情 */ @GetMapping("/{orderId}") public ResponseEntity<OrderResponse> getOrderDetails(@PathVariable String orderId) { Optional<OrderResponse> optionalOrder = orderService.getOrderById(orderId); if (!optionalOrder.isPresent()) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } return new ResponseEntity<>(optionalOrder.get(), HttpStatus.OK); } /** * 更新订单状态 */ @PutMapping("/{orderId}/status") public ResponseEntity<Void> updateOrderStatus(@PathVariable String orderId, @RequestParam(required = true) String status) { boolean success = orderService.updateOrderStatus(orderId, status); if (!success) { return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } return new ResponseEntity<>(HttpStatus.NO_CONTENT); } } ``` 上述代码片段展示了如何通过RESTful API来管理和操作订单数据。具体来说,`createOrder()` 方法用于接收前端传来的参数生成一个新的订单;而 `getOrderDetails()` 则允许按需检索指定订单的信息;最后,`updateOrderStatus()` 提供了一种机制去改变现有订单的状态值。 #### 数据库表结构建议 为了更好地理解后台逻辑运作方式,这里给出一份可能适用的SQL语句定义订单相关的表格布局: ```sql CREATE TABLE orders ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '唯一标识符', user_id INT NOT NULL COMMENT '关联买家账户id', total_amount DECIMAL(10 , 2 ) DEFAULT 0.00 COMMENT '总金额', payment_method VARCHAR(50) DEFAULT '' COMMENT '使用的支付手段', shipping_address TEXT COMMENT '收件地址信息', status ENUM('PENDING', 'PAID', 'SHIPPED', 'DELIVERED') DEFAULT 'PENDING' COMMENT '当前进度描述', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '初始建立时刻' ); ``` 此脚本中的每一列都有明确的目的和用途说明[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值