上文提到因为支付处理的流程复杂性,为了不由于冗长的流程阻塞下降了处理效率,支付系统中多使用异步机制,将整个支付业务流程拆分为多步处理。支付系统将流程划分为业务受理、支付前置和支付网关、终态获取、结果处理四个大部分,各部分之间以消息队列或系统之间的交互分隔。风控和路由属于支付前置服务,但因为其重要性和复杂性,将它们提出来分别介绍。javascript
下面的图是两种典型的交易时序图:php
业务受理接口是与商户系统的交互处,主要功能为接受交易业务,响应给商户的是受理结果,而并不是交易结果,交易结果会经过异步方式告知商户。css
为了考虑接口的安全性,受理接口要依次验证支付请求报文的安全性、商户的权限、参数的合法性。为了保证保证交易入口的可用性,特殊接口还要限制商户的请求频率。html
因为受理结果要同步响应给商户,很长的验证流程是不合适的。要尽可能保证受理接口进行的是基础验证,对其余复杂的的验证流程,进行异步处理,验证没法经过的再置交易为失败为好。java
受理接口还须要特别注意到的一点是要保证系统受理和接口响应的原子性,即要保证响应给商户的受理结果是真实的,可查询的。要保证受理结果响应给商户后,该笔交易要能查询到,这时候便须要数据落地和响应商户的顺序了。为了保证安全,要在数据落地后再将受理结果响应给商户,避免出现数据丢失的状况。python
此时要开始异步流程的第一步了,受理成功待处理的交易应该在消息队列内。nginx
风控的概念上文已提过,这里说一下风控系统的简单实现。git
首先是交易量风控,交易金额过大、交易频率太高的交易都是须要注意的,经过配置对不一样交易分类的阈值限制,将可疑交易打上风控标签,再添加后续验证来确认。github
而后是交易惯性风控,这就须要对比用户画像来肯定了。经过分析用户的屡次支付习惯,为用户“画”一张大概的“画像”,支付时对比是否符合其支付习惯,对异常的交易进行后续验证。(因为用户支付的量不大,无此功能,再也不多提)web
后续验证能够分交互性交易和非交互性交易来分别处理,对非交互性交易,如代收或代付,并不要求交易的实时性,能够采用接口审核或人工审核的方式。而交互性交易,如收银台交易,审核确定不能达到要求的实时性,添加验证步骤,如手机验证码等二次验证则十分适用。
支付路由,简单的说就是选择一条支付通道。支付通道要有必定维度上的优先级,这里提到优先级,是由于支付通道偶尔会由于系统维护、银行维护等缘由关闭,那么在可选通道之间要有优先级来调控优先通道不可用时的替代通道。单纯的通道路由在技术上实现起来可能很是简单,但是通道路由要考虑的因素还有不少:
支付网关是支付系统与三方系统的交互接口,支付网关的设计要考虑的重点是报文的交互。除了普通系统要进行的参数验证、内外系统参数映射、各类请求类的包装外,支付系统要额外考虑的有:
支付系统的交易除了需求实时性较强的快捷支付外,其余交易类型通常都是异步,那么终态的获取就靠主动查询和异步回调通知。
异步回调通知:异步回调通知是最基本的获取三方终态的方式了,即支付系统在支付请求时提供一个通知地址,在三方系统处理完交易后请求此地址并附带交易结果信息。须要注意报文验签防止报文伪造。另外通知通常会屡次通知以确保通知到达,还要给三方系统符合规则的响应,以在本身系统处理完交易后,告诉三方系统中止通知。
主动查询:主动查询是对异步回调通知的保证。在有的系统(呵呵)不提供回调通知或本身系统故障通知失败,或对交易的实时性要求很高,而三方系统的异步通知延迟严重时,主动查询就很是重要了。须要注意查询时机,必定要确认三方系统已彻底受理了交易且可查询后再调用查询接口。
获取到支付结果后,不光要及时更新本身系统内的支付状态,还要考虑对交易的后续处理:
支付结果在确认后正常流程内再也不变更,为了减小支付结果的处理对交易表的侵入性,可使用另外一张 交易终态表 来承担交易结果处理的记录。至于两张表的数据同步,使用数据库的事务便可。
帐务和资金管理系统是为了在资金流上确保交易的正确。
支付系统之间通常在第二日进行前一日交易的资金结算。帐务负责维护各个商户与支付通道的对应银行帐户,并根据当日的交易结果汇总出资金的应收应付,第二日财务人员根据应收应付和实收实付进行转帐和核销。
附属服务不属于交易流程的一部分,但它们也是必不可少的部分,对异常交易的排查、修复有着重要意义。
对帐是对前一日交易在全局上的对照,不一样于帐务和资金管理系统,对帐是在数据流上肯定交易的正确性,通常的对帐流程以下:
监控在每一个完备的系统都会存在,不过通常是运维层面上的,支付系统更多的是在业务层面上的监控。监控系统通常监控交易异常、通道异常等影响正常交易的情况,并及时报警告知运营或技术人员。
监控方式通常有:
统计数据通常包括,交易总额,手续费,交易总笔数,成功率等,通常根据业务线、支付通道、银行等维度来分别统计。
对运营人员来讲,统计数据能够帮助在全局上观察交易情况,做出决策;对于业务流程来讲,统计数据能够做为通道路由的基础,如在支付通道交易异常率较高时下降其优先级等,也能够为监控系统提供数据;对技术人员来讲,统计能够帮助有方向地优化系统。
理清了支付的各个必备模块,系统设计应该就会很清晰了,完成了系统设计,后续的工做就剩下代码的堆砌和完善了。
支付服务中的每一块都有必定的“门道”,有机会和必要的话,会单独拿出来一块写。
感谢关注。