作支付一年多了,公司的支付平台刚搭建好进的公司,经历了从一开始的各处漏洞,到代码重构后系统稳定运行,再到功能的逐渐完善和易用性提高,最后到如今追求系统效率的提高,我也从当初对支付一脸懵逼的实习生到成为了解支付的各个方面能顺利解决各类问题的开发工程师,感触颇多。javascript
在作的是一个典型的聚合支付平台,主要跟第三方支付公司(也有银行)交互。 开发语言是 PHP。可能你们印象中,支付做为一个重型业务,应该用 java 这种重型语言来开发。但在小型公司初期业务迅速扩展时期,跟得上业务的发展相当重要,PHP 做为敏捷开发的表明,天然在技术选型上有着很大的优点。可能跟业务量相关,平台目前在一个阿里云小机器上暂时没有效率压力,日处理二三百万交易没有问题。php
本系列准备分三篇来介绍,支付相关的基本概念、支付系统的设计和我作支付时遇到的一些坑,可能会偏业务一些,也不往首页上放了,留给有缘人。css
支付是个概念性很强的领域,其业务方面有许多专业词汇,技术上也比其余业务要求要严格,毕竟牵涉到钱,这里先简单地介绍几个概念,便于后面文章理解。html
聚合支付,聚合的是第三方支付公司(如支付宝、网银在线、快钱等,下简称三方公司)。java
咱们支付最终处理方都是银行,但银行并非谁都有资质接入的,这就须要第三方支付公司。第三方支付公司对接多个银行通道,但业务良莠不齐,商户若直接对接多个第三方支付公司成本也会很高。这时便须要聚合支付平台了,聚合支付平台对接多个商户,做为中间人角色,自己并没有业务。但商户只须要对接到一个聚合支付平台便能方便地接入支付功能,目前市场上比较成功的聚合支付平台有 ping++、付钱拉等。python
幂等更多的是一个计算机概念,在计算机领域也有多种应用,如 HTTP 的 PUT 方法(也被应用于 RESTFUL API 的概念中)。特色是其任意屡次执行所产生的影响均与一次执行的影响相同,也就是说一个动做,作多少次都不会影响到最终的结果,保持交易处理的幂等性在支付系统中特别重要。nginx
对支付平台来讲,支付通道是指 一个三方支付公司分配的一个商户号,固然它也能够更细地划分,如添加卡类型、银行等维度,具体要考虑到支付路由系统的设计。git
终态,顾名思义,是最终的不会再改变的状态。相较于其余业务,支付系统对终态的定义要更清晰一些,它表明着一笔交易的最终状态,要么成功,要么失败,不会有其余状态。github
异步与同步对应,是指一个请求发出后,结果由回调或通知来处理。因为支付处理的复杂性和严密性,一笔交易每每没法在很短的时间内确认终态,而长时间的阻塞等待也是不可接受的,因此支付系统对异步特别依赖。web
风险控制,是识别异常交易并加以额外验证的模块,通常牵涉重要些的系统都会有。风控并不能彻底避免资金损失,只能尽可能减小损失。简单的包括频繁相同请求控制,时间段内交易金额限制等,复杂的会包括惯性分析,用户画像等。
风控的严密性和交易的安全性成正向相关,但同时也会影响系统流程的复杂性,越严密的风控必然会致使更长的流程,更差的用户体验,甚至会须要运营人员介入。
对帐严格来讲并非支付流程中不可缺乏的步骤,它是一种确认和补救机制,它经过对比交易双方的记录汇总来发现支付问题。
虚拟帐户是一个很巧妙的设计,它是远程帐户金额在本地的映射,只要保证在远程全部的支出和收入在本地有一样的记录,就能经过本地金额来确认远程帐户的金额,这样就避免了频繁的帐户金额查询操做。此设计通常被用在代付和退款业务中,这两种业务一般须要在支付发起方在支付受理方设立一个帐户并充值维持其金额可用。
支付网关是支付发起方与支付受理方的接口,一般有复杂的报文处理,如参数映射、参数强验证、加密、签名等。 支付网关中将三方公司的状态码映射为本身系统的状态码这一步骤是重中之重。
指支持中起决定性的信息,通常为人信息或交易主体银行卡的信息。
交易表须要考虑多通道,在一条业务记录在一条支付通道交易时可能会失败,若是有重试机制的话,那么一条业务记录会对应多条三方公司的请求记录。另一定要考虑扩展字段,后续会以此字段来缓冲字段的扩充。
不少时候支付系统须要对支付要素进行验证,每次都去请求支付通道验证显然会形成浪费,那么咱们须要对数据进行缓存。
为何是缓存呢,由于这些支付要素都是有有效期限的,一我的会更名,卡会换绑定手机号,若是无脑使用之前的数据会形成一部分信息判断错误。设置合适的过时机制或重试机制才能使下降成本和提升准确率之间达成平衡。
日志在支付系统内有着非比寻常系统的重要性,它除了肩负着问题定位和分析,交易跟踪的重任,在与外部的接口处更有着请求凭证的做用,良好的日志管理系统能够帮助技术人员快速定位和解决问题,也能在与三方公司扯皮时准确扔出凭证,完善的日志系统也能够直接给运营使用,以此减轻开发人员的工做压力。
以前曾屡次想过总结一下,可总由于以为沉淀不够而搁置下来,现在大胆写下来吧,有时间和机会的话,再慢慢修订。
可能一时考虑的并不全,也可能因为见识缘由,所介绍的东西不免有遗漏,慢慢进步吧~
初稿:2017-03-20