用户下订单之后15分钟支付实现_畅购商城(十四)订单处理

第14章 订单处理

学习目标:

  • 掌握rabbitmq的延迟消息的使用方法

  • 完成批量发货功能,了解第三方物流系统

  • 掌握SpringTask使用方法,完成自动收货功能

1. 超时未支付订单处理

1.1 需求分析

超过60分钟未支付的订单,我们需要进行超时订单的处理:先调用微信支付api,查询该订单的支付状态。如果未支付调用关闭订单的api,并修改订单状态为已关闭,并回滚库存数。如果该订单已经支付,做补偿操作(修改订单状态和记录)。

1.2 实现思路

如何获取超过60分钟的订单?我们可以使用延迟消息队列(死信队列)来实现。

所谓延迟消息队列,就是消息的生产者发送的消息并不会立刻被消费,而是在设定的时间之后才可以消费。

我们可以在订单创建时发送一个延迟消息,消息为订单号,系统会在60分钟后取出这个消息,然后查询订单的支付状态,根据结果做出相应的处理。

1.3 rabbitmq延迟消息

使用RabbitMQ来实现延迟消息必须先了解RabbitMQ的两个概念:消息的TTL和死信Exchange,通过这两者的组合来实现上述需求。

1.3.1 消息的TTL(Time To Live)

消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。

我们创建一个队列queue.temp,在Arguments 中添加x-message-ttl 为5000 (单位是毫秒),那所在压在这个队列的消息在5秒后会消失。

1.3.2 死信交换器 Dead Letter Exchanges

一个消息在满足如下条件下,会进死信路由,记住这里是路由而不是队列,一个路由可以对应很多队列。

(1) 一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再次放在队列里,被其他消费者使用。

(2)上面的消息的TTL到了,消息过期了

(3)队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信路由上。

Dead Letter Exchange其实就是一种普通的exchange,和创建其他exchange没有两样。只是在某一个设置Dead Letter Exchange的队列中有消息过期了,会自动触发消息的转发,发送到Dead Letter Exchange中去。

deba5fbcebf4f56c734bc5304abe1571.png

我们现在可以测试一下延迟队列。

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

(2)创建队列queue.ordertimeout

(3)建立死信交换器 exchange.ordertimeout 与队列queue.ordertimeout 之间的绑定

(4)创建队列queue.ordercreate,Arguments添加

x-message-ttl=10000

x-dead-letter-exchange:exchange.ordertimeout

(5)测试:向queue.ordercreate队列添加消息,等待10秒后消息从queue.ordercreate队列消失,

1.4 代码实现

1.4.1 微信支付-关闭订单

(1)WxPayController新增方法

/**

* 关闭微信订单

* @param orderId

* @return

*/

@PutMapping("/close/{orderId}")

public Result closeOrder(@PathVariable String orderId){

Map map = wxPayService.closeOrder( orderId );

return new Result( true,StatusCode.OK,"",map );

}

(2)changgouservicepay的WxPayService新增方法定义

/**

* 关闭订单

* @param orderId

* @return

*/

Map closeOrder(String orderId);

(3)changgouservicepay的 WxPayServiceImpl实现该方法

@Override

public Map closeOrder(String orderId) {

Map map=new HashMap( );

map.put( "out_trade_no",orderId );

try {

return wxPay.closeOrder( map );

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

(4)changgouservicepay_api的WxPayFeign新增方法

/**

* 关闭微信订单

* @param orderId

* @return

*/

@PutMapping("/wxpay/close/{orderId}")

public Result closeOrder(@PathVariable("orderId") String orderId);

1.4.2 微信支付-查询订单

(1)WxPayController新增方法

/**

* 查询微信订单

* @param orderId

* @return

*/

@GetMapping("/query/{orderId}")

public Result queryOrder(@PathVariable String orderId){

Map map = wxPayService.queryOrder( orderId );

return new Result( true,StatusCode.OK,"",map );

}

(2)WxPayFeign新增方法

/**

* 查询微信订单

* @param orderId

* @return

*/

@GetMapping("/wxpay/query/{orderId}")

public Result queryOrder(@PathVariable("orderId") String orderId);

1.4.3 订单关闭逻辑

如果为

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值