|一笔订单,但是误付了两笔钱!这种重复付款异常到底该如何解决?( 二 )


重复付款异常的主要的解决办法有两种 , 分为事前与事后 。
事前主要的目是尽可能防止用户重复付款 , 主要解决办法为优化付款页面 , 尽可能做好提示 。
「第一种优化方式 , 付款页面直接跳转到第三方/银行的网银页面 , 不要打开新的页面去跳转 。 」
|一笔订单,但是误付了两笔钱!这种重复付款异常到底该如何解决?
本文插图

网银同步跳转
这种方式可以防止用户误打开两个网银付款的页面 , 从而导致重复付款 。
但是这里会有一个问题 , 银行网银页面付款成功之后 , 用户如何知道其在商户侧订单状态也成功了?
其实很简单 , 现在网银支付接口 , 一般都会有一个参数 「return_url:同步跳转地址」。
来自支付宝开发文档
只要在接口传入这个地址 , 当支付成功之后 , 页面最终就会跳转到这个传入的地址 , 商户侧就可以在地址显示订单是否支付成功 。
|一笔订单,但是误付了两笔钱!这种重复付款异常到底该如何解决?
本文插图

支付系统异常处理-同步跳转
上面我们提到 , 用户有可能会使用浏览器回退功能 , 跳转到支付页 , 从而导致重复付款 。
对于这种情况 , 我们可以在其回退支付页时 , 首先向后台查询这笔订单支付结果 , 如果已支付成功 , 那就直接显示成功页面 。
「第二种优化 , 对于这种重新打开一个页面跳转到银行网站 , 我们可以在页面加入弹窗提示 , 询问用户是否已支付完成 。 」
|一笔订单,但是误付了两笔钱!这种重复付款异常到底该如何解决?
本文插图

比如上面这种处理方式 , 当用户点击确认完成充值 , 可以马上向后台发起查询订单状态 。
下面来聊聊事后的解决办法 , 「其实解决办法很简单 , 发起内部退款 , 将多余支付的一笔反向退款回去」 。
支付系统内部可以有个定时任务 , 定时扫描支付单下有多条成功渠道订单的记录 , 然后选择将重复支付渠道订单发起退款 。
这种方式是支付公司系统内部的操作 , 不需要商户侧发起指令 。
二、订单失效异常
1. 异常场景
这种场景一般常见于电商购物 , 秒杀等购物场景 。 当用户下单之后 , 页面将会开始倒计时 , 用户需要在有效期内支付成功 。
|一笔订单,但是误付了两笔钱!这种重复付款异常到底该如何解决?
本文插图

假设用户点击跳转到支付宝 , 但是其没有立刻支付 , 而是停留了很久 , 在订单最后一秒时间内完成了支付 , 但是这个时候订单早已因为时间到期而被自动取消 。
这样就发生用户扣款已经成功 , 但是订单却是失败或关闭的场景的 。
另外还有一种情况 , 用户在有效期内支付成功 , 但是因为网络、内部应用等问题 , 支付结果的异步通知过了很久才收到 , 这时内部订单的早因为时间到期而被取消 。
2. 解决办法
「第一种解决办法 , 上送有效期给支付渠道 。 」
一般支付接口都会有一个支付有效期的字段 , 表明这笔支付最晚可以支付的时间 。 如果超时未支付 , 这笔支付将会被关闭 。
来自支付宝开发文档
当然一般情况下 , 如果未上送 , 这个字段内部一般会有个默认的有效期 , 比如 3 天 , 这个时间就比较长了 。
所以当调用支付接口时 , 可以将订单剩余有效期传入支付接口 。 这样用户如果在超时时间内未完成支付 , 支付将会失败 。
「第二种解决办法 , 内部发起退款 。 」
这个解决办法依然事后托底的解决办法 , 对于支付订单已关闭 , 但是支付却成功的情况 , 发起内部退款 , 将钱退给用户 。
内部可以有个定时任务 , 定时扫描支付订单已关闭但是支付却成功的情况 , 然后发起退款指令 。


推荐阅读