在支付场景中,订单超时状态改变后,必须把支付链接的有效性失效,否则可能出现掉单错误。如:用户支付界面一直在,订单超时后,用户又去支付,就会导致付钱不到货。
支付链接失效须实现两层:第一层是Redis缓存的失效,即用户通过系统无法再获取支付链接;第二层是支付服务商提供的支付超时失效,即一定设置支付超时时间(timeoutExpress),这点尤其重要,从根本上失效了支付链接。
另外,支付链接的超时时间 一定小于等于 订单状态的超时时间。建议小于订单状态的超时时间,因为当存在用户接近订单超时去支付时,支付成功的回调可能在订单超时执行之后,则又出现掉单错误。因此,最好保证:支付链接超时时间 + 支付回调时间 <= 订单状态超时时间。
为降低掉单到最小概率,在订单状态超时执行过程中,一定再去查询一次订单支付结果,如果发现订单已经支付,则跳出执行支付成功方法,否则继续执行支付失败的订单超时方法。