举个例子:
我们的应用同时的接入了支付宝和微信。有 2 种 或者更多的三方支付方式。这时候有一个很明显的问题, 一个订单 如果同时 使用微信支付 和 支付宝支付 就会支付两次( 同时的 意思是指,支付宝支付以后,在异步通知没有回来的时候 ,客户端有使用微信支付了一次 )。
这种情况我们能怎么办呢?
1 正常支付毁掉会在几秒内回来,所以 如果在一个订单 有使用支付宝支付欲望的时候( 获取签名的时候 ),锁定订单 10 秒钟,然这个10 秒钟内不能使用别的凡是支付。
缺点: 用户在企图换另一种支付方式的时候回等待10秒。
2 我们想,我们的用户都是正常人,正常情况不会 在支付宝 通知没有回来的情况下,在使用微信支付一次。但是我们不能避免用户这么做,我们可以吧这个种极端的情况记录清楚,然后给用户退款。
实现:如果我们支付通知回来以后,直接去更新订单状态,那么 支付宝的通知来了以后吧订单改成 支付完成。这时候 微信的 通知来了。我们检查订单状态是完成,正常我们会直接返回完成,不做任何处理( 因为只支付一次,通知也可能来多次 ,比如以前的 同步通知和异步通知 )
这时候应该怎么办呢? 我们应该 在订单之外再记录 一个 支付记录。 上面的 只会回来以后 我们应该写一条支付成功的支付记录。 并且记做业务处理状态是未完成,然后去处理 订单状态,处理以后吧支付记录改成成功,当微信的通知来的时候,我们在写一条支付记录,这条记录是未完成,然后去处理订单,发现订单已经支付完成,那么这个 条支付记录就保留未完成的状态,并且这种记录应该 给用户 原路退回。