持续提升技术,完善知识体系
技术方案

» design

选择所属分类: design

java tomcat tools maven spring quartz zookeeper redis linux webservice dubbo mysql others nginx jvm springcloud hbase kubernetes hadoop clickhouse vue
2020-11-21 06:01
关于电商重复支付、超时取消支付解决方案

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