关于电商重复支付、超时取消支付解决方案
1、背景
目前大部分电商平台均支持支付宝、微信或其他第三方支付网关完成订单支付,重复支付交易异常是一种比较常见的异常场景。如用户通过电商平台发起订单支付,先打开微信支付到录入支付密码窗口,暂不输入密码,回到电商应用,再打开支付宝的支付方式完成付款,同时仍可在此前打开的微信支付中输入密码完成付款,即可模拟出重复支付的场景,当然此种场景较为极端,实际情况中会有多种异常场景导致用户重复支付。
超时取消支付,如在订单即将超时的时刻,调起支付到微信或支付宝,可能在用户录入密码时订单已取消,造成了超时支付。
如以下美团截图(订单在15分钟内有效)
2、重复支付的原因
- 重复提交导致重复支付,应用端未限制用户重复提交;
- 不同端均发起了支付导致重复支付,App端和PC端发起了支付;
- 支付结果回调不及时,用户无法查看到支付成功的结果导致重复支付;
- 用户使用不同的支付方式,支付宝、微信各支付一次导致重复支付;
3、超时支付的原因
- 用户处于订单超时取消临界点,完成支付;
3、解决方案
3.1、重复支付解决方案
-
客户端限制用户重复提交支付,同时服务端支付接口增加幂等处理;
-
确保同一个订单发送到同一支付渠道的商户订单号唯一(即微信/支付宝支付接口的
out_trade_no
),避免相同渠道的重复支付,如同一笔订单多次请求到微信时,商户订单号须唯一,尽量不要与原始订单号相同,原始订单号属于电商平台自身订单,无需直接暴露到支付渠道,可根据规则生成对应的商户订单号; -
增加主动查询的机制,保证交易结果及时从支付宝、微信取回,防止支付成功的订单通知不及时;
-
针对不同支付渠道的重复支付,如既打开支付宝支付、又打开了微信支付,在收到第一笔支付成功之后,要及时调用微信/支付宝的订单关闭接口,避免重复支付;
3.2、超时取消支付解决方案
-
增加最后支付时间,微信/支付宝均有
time_expire
支付截止时间,保证订单在取消后用户的支付订单不可支付,可设置适当的空余时间,如上面美团的订单是15分钟超时取消,可以设定用户的支付截止时间为14分30秒的时间; -
订单超时前调用支付订单关闭接口进行关闭订单,保证订单取消时支付订单已是关闭状态不可完成支付;
以上措施均无法绝对保证交易异常不存在,所以仍需有人工干预,退回重复支付的款项;
4、总结
电商支付系统需与第三方支付系统对接,存在一定的不确定性,需尽量减少此类交易异常保障业务系统的可用性,以及做好异常的补偿处理。