SpringCloud商城day14 订单处理-2021-10-26

本文详细介绍了使用Spring Cloud构建的商城系统中,如何利用RabbitMQ实现订单的延时处理。流程包括调用微信支付API、检查订单状态、关闭未支付订单以及回滚库存。核心是通过死信队列实现消息的延迟消费。同时,讨论了批量发货功能,涉及第三方物流系统的接口对接,如快递鸟和菜鸟物流。最后,阐述了自动收货功能,包括用户手动确认和通过Spring Task定时任务自动修改订单状态。
摘要由CSDN通过智能技术生成

一. RabbitMQ延时消息-> 订单处理

1. 流程: 调用微信支付api-> 查看订单状态-> 未支付则调用关闭订单api-> 修改订单状态为已关闭order-> 回滚库存goods-> 已支付则做补偿操作(修改订单状态和记录日志)

2. 核心: 死信队列-> provider发送的消息不会被立刻消费-> 设定TTL后被consumer消费

3. 创建订单时, 发送延迟消息为订单号-> 系统在限定时间内取出消息-> 查询订单支付转态

4. 死信交换机

(1) 普通队列:
    队列: queue.ordertimeout
    
(2) 死信交换机(Dead Letter Exchange): TTL到期: 队列长度满了; consumer拒收(requeue=false);
    name: exchange.ordertimeout 
    type: fanout(类型必须为fanout)
(3) 绑定: Bindings-> To queue-> queue.ordertimeout
(4) 死信队列: Tell Time Live消息过期时间
    name: queue.ordercreate
    durability: Durable
    Auto delete: No
    Arguments: x-message-ttl=10000  //消息的生存时间
               x-dead-letter-exchange=exchange.ordertiemout  //队列的死信交换机

5. 代码实现:

(1) 订单价单-> 发送延迟消息
(2) 消息内容: orderId
(3) 发送到MQ的延迟消息
(4) 订单服务监听消息
(5) 基于微信api-> 查询支付状态
(6) 已支付-> 数据补偿-> MySQL记录日志/订单转态已支付
(7) 未支付-> 基于微信api关闭订单-> MySQL修改订单状态-> 商品库存回滚

调用微信api查询订单/关闭订单 

(1) com.changgou.pay.controller
 //基于微信查询订单
    @GetMapping("/query/{orderId}")
    public Result queryOrder(@PathVariable("orderId")String orderId) {
        Map map = wxPayService.queryOrder(orderId);
        return new Result(true, StatusCode.OK, "查询订单成功", map);
    }
    //基于微信关闭订单
    @PutMapping("/close/{orderId}")
    public Result closeOrder(@PathVariable("orderId")String orderId){
        Map map = wxPayService.closeOrder(orderId);
        return new Result(true, StatusCode.OK, "关闭订单成功", map);
    }

(2) com.changgou.pay.service.impl
    //基于微信查询订单
    @Override
    public Map queryOrder(String orderId) {
        try {
            Map<String, String> map = new HashMap();
            map.put("out_trade_no", orderId);
            Map<String, String> resultMap = wxPay.orderQuery(map);
            return resultMap;
        } catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    //基于微信关闭订单
    @Override
    public Map closeOrder(String orderId) {
        try {
            Map<String, String> map = new HashMap();
            map.put("out_trade_no",orderId);
            Map<String, String> resultMap = wxPay.closeOrder(map);
            return resultMap;
        } catch(Exception e) {
            e.printStackTrace();
            return null;
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值