大家好,我是老三。 相信大家对网上支付都很熟悉。 今天我就和大家聊聊如何防止订单重复付款。
查看订单付款流程
我们先看一下电商订单支付的简要流程:
从订单/计算开始:
订单/结算:虽然此步骤不是付款的直接起点,但与付款相关的金额和其他信息来自结算。 此时订单状态为未付款。
申请支付:用户选择申请支付,客户端调用支付服务。 此时系统中产生了一笔支付交易,该笔交易的状态为未支付。
发起支付:支付服务调用三方支付。 通常这种钱包式支付在发起支付的过程中会响应一些支付链接,客户端会对这些链接进行相应的处理。
钱包支付:用户通常通过相应的钱包进行支付。 您可以在购物时回忆付款流程。 不同终端对钱包支付的处理方式不同:
支付回调:用户完成支付后,第三方支付平台会回调商户,通知支付结果。
同步订单状态:支付服务确认支付完成后,会将支付结果同步到订单服务。 订单服务将订单状态从未付款更改为“待发货”。 客户端采用轮询、长连接、或者服务器主动。 Push方式改变界面上的订单状态。
我们从支付流程的角度来看一下支付状态的变化:
为什么我们要花这么多篇幅讲支付业务流程和交互流程? 因为我认为防止订单重复支付不仅仅是一个技术问题,更是一个业务和产品问题。
为什么订单支付两次? 无法防止重复支付造成的重复支付
我们可以看到,PC端支付,扫描二维码即可。 这些二维码对应着相应的支付流程。 如果用户重复点击支付,如果不采取预防措施,就会产生两条支付流,即两条支付流。 两个不同的二维码,如果用户分别扫描两个不同的支付码,那么无疑会出现重复支付。
由于订单丢失而导致重复付款
“明明已经付款了,为什么我的订单还没付款?”
这就是所谓的“掉单”:
用户看了一下并付款,但商城中的订单尚未付款,但如果他确实想要,他可能会再次下订单,从而支付两次。
多个渠道造成重复支付
我们国内的支付体验还是很快的。 你可能感觉不到。 如果您了解过海外支付,您可能知道很多支付渠道需要很长时间。
例如,用户Paul选择了一种支付方式,但支付网点距离Paul所在的村庄太远。 保罗选择再次付费。 保罗去市场时,他到网点付款,又重复付款。 。
这种情况你可能很少遇到。 我们可以使用美团下单。 首先打开微信支付。 不要付钱。 然后回到美团,打开支付宝。 使用支付宝完成支付后,使用微信继续支付。 你猜到了? 你猜,两次支付都能成功吗? 答案是肯定的。
如何防止重复付款被锁定订单
无论是3.申请支付还是5.支付回调,都应该在订单维度进行锁定,防止并发情况下重复操作。
加锁无疑是分布式锁,通常我们会选择分布式锁。
缓存结果
如果支付申请成功并且支付回调成功,则应该缓存结果。
当申请付款并收到成功回调时,您应首先检查付款状态。
付款时取消付款
如果用户重复支付并再次申请支付,如果支付申请已经成功,那么支付肯定会被拒绝。
但如果现有交易仍在支付怎么办? ——我们不确定是成功还是失败。 我们肯定不能拒绝付款,因为用户可能付款失败了,但是状态还没有同步,这是肯定不可能的。
因此,我们可以取消当前付款并继续付款。
已支付现金退款
现在有一个新问题。 如果发起付款时,就会有钱被支付。 如果第三方支付平台不支持取消支付,或者用户新的支付是通过其他渠道进行的,我们希望尽可能提高用户的支付成功率。 评分,怎么办?
我们可以允许用户在订单仍在支付的情况下发起支付时发起多次支付。 在支付回调中,我们可以检查用户是否转账成功,并对后续交易进行退款。
当然,退款是一个非常危险的操作。 毕竟钱退了就很难拿回来了,所以一定要控制风险。
主动轮询和重试以防止订单丢失 主动轮询以防止外部订单丢失
如果因为失败而没有收到回调,或者没有及时收到回调,就可能会出现所谓的外单掉单。
防止外单掉单的关键是不能只等待三方回调通知,而必须主动查询。 用户发起支付后3秒,您可以发起轮询,直到获得支付流程的最终状态。 主动轮询一般可以如下实现:
同步+异步,防止内部掉单
支付服务收到异步通知回调或者主动轮询流程最终状态后,需要将支付流程的变化通知订单服务,订单服务同步更新订单状态。 这个过程要尽可能保证通知成功,可以使用同步+。 异步方式。
这里还有一个问题,客户端如何同步这个状态呢? 因为服务器可能已经更新了订单状态,但是客户端界面上付款仍然未支付,用户必须主动刷新才能得到最新的状态,这显然是不合适的。
服务端和客户端的状态同步无非就是pull和push:
应尽可能避免客户付款
无论从产品角度还是技术角度,当客户端发起支付时,实际上应该尽可能避免跳出。 PC端使用支付服务生成的支付码,而不是跳转; 手机网页和APP都在应用程序内。 显示支付页面,当然这是由第三方支付平台决定的。
不知道你有没有注意到,支付宝现在可以让你不用掏出钱包就可以在应用内完成支付。 这对于商户来说意义重大,对用户体验和支付成功率产生积极影响。 ,相信随着国内的卷入程度,其他支付商一定会“跟进”。
好的,这就是如何防止重复付款的全部内容。 至于付款,老三只是粗略了解一下918项目网,希望大家多多指教。
参考:
[1]。 服务器端如何防止重复支付
⭐面条逆袭系列: