【项目】教你处理微信、支付宝支付订单超时

1,080 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

前言:

之前在做商城订单支付时,有一个需求就是将超过15分钟还未支付的订单取消,这里是使用消息队列进行延时消息推送:

在创建订单成功之后,向队列中存入订单id,设置延时发送,延时时长为15分钟,此时订单id将会在15分钟后存入到activeMq的消息队列中,然后mq监听器监听到消息,拿到队列中的订单id进行处理,拿到订单id以后去查询该订单是否完成付款,如果未付款,则更新为订单超时交易关闭。

以上的方法针对于系统内部的业务逻辑进行的处理,但用户点击支付,在支付页面未输入支付密码一直等待,如果超过15分钟系统已将该订单状态改为取消后,用户在支付页面进行支付就会有不好的体验,这里为了提升用户体验和安全性做了以下处理:

支付宝:

官方文档:

1659604264056.png

支付宝设置绝对超时时间,设置一个时间点,如果拉起支付,一直等待,超过设定的时间点,就会提示订单超时。

获取拉起支付时服务器时间,往后推迟15分钟,获取当前时间15分钟之后的系统时间,设置为绝对超时时间。

Long currentTime = System.currentTimeMillis() + 15 * 60 * 1000; 
Date date = new Date(currentTime); 
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String endTime = df.format(date); 
System.out.println(endTime); 
model.setTimeExpire(endTime);// 订单绝对超时时间
e0a8412c3fa32102873f08073a5e26a.jpg

微信:

官方文档:

1659604285561.png

微信设置起止时间,如果该笔支付订单超过交易结束时间还未支付,则订单交易关闭。

代码示例:

Long currentTime = System.currentTimeMillis() + 15 * 60 * 1000; 
Date date = new Date(currentTime); 
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 
String endTime = df.format(date); 
data.put("time_start", df.format(new Date()));// 开始时间 
data.put("time_expire", endTime);// 结束时间 
System.out.println("微信支付-开始时间" + df.format(new Date())); 
System.out.println("微信支付-结束时间" + endTime);