扫码支付-超时未支付

119 阅读2分钟

核心思想

是否超时,核心思想,肯定是比较时间差。

实际上,就是两个时间。第一个时间,是扫码的时间。第二个时间,是真正支付的时间。

基于token

方案1-手动比较时间差

此时的token的本质其实一个map,包含了多个字段,并且加密,创建时间字段只不过是其中的一个字段,用于检查订单是否超时未支付。

第一次扫码请求,把时间字段放到token,并且返回给前端。

第二次真正支付的时候,会携带token给到后端,再和当前时间比较是否过期。如果过期,就提示订单过期。

方案2-基于缓存

此时的token,只是作为一个key。

第一次扫码请求,写 token/订单对象 到redis,并且设置过期时间。并且返回token给前端。

第二次真正支付的时候,会携带token给到后端,再从缓存获取数据。如果缓存数据不存在,那么就说明订单已经过期,就提示重新扫描支付。

小结

其实差不多,只不过一个是手动比较时间差,一个是基于缓存中间件的过期机制。

另外,还有一个共同点,就是第一次请求之后,后端都会返回token给前端。第二次请求的时候,又会携带到后端,这个时候,后端就可以比较判断是否超时。

定时任务

基于token,和基于定时任务,其实也差不多,都是比较时间差。

只不过,一个是实时检查订单是否过期,一个是异步检查。

既然是实时检查,就要在支付的时候,就开始检查,具体来说,其实就是在网关入口就检查。

而,异步检查,本质是一个兜底方案。假设实时检查失效,那么定时任务轮询也可以兜底。

但是,不管是哪一种,本质都是比较时间差是否超时。

总结

扫码支付是这样,电商系统下单之后倒计时支付,也是类似。