架构⽀付架构(上)
架构 & ⽀付架构(上)
⼀. 和⽀付宝对⽐
这两者现在已经占领了移动⽀付的90%市场,⽀付形式也都⼤抵相同,只是在实现细节上略微不同。这⾥之所以要专门对⽐,是因为有些接⼝的不同在后边的框架的设计中也会有所影响。主要集中在以下⼏个⽅⾯:
1. ⽀付⽅式上:
a. ⽀付宝多了⼀个声波⽀付
b. ⼿机端H5⽀付⽅式中, 只⽀持内部浏览器
c. ⽤户扫码⽅式中除了正常下单返回⽀付⼆维码,还提提供了回调下单模式(即扫描的⼆维码并不是⽀付⼆维码,⽽是商品⼆维码,会回调商户指定地址才真实下单)
2. 接⼝安全
人脸识别门锁a. 不同接⼝安全等级不⼀样,涉及付款等接⼝加密相对简单(MD5,SHA1),涉及到退款,发送红包等接⼝需要使⽤双向证书验证
b. ⽀付宝所有接⼝统⼀使⽤RSA加密验证,需要公私钥验证。
3. 接⼝协议
a. 使⽤的xml协议,所有参数基本都在同⼀层级。
b. ⽀付宝使⽤json协议,核⼼参数放在biz_content字段中。
⼆. 和⽀付宝软件架构
作为⼀个重要业务,⽀付在客户端上⾯临着各种问题。其中最核⼼问题就是分平台实现导致的问题:
iOS 和安卓实现不⼀致
· 容易出 Bug
· 通过沟通保证不了质量
扩展性差,⽆法快速响应业务需求
· 需求变更迭代周期长
· 数据上报不全⾯
质量保障体系不完善
· 缺少业务及设计知识沉淀
· 协议管理松散
· 缺少统⼀的⾃动化测试
⽤户体验不⼀致
经济特区有哪几个⽐如下图就是之前安卓和 iOS 没有统⼀前的收银台。
为了解决分平台实现这个核⼼问题,并解决以往的技术债务。我们建⽴起了⼀整套基于 C++ 的跨平台框架,并对核⼼⽀付流程进⾏了重构。
⽀付跨平台从
iOS 7.0.4 版本起, 安卓从 7.0.7 版本起全⾯覆盖。
线上效果指标
以 iOS 上线情况为例:
Crash
率
上线前后
Crash 率保持平稳,没有影响稳定性,跨平台⽀付⽆必现 Crash,做到了⽤户⽆感知切换。
举个例⼦,⼤家可以⽤发⼀笔红包,拉起的收银台和⽀付流程就是由基于C++编写的跨平台代码所驱动的。
效能提升
以核⼼⽀付流程代码为例,跨平台需要 3512 ⾏,iOS 原⽣需要
6328 ⾏。减少了近 45% 的代码。
以新需求开发为例:
7.0.4 版本需求⼀:收银台改版
7.0.4 版本需求⼆:简化版本收银台
被举报怎么解除· 跨平台实现:iOS + 安卓 共计
3 ⼈⽇,在封板时间前完成
· 原⽣实现:iOS, 安卓封板时间后⼀周才基本完成
· 跨平台实现:iOS + 安卓共计
5 ⼈⽇,在封板时间前完成
· 原⽣实现:iOS, 安卓封板时间后⼀周才基本完成
那么⽀付跨平台软件架构怎么样有效进⾏质量保障,并且提升⽣产⼒呢?这是这篇⽂章的主要内容。
什么是软件架构
什么是软件架构?正如 Ivar Jacobson (UML 之⽗)说过的⼀样,五个⼈来回答这个问题,五个⼈可能都有各⾃不同的答案。
架构定义可以有很多种说法,从代码规范到发布流程都可以是架构的⼀部分。
针对⽀付的业务特点,这⾥对架构的定义是:架构是系统的组成部件及其之间的相互关系(通讯⽅式)。这更符合我们程序员⽇常编写业务代码时对架构的理解。也就是通俗意义上讲的 MVC,MVVM 等。
为什么需要软件架构
早在 1986 年的时候,⼈⽉神话的作者在讨论软件的复杂性时,谈到:软件的本质复杂性存在于复杂的业务需求中。
⽽管理复杂性,最根本的⼿段就是职责分离。为了实现职责分离,代码重⽤,架构慢慢地复现出来。架构的本质是管理复杂性。关注:Java技术栈,在后台回复:架构,可以获取我整理的 N 篇架构⼲货。
没有架构,我们所有的代码都耦合在⼀起,⼈类的⼼智模型不擅长处理这种复杂性,架构的设⽴,和图书馆的图书分类,公司的组织划分等,本质都是⼀样的。是为了管理复杂性,以取得更⾼的⽣产⼒。
从零到⼀构建⽀付跨平台软件架构
在移动客户端领域,业界基于 C++ 来编写业务代码,并没有成熟的架构。即使使⽤ C++ 编写业务逻辑,但都不涉及 UI,不涉及界⾯的跳转流程。
既然业界没有⼀个成熟的架构可借鉴,那么是不是直接把业界通⽤的架构简单套⽤⼀下就好?
1. 抽象业务流程
太空一号现在业界通⽤的有
MVC , MVP, MVVM 。这些⼤家都熟悉的软件架构。但是这些软件架构都存在⼀个问题:那就是没有处理好业务流程, 界⾯转场。
⽀付的流程多。⽽流程就是由⼀个个的界⾯(ViewController,Activity)和相关的业务逻辑组合⽽成。
上⾯的MV(X) 模式忽略了⼀个⾮常重要的⼀点,那就是业务流程,界⾯的转场究竟由谁负责。也即
ViewController 与 ViewController 之间的关系由谁维护,业务流程的逻辑写在哪⾥。
如果还按照传统的MVC 模式,那么 ViewController ⾃⼰负责和不同的 ViewController 通讯。那么 ViewController 得不到复⽤,更致命的是业务流程的代码⾮常不清晰,业务流程的代码都被分散到各个 Controller 中, ⽽⼀个 Controller ⼜可能耦合了多个业务的代码。
举个例⼦:⼀个普通的转账流程,可能会涉及风控拦截,实名验证, 收银台, 绑卡,⽀付成功页等等。如果是基于 MVC 这种架构的话,很快代码会变得难以维护。
因此,为了适应⽀付流程多,界⾯跳转复杂的特点。架构抽象的第⼀步就是将业务流程抽象为⼀个独⽴的⾓⾊ UseCase。同时, 把界⾯抽象为 UIPage。⼀个⼤的业务流程可以分解为⼀个个⼩的业务流程。
和刚才基于MVC 混乱的架构相⽐:
1. 业务流程的代码能够聚合到 UseCase 中,⽽不是分散到原来 iOS, 安卓的各个 ViewController,Activity 中。
2. 业务流程和界⾯得到了复⽤。
3. 契合⽀付多流程,界⾯跳转复杂的业务特点。
4. 加⼊路由机制
既然流程得到了抽象,这个时候需要针对业务流程做更深的思考。在开发⽀付业务流程时,开发者不可绕过的问题有:
1、流程之间,页⾯之间的流传。
⽐如我们要给⼀个朋友转账,输⼊⾦额,确认⽀付,触发 Cgi 后。下⼀个流程是多变的。有可能⽤户需要去实名,有可能⽤户要进⼊⼀个安全拦截的 WebView,或者是正常拉起收银台。
本⽂中的名词 CGI 可以理解为⼀个⽹络请求,类似HTTP请求。
那么以往在
iOS, 安卓分开实现时,都没有⼀个统⼀的处理机制。要么就是通过⽹络回包的某个字段来判断,要么就是本地维护⼀些状态来决定下⼀步⾛什么流程等等。⾮常繁琐,易错。
2、特殊流程的处理
立夏的含义是什么意思>昨日重现中文歌词⽀付业务流程还有个特殊的地⽅,那就是在正常流程的中间,往往很多时候要需要插⼊⼀些特殊流程。⽐如有些地⽅要跳转 Webview, 有些地⽅要跳转⼩程序,有些地⽅要弹窗告知⽤户风险,或者终⽌当前流程,等等。我们经常需要在业务代码⾥⾯不断重复增加这样的处理。
这些问题,引导我想到,⽀付需要⼀个路由机制。
⾸先了解⼀下路由机制。
路由机制的核⼼思想,就是通过向路由传递数据,然后路由解析数据,并响应。
结合⽀付和⽹络密切相关的特点。创新地将⽀付领域模型作为传递的数据。
那么怎么建⽴这个⽀付领域模型的呢?
建模,就是建⽴映射。领域知识 + 建模⽅法 = 领域建模。那么这⾥的领域知识,就是对⽀付业务流程的理解。建模⽅法,我采⽤了 UML 建模。最终会落地为 Proto 协议供客户端和后台⼀起使⽤。
⾸先,⽀付业务特点就是和⽹络密切相关,流程和页⾯往往是由 Cgi 串联起来。因此建⽴模型时,最外层便是⽹络回包。对于路由机制,这⾥我们只关⼼路由数据模型。
路由数据模型由路由类型,还有各个路由类型所需要的信息组合成。
路由类型清晰的定义了要触发的⾏为。究竟是要开启⼀个 UseCase,还是要打开⼀个界⾯,或者 ⽹页,⼩程序,弹窗等等。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论