浅析支付宝钱包插件

简介: 国内私募机构九鼎控股打造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://imallen.com/blog/2013/06/26/inside-alipay-plugin.html


昨天看到唐巧分析了支付宝钱包插件的实现原理,今天也趁热打铁研究了一下支付宝插件的结构和代码,很多时候逆向思考也可以为自己积累很多有用的经验(即便实际实现方式和自己所想有出入)。

承接唐巧的上文,本文同样以彩票插件为例,如果你没有下载该插件的压缩包,用如下命令下载。

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

并改为 zip 后缀,解压。

根目录根目录

  • CERT:内容为各文件的特征值,特征值可以是重复 hash 和 salt 多次后 base64 的结果,解压插件后支付宝理应检查文件特征值以确定来源可靠
  • Manifest.xml:插件的描述文件,都有注释,易懂,其中定义了业务包 ID、名称、介绍、版本等信息,也定义了版本兼容性、能力集、依赖关系、入口文件等

resres

  • res:资源文件,仅有图标,奇怪的是代表 Android 尺寸的目录下没有文件,可能因为唐巧抓的包是 iOS 的?

wwwwww

  • www:前端代码,目录结构跟一般 Web 开发相似,其中 demo 下是 HTML 代码

demodemo

  • demo:HTML 代码,子目录都是拼音缩写,比如 ssq 代表双色球,根据 Manifest.xml 描述,index-alipay-native.html 为插件入口页面

cpcp

唐巧打开 index-alipay-native.html 给大家看过了,你会发现 Cells 都是不能点的,因为页面尚未初始化,代码中可以看到形似 <a rel="ssq/ssqbet.html"> 的代码。显然这代表双色球的子页面,我简单猜测一下用 rel 的原因:

首先,点击 Cell 在客户端触发的必然是 Native 的 pushViewController:,用 href 同样可以通过webView:shouldStartLoadWithRequest:navigationType: 触发,但这样会在某些意外情况下造成点击后页面直接跳转。此外如果最终是用形如 push://10000011/ssq/ssqbet.html 的协议来实现 Native 跳转,用 rel 再注入 JS 处理可以防止客户端逻辑的显式暴露(如长按、拷贝,曾经的新浪微博客户端长按评论可以看到类似 comment:// 的协议,不见得有多大危害,但是值得避免)

页面底部有如下代码:

1
2
3
4
5
6
7
8
9
10
11
    //配置时间戳,解决浏览器或者webview cache问题
    seajs.config({
        map: [
            [ /^(.*\.(?:css|js))(.*)$/i, '$1?000021']
        ]
    });
  function onDeviceReady(){
      seajs.use('../js/appnav/nav',function(Nav){
          Nav.initialize();
      });
  }

略懂前端开发的话,果断猜测 onDeviceReady() 是在页面加载完毕后,由设备调用的初始化方法,于是尝试在 Console 中输入onDeviceReady() 执行,点击 Cell,报错如下:

onDeviceReadyonDeviceReady

跟到 nav.js 里可以看到是在 pushWindow 中报错的,错误为 alipay 未定义,粗略判断 alipay 为客户端注入的变量,这里看到的调用形如 alipay.navigation.pushWindow(obj.attr('rel')) 用到了上述 rel 属性,最终应该会触发客户端类似 [self pushWebControllerWithURL:url] 的代码来推入下一个 VC,这位我们最终尝试实现能跑这个插件的 Demo 提供了一些思路。

用 onDeviceReady 可以完成大部分页面的初始化工作,如 ssq/ssqbet.html,在浏览器里也能响应下拉机选操作,你会发现,这些插件的屏幕尺寸兼容性和浏览器兼容性极佳:

ssqbetssqbet

再如 jczq/jczqmatch.html,甚至可以读到场次数据并完成数据初始化了

jczqjczq

在这里我们又发现了两个有意思的信息,它们被写在 meta 信息里,根据字面,很容易理解,它们分别定义了 navigationBar 的title 和 rightBarButtonItem,以及点击 rightBarButtonItem 触发的 JS 函数。此时你如果比对着使用客户端就知道这个筛选对应着怎样的表现和交互,这些都为我们写 Demo 提供了线索。

尝试在 Console 输入 rightBar(不带括号)查看其定义,又能得到很多有用的线索,比如点击 rightBarButtonItem 触发的是推入filterpage,这个 filterpage 则是在 js/jczq/jczqmatch.js 中定义的。

jczqjczq

此外,结合 jczqfilter.html 的内容和 rightBar 函数,可以看到主页面利用 HTML5 的 localStorage 为 filter 页面提供了数据(这为纠结于 UIWebView 如何给 push 进来的下一个 View 提供数据的我,提供了很好的思路,值得借鉴)

1
    localStorage.setItem('__tbcp__filter', JSON.stringify(obj))

不知不觉写了 2 个多小时了,发现通过文字表达出来要比分析本身还费时。不过,至此,支付宝插件的大体框架已经比较清晰了,和 Native Code 的交互方式、数据传递方式也有了一定的思路。

接下来的几天我会尝试写一个 Demo 让这样一个插件基本能跑起来(除了核心的下单、支付环节,这显然不是我力所能及的)。跟着我的分析,相信读者对 WebView + Native Code 的混合编程模式应该也有了一些新的认识。

希望我有足够的动力和时间写 Demo,因为这个 Demo 可以帮助大家更清楚地理解支付宝插件中用到的 WebView + Native Code 的 Hybrid 开发方式。


目录
相关文章
|
存储 分布式计算 Hadoop
大数据处理架构Hadoop
【4月更文挑战第10天】Hadoop是开源的分布式计算框架,核心包括MapReduce和HDFS,用于海量数据的存储和计算。具备高可靠性、高扩展性、高效率和低成本优势,但存在低延迟访问、小文件存储和多用户写入等问题。运行模式有单机、伪分布式和分布式。NameNode管理文件系统,DataNode存储数据并处理请求。Hadoop为大数据处理提供高效可靠的解决方案。
438 2
|
10月前
|
人工智能 搜索推荐 安全
听悟 + 魔笔,定制你的企业智能会议系统
本文介绍了基于阿里云魔笔平台的企业智能会议系统搭建方案。通过整合通义听悟的强大AI能力,该系统可实现音频视频处理、自动记录、实时翻译等功能,满足个性化定制、数据安全与高效集成的需求。
|
10月前
|
NoSQL 关系型数据库 MongoDB
接口管理工具深度对比:Apipost与Apifox在Redis/MongoDB支持上的关键差异
近期在团队工具选型时,系统对比了Apifox和Apipost两款接口管理工具,我们的体会是:Apipost适合需要同时管理多种数据库的中大型项目,特别是涉及Redis/MongoDB等非关系型数据库的场景,Apifox仅建议在纯关系型数据库架构且预算有限的小型项目中短期使用。
353 3
|
11月前
|
图形学
Unity 秒表的实现
在Unity中实现秒表功能,核心是利用Time.deltaTime记录每帧经过的时间。第一种方法通过Update函数每帧累加时间并更新UI显示;第二种方法使用协程IEnumerator,在固定更新间隔内累加时间,适合更精确的时间控制。两种方法均包含小时、分钟、秒和毫秒的计算与显示。 示例代码展示了如何创建Text组件并实时更新秒表的时间格式。第一种方法简单直接,适用于大多数场景;第二种方法通过协程提供更灵活的时间管理,适合需要暂停或复杂逻辑控制的场景。
|
数据采集 JSON JavaScript
如何通过PHP爬虫模拟表单提交,抓取隐藏数据
本文介绍了如何使用PHP模拟表单提交并结合代理IP技术抓取京东商品的实时名称和价格,特别是在电商大促期间的数据采集需求。通过cURL发送POST请求,设置User-Agent和Cookie,使用代理IP绕过限制,解析返回数据,展示了完整代码示例。
296 3
如何通过PHP爬虫模拟表单提交,抓取隐藏数据
提升个人工作技能
提升个人工作技能
1307 6
|
存储 人工智能 缓存
AI助理直击要害,从繁复中提炼精华——使用CDN加速访问OSS存储的图片
本案例介绍如何利用AI助理快速实现OSS存储的图片接入CDN,以加速图片访问。通过AI助理提炼关键操作步骤,避免在复杂文档中寻找解决方案。主要步骤包括开通CDN、添加加速域名、配置CNAME等。实测显示,接入CDN后图片加载时间显著缩短,验证了加速效果。此方法大幅提高了操作效率,降低了学习成本。
5927 16
|
存储 缓存 负载均衡
cdn是什么
cdn是什么
2006 2
|
数据可视化 数据挖掘 Python
数据可视化不再难!Matplotlib带你轻松绘制精美图表,让数据分析焕发光彩!
【8月更文挑战第22天】今天分享如何用Python的Matplotlib库绘制多样图表。Matplotlib是数据可视化的强大工具,对数据分析至关重要。本文分六部分:首先介绍环境准备,包括安装和配置;随后通过四个案例演示折线图、柱状图、饼图及散点图的绘制方法;最后总结并鼓励大家进一步探索Matplotlib的丰富功能。跟着示例操作,你将学会基本图表的制作,提升数据展示技能。
277 0
|
存储 数据采集 机器学习/深度学习
大数据基础:收集、处理与分析
【5月更文挑战第30天】本文探讨了大数据的基本概念、关键技术及应用案例。大数据是海量、多源、快速处理的数据集合,涉及数据采集、存储、处理和分析。关键技术包括使用Flume进行数据采集、Hadoop HDFS和NoSQL数据库存储数据、MapReduce和Spark进行批处理、以及Python的pandas和scikit-learn进行数据分析。应用案例涵盖了金融风控、医疗健康和智能交通等领域,展示大数据在风险评估、疾病诊断和交通管理等方面的潜力。随着技术发展,大数据将在更多领域发挥作用。
525 3