携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
前言:
之前在做商城订单支付时,有一个需求就是将超过15分钟还未支付的订单取消,这里是使用消息队列进行延时消息推送:
在创建订单成功之后,向队列中存入订单id,设置延时发送,延时时长为15分钟,此时订单id将会在15分钟后存入到activeMq的消息队列中,然后mq监听器监听到消息,拿到队列中的订单id进行处理,拿到订单id以后去查询该订单是否完成付款,如果未付款,则更新为订单超时交易关闭。
以上的方法针对于系统内部的业务逻辑进行的处理,但用户点击支付,在支付页面未输入支付密码一直等待,如果超过15分钟系统已将该订单状态改为取消后,用户在支付页面进行支付就会有不好的体验,这里为了提升用户体验和安全性做了以下处理:
支付宝:
官方文档:
支付宝设置绝对超时时间,设置一个时间点,如果拉起支付,一直等待,超过设定的时间点,就会提示订单超时。
获取拉起支付时服务器时间,往后推迟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);// 订单绝对超时时间
微信:
官方文档:
微信设置起止时间,如果该笔支付订单超过交易结束时间还未支付,则订单交易关闭。
代码示例:
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);