业务场景:
一般电商下单流程中为了释放库存会针对用户下单做超时订单交易关闭的处理,这里一般都是15分钟,30分钟等。
使用队列ActiveMQ处理超时订单
在项目过程中遇到用户停留在支付页面15分钟之后再进行支付,就会出现用户付款,后台已经把订单当做超时处理为交易关闭的订单。
其实针对这种情景,支付宝和微信已经给出了解决方案:
支付宝:
官方文档:
支付宝设置绝对超时时间,设置一个时间点,如果拉起支付,一直等待,超过设定的时间点,就会提示订单超时。这里代码中的业务逻辑:订单15分钟未支付超时关闭订单
获取拉起支付时服务器时间,往后推迟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);
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()));
// 结束时间:服务器当前时间推迟15分钟
data.put("time_expire", endTime);