二维码有效期十五分钟,倒计时到 00:00 后页面只弹一句「支付失败,请重试」,订单其实还没关闭。用户以为没付成功,重新下单扫了三次。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
setInterval(() => {
if (Date.now() > expireAt) {
btn.disabled = true;
tip.textContent = '二维码已过期,点击刷新';
}
}, 1000);
前端把倒计时结束当成支付失败处理,没有区分二维码过期和用户未支付。订单关闭是后端定时任务的事,两边状态没有联动。这一点先确认清楚,后面就不用反复试。
「收银台超时提示」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
具体做法是,倒计时结束先把按钮置灰并显示「二维码已过期,点击刷新」,不要提示支付失败;刷新时向后端请求新的二维码和过期时间,同一个订单号复用,不新建订单;同时给一个「已支付但未跳转」的入口,让用户能主动查一次状态。
改完照着核一遍,等到倒计时归零,页面提示过期而不是失败,点刷新拿到新码且订单号不变。
