本文主要向初步接触支付业务的读者简要普及同步与异步处理的基本概念、关于异步处理在支付环节的应用、支付系统向商户通知支付结果时,为什么要使用“异步通知”?异步处理方式在支付环节可能会产生的哪些问题?在产品设计上如何避免这些问题的发生?
第三方支付平台在处理支付环节时,一般采用异步回调的方式将支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理,并按文档规范返回应答。
一、什么是同步处理、异步处理?
同步和异步是开发技术中的两个概念:
同步:
指消息请求方发出请求后,必须要等待消息接收方返回结果,才能执行下一个任务。
这种情况下,消息请求方会说:兄弟,你现在就处理我的请求,我啥事都不干,就等你反馈处理结果。
异步:
指“消息请求方”发出请求后,“消息接收方”并不立即准备处理,而告知消息受理结果。“消息请求方”不需要等待“消息接收方”返回处理结果,随时可以触发下一个请求,去执行其他程序。
这种情况下,“消息接收方”会说:兄弟,你的请求我收到了,我会处理的,你该干嘛就干嘛去,等我回复就可以了。
二、关于异步处理在支付环节的应用
第三方支付机构在处理电商平台提交上来的支付请求时,一般都是采用异步处理的方式,在其接口文档上都会说明支付结果以异步通知为准。
下面我们先通过一张系统交互图来了解第三方支付平台在处理支付环节时的一般处理流程。当你在某个电商APP购物并支付订单时,若该电商APP对接的第三方支付平台是微信,那么整个流程大致如下图:
上图是在微信支付时序图的基础上绘制出来的,主要补充了网联/银联清算机构以及合作银行的系统交互流程,便于大家了解整个支付环节。
主要交互说明如下:
步骤一:用户在商户APP中选择商品并提交订单。
步骤二:用户选择微信支付并开始支付订单。
步骤三:商户后台调用微信支付统一下单支付接口,生成支付订单推送给微信支付。
步骤四:商户APP调起微信支付。
步骤五:用户输入密码完成验证,微信支付同步返回支付受理成功,但是最终支付结果仍然要以异步通知为准。
步骤六:微信支付发送扣款请求给网联,网联转接给发卡行。
步骤七:发卡行完成扣款,反馈成功消息给网联,网联再通知微信支付。
步骤八:微信支付异步通知商户支付成功,商户后台也可以主动查询支付结果。
注:以上流程是假设电商平台直接对接微信支付,如果是电商平台接入的是其他第三方支付平台(该平台聚合了微信支付方式)或者第四方聚合支付平台,那么在中间的系统交互则会多了一个环节。
三、支付系统为什么要使用“异步通知”?
1. 受上游渠道的影响
从支付交互时序图可以看出,在商户端提交支付订单后,支付结果的返回需要经过各合作银行-网联-第三方支付平台,最终才能到达商户端后台。当上游渠道无法保证系统的及时性与稳定性时,采用异步通知机制就显得尤为重要。
2. 同步通知的弊端
试想一下,如果采用同步通知机制,在上游渠道质量较差的情况下,或自身系统存在问题,支付机构短时间内获取不到交易终态,若强行要求同步返回交易终态,进程会一直挂在这里,非常耗费系统资源,得不偿失。
3. 其他原因
有时候因为商户端的网络异常、延迟、用户的异常操作,比如关闭了浏览器、app等,导致无法及时接收同步通知,这时候就非常需要异步通知了。
像微信这样的支付机构,一方面能够接入优质的上游渠道,另一方面自身的技术能力也很强大,所以往往能够在短时间内做到同步返回支付结果。
但是也无法百分百担保,所以微信支付最终还是以异步通知的结果为准。
其他第三方支付机构,就更加无法保证能够同步返回支付结果了。
所以更通用的做法是同步返回“交易已受理”状态,代表支付机构已受理这笔交易,最终交易状态依赖支付机构的查询接口或回调通知获取。
当然,第三方支付机构除了异步通知外,还会支持商户端做主动查询,即商户端通过查询接口,调用某笔交易的支付结果,然后扭转订单状态。
这算是异步通知的一个补偿机制,有时候因为商户端网络延迟的问题、或者第三方支付机构系统的问题,导致异步通知失败,由于第三支付机构的异步通知频率会逐渐增大,所以有可能商户端会迟迟接收不到通知,这时候如果能够提早做主动查询,能够有效提高用户体验。
四、异步处理方式在支付环节可能产生的问题?
1. 重复支付问题
当用户支付成功后,若当中出现了网络延迟,导致第三方支付机构回调支付结果延迟。虽然用户的银行卡已经扣款了,但是由于电商平台没有接收到第三方支付机构的交易成功结果,导致订单还是处于未支付状态。用户误以为没有支付成功,再次进行支付,导致重复支付问题的发生。(在这种情况下,如果用户觉得自己没有支付成功,不排除用户会主动取消订单,或者系统超时取消订单,影响还是很大的。)
2. 交易掉单问题
这主要是本地未正确接收到渠道下发的异步通知导致。即一笔交易,用户实际上已经完成了支付,银行也扣款了,但是由于支付机构的问题,异步通知失败,导致该笔交易在第三方支付机构已经是交易成功,但是订单在电商平台仍然是未支付。
五、如何通过产品设计避免上述问题的发生?
方法一:交互方式的优化
这种方法更多的是针对网页端,在收银台中选择对应的渠道并开始支付后,有的电商平台会选择打开一个新网页界面,而原有的界面则会显示一个弹窗,引导用户在新打开的界面中进行支付。具体交互如下:
首先,在调用支付接口之前(例如用户在订单列表点击付款按钮或者进入收银台选择支付渠道后点击支付按钮),系统需要先确认该订单的支付状态,可以调用主动查询接口确认订单是否已经完成支付,若未完成支付,才允许进行支付,避免商户端重复提交支付订单给到第三方。不管是电商平台网页端或者是移动端,这样的一个校验动作都是不可缺少的。
然后,当用户在收银台点击“立即支付”按钮,若打开了新的网页界面,则原有界面显示付款提示弹窗,当用户点击“已完成付款”时,系统会再去第三方支付平台查询支付结果,如果支付成功,隐藏掉这个弹窗,展示支付成功界面。如果未查询到支付成功结果,则可以提示未检测到支付信息,然后关闭此弹窗或者可以返回订单详情页。
当然,有些电商平台也会采用在收银台点击支付时,直接刷新当前界面,进入付款界面,这样在一定程度上也是能够避免用户重复支付的问题。
下面列举几个案例:
在当当收银台中,当使用网银支付时,会打开新的网页界面进入银行网关界面,同时原有收银台会显示一个支付提示弹窗。
在腾讯云中,在订单界面点击立即支付可以进入收银台,当使用网银支付方式打开新的网页界面时,原有订单界面也会显示一个支付提示弹窗。
方法二:自动补单机制
电商平台未收到第三方支付平台的通知,可以是由于网络问题,或者其他异常掉单。
这时候我们可以利用第三方支付平台提供的查询接口,主动到第三方平台轮询该订单的支付状态(要考虑系统性能,这个跟开发兄弟做好沟通即可),通过这种机制,在一定程度也是可以避免重复支付的问题。
当然,以上方案并不能百分百避免重复支付的问题,最根本的还是在于上游渠道返回支付信息的及时性。
当真的出现用户重复支付的问题时,就要通过后续的对账,查出该笔订单下面的多笔支付记录(财务上称为长款),然后走人工或者自动的退款流程了。关于跟第三方支付平台的对账跟差错处理,后面有机会再跟大家分享。
六、写在最后
电商平台在处理支付流程的时候,最重要的还是要对第三方支付平台的业务逻辑有清楚的了解,知道第三方支付平台能够提供什么样的接口能力,我们再结合自身的实际业务,制定支付方案。