分析支付宝客户端的插件机制

简介: 国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。 

--------------------------------------------------------

原文地址:http://blog.devtang.com/blog/2013/06/23/alipay-plugin-mechanism/

前言

因为开了iOSDevTips的微信公共账号,老收到各种iOS开发的问题,前两天收到一个问题的内容是:

请问像支付宝钱包那样可以在应用里安装自己的应用,是已经在应用里写了逻辑,还是可以向应用里发送代码?

我觉得这个问题挺有意思的,估计大家都感兴趣,所以今天就抽空研究了一下,将支付宝客户端的插件机制具体实现方式介绍给大家。

先介绍一下该插件机制,如上图所示,支付宝客户端在安装后,对于像“彩票”、“爱心捐赠”这类功能,需要再点击安装一次,然后才可以使用。有些时候该插件功能进行了升级,需要点击升级才可以继续使用。插件的方式有利于软件动态增加新的功能或升级功能,而不用再一次向AppStore提交审核。另外,由于用户不需要的插件可以不用安装,也缩小了应用本身的体积大小,节省了下载流量。

分析过程

截取网络请求

分析第一步,截取网络请求。截取网络请求可以查看当用户点击“彩票”进行安装的时候,客户端到底做了什么事情。使用Charles的代理设置功能,启动一个http代理,然后在iPhone上设置连接此代理,则可以看到,当点击“彩票”插件时,客户端下载了一个名为 10000011.amr的文件。如下图所示:

下载插件文件

尝试用wget将文件下载下来,发现其没有验证cookie,下载成功,命令如下:

1
wget http://download.alipay.com/mobilecsprod/alipay.mobile/20130601021432806/xlarge/10000011.amr

amr本意表示是一个音频文件,明显不对,尝试将其后缀名改成zip,成功将其解压。用itools连接上支付宝的客户端,同样能看到客户端将其下载后,也是解压到document目录下的。解压后的内容与应用内新增加的内容一致,如图所示:

分析文件内容

大概浏览了一下解压后的文件,主要包括html、css和js文件。可见支付宝的插件机器是通过UIWebView来展示内容的方式来实现的,那为什么要先下载安装这些内容而不通过UIWebView实时下载html呢?这主要应该是为了节省相应的流量。我看了一下,10000011.amr文件整个有将近1M大小,如果不通过插件机制预先下载,则只能依赖系统对于UIWebView的缓存来节省流量,这相对来说没有前者靠谱。

另外,使用基于UIWebView的方式来展示插件,也有利于代码的复用。因为这些逻辑都是用js来写的,可以同样应用于Android平台,在Config.js文件中,明显可以看到对于各类平台的判断逻辑。如下图所示:

另外,/www/demo/index-alipay-native.html 文件即该插件的首页,用浏览器打开就可以看到和手机端一样的内容。如下载图所示(左半边是手机上的应用截图,右半边是浏览器打开该html文件的截图):

插件的网络通讯

接下来感兴趣的是该插件是如何完成和支付宝后台的网络通讯的。可以想到有两种可能的方式:

  1. 直接和支付宝后台通讯
  2. 和Native端通讯,然后Native端和服务器通讯。

要验证这个需要读该插件的js源代码,整个js源码逻辑还是比较干净的,主要用了玉伯写的seajs做模块化加载,backbone.js是一个前端的MVC框架,zepto.js是一个更适合于移动端使用的”JQuery”。

大概扫了一下,感觉更可能是用的方法一:直接和支付宝后台通讯, 因为Config.js中都明确将网络通讯的地址写下来了。另一个证据是,利用下面的脚本扫描整个js源码,只能在backbone中搜到对于iframe的使用。而在iOS开发中,如果js端和native端要通讯,是需要用到iframe的,详细原理可以参见我的另一篇文章《关于UIWebView和PhoneGap的总结》。不过我不能完全确认,因为我还没有找到相应控制页面切换和跳转的js代码,如果你找到了,麻烦告诉我。

1
find . -type f -name "*.js" | xargs grep "iframe"

交易的安全

用Charles可以截取到,当有网络交易时,应用会另外启动一个https的安全链接,完成整个交易过程的加密。如下图所示:

总结

支付宝的插件机制整体上就是通过html和javascript方式实现的,主要的好处是:

  1. 跨平台(可以同时用在iOS和Android客户端)
  2. 省流量(不需要的插件不用下载,插件本地缓存长期存在不会过期,自己管理插件更新逻辑)
  3. 更新方便(不用每次提交AppStore审核)

坏处如果非要说有的话,就是用javascript写iOS界面,无法提供非常炫的UI交互以及利用到iOS的所有平台特性。不过象支付宝这种工具类应用,也不需要很复杂的UI交互效果。

另外教大家一个小技巧,如果你不确定某个页面是不是UIWebView做的,直接在那个页面长按,如果弹出”拷贝,定义,学习”这种菜单,那就是确定无疑是UIWebView的界面了。如下图所示:

相关工具

欢迎关注我的技术微博 @唐巧_boy 和微信公共账号 iOSDevTips ,每天收获一些关于iOS开发的学习资料和技巧心得。

我在研究时使用了Charles来截获支付宝客户端的网络请求,用iTools来查看支付宝客户端的本地内容。如果你想自行验证本文内容,请先下载上述工具。在此就不额外介绍它们的使用了。

后记(2013-7-7)

  1. 在完成上文后,Allen在他的博客上先后分享了两篇更深入分析的文章《浅析支付宝钱包插件》和 《再谈支付宝钱包插件和说好的 Demo》。 这两篇文章都比本文深入得多,值得大家阅读。

  2. 写完上文,居然收到了来自支付宝卫朴(花名)的工作邀请。不过我现在创业正在努力当中,所以我拒绝了邀请。看来这也是一种找工作的办法啊,比投简历管用,呵呵。

  3. 从一些朋友那儿了解到,支付宝因为本文而会在以后的版本中加强安全性,至少不会像现在这样,所有逻辑都在写在javascript中,并且还带有注释,这也是我希望看到的结果。愿支付宝越做越好。

目录
相关文章
|
5月前
|
资源调度 API 定位技术
钉钉这边连接器发起的的接口调用速度很慢
钉钉这边连接器发起的的接口调用速度很慢
57 1
|
2月前
|
移动开发 小程序 数据管理
9月开发者日回顾|小程序跳转接口等多个JSAPI更新,能力集成提供场景化排查工具
9月开发者日回顾|小程序跳转接口等多个JSAPI更新,能力集成提供场景化排查工具
27 0
|
6月前
|
编解码 前端开发 JavaScript
76分布式电商项目 - CAS 服务端界面改造
76分布式电商项目 - CAS 服务端界面改造
23 0
|
8月前
|
机器学习/深度学习 JavaScript 前端开发
2023最新之 教你如何使用Springboot集成支付宝沙箱支付(支持回调- 亲测有效)
2023最新之 教你如何使用Springboot集成支付宝沙箱支付
485 0
|
9月前
|
数据采集 数据库连接 API
获取第三方数据四种方式
减少开发人员逻辑处理。api将功能的逻辑在接口内部封装好,不需要开发人员在自行的编写逻辑
|
安全 5G API
使用手机在网状态查询 API 有效防止虚假注册的设计思路
随着移动互联网的普及,手机在网状态成为重要的数据指标。在网状态反映了手机用户的实际使用情况,对于各类企业和机构具有重要意义。 本文将为大家介绍手机在网状态 API 的主要特点和优势,并且探讨手机在网状态 API 的应用场景和效果展示,最后一起展望手机在网状态 API 的未来发展和应用前景。
102 0
|
存储 NoSQL 安全
api一键合约自动跟单带单app开发模式详情|源码二开模式定制|合约跟单规则定制分析
api一键合约自动跟单带单app开发模式详情|源码二开模式定制|合约跟单规则定制分析
|
小程序 前端开发 JavaScript
微信小程序中针对微信基础库新旧不同版本获取用户手机号的方法
微信小程序中针对微信基础库新旧不同版本获取用户手机号的方法
微信小程序中针对微信基础库新旧不同版本获取用户手机号的方法
|
小程序 开发者
微信小程序模板消息接口下线了,不用慌,调用统一服务消息接口来实现相同功能
做过微信开发的应该都有一点感触,就是他的开发文档不是一成不变的,接口有时候会被下线,但也不是一下子就不能用了,一般会兼容旧接口,然后提醒你使用新接口有更多好处。如果接口真的直接下线了,也会提供另一种能够实现相同功能的接口给你替换。所以有天你以为代码都写好了,没有bug了,悠哉悠哉的时候,忽然产品经理说微信的哪个接口不能用了,快去改一下,不要惊讶,老老实实去改就对了哈。
636 0
微信小程序模板消息接口下线了,不用慌,调用统一服务消息接口来实现相同功能
|
JSON 前端开发 安全
C#请求JavaAPI接口安全校验流程【线下系统定制】(精简版)
我始终相信,分享的越多收获的就越多!所以这里把我最近几天钻研的项目安全校验机制流程实现与细节分享给大家!
C#请求JavaAPI接口安全校验流程【线下系统定制】(精简版)

热门文章

最新文章