第一种措施 - 缓存结果
1. 申请支付成功,支付回调成功,都应该缓存结果
2. 再申请支付,收到成功回调的时候,都应该先去检查支付的状态
第二种措施 - 支付中流水取消
1. 假如说,用户重复支付了,再次申请支付的时候,如果已经申请支付成功了,那么这笔支付肯定是要拒绝的
2. 未支付 - 那就允许支付
3. 但是,要是已经存在的这笔流水还在支付中呢?—— 我们不确定它是成功还是失败,肯定是不能拒绝支付的,因为可能用户支付失败了,但是状态还没同步,这样肯定是不行的。所以,我们可以取消掉正在支付中的流水,再进行支付
第三种措施 - 已支付流水退款
1. 现在又有新的问题了,假如发起支付的时候,有流水正在支付中,如果第三方支付平台不支持取消支付,或者用户新的支付是通过不同的渠道,我们希望尽可能提高用户的支付成功率,怎么办呢?
我们可以在发起支付的时候,订单还在支付中的情况下,允许用户发起多笔支付,在支付回调的时候,检查用户是否已经有成功流水,对后来的流水进行退款处理
第四种措施 - 对唯一订单号做幂等判断
1. 如果客户再次发起支付,不给客户产生新的支付订单号,先用该笔支付订单号调用支付系统,支付系统会判断订单号幂等性,如果已支付,则报错告诉客户已支付成功,请勿重复支付;如果支付失败,则新产生流水调用渠道进行支付落地;如果支付状态未知,则告诉客户,交易状态未知,请发起查询或者关单