浅析支付宝钱包插件

国内私募机构九鼎控股打造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、名称、介绍、版本等信息,也定义了版本兼容性、能力集、依赖关系、入口文件等

res

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

www

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

demo

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

cp

唐巧打开 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,报错如下:

onDeviceReady

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

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

ssqbet

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

jczq

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

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

jczq

此外,结合 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 开发方式。

时间: 2024-11-03 22:14:58

浅析支付宝钱包插件的相关文章

支付宝钱包流量电量优化实践

, 刘富康:阿里巴巴支付宝钱包开发工程师,经历并参与了支付宝钱包客户端框架1.0到3.0的演进,对客户端框架和动态加载技术有深刻理解.目前正在负责支付宝钱包监控体系搭建工作. 重点介绍支付宝钱包客户端基于客户端监控体系上,针对流量电量进行专项优化的实践经验.涉及监控日志采集.关键场景分析,流量熔断等内容.以下来分享精彩内容. 平台型移动客户端之痛   平台型移动客户端资源有限,包括它的cpu,它的内存,它的流量,它的电量等,在这样一个资源受限的设备上运行应用时环境是非常复杂的.   对于andr

支付宝钱包开通QQ会员怎么用

  据我的经验得出结论,用支付宝钱包开通QQ会员是比较优惠.比较方便快捷的.其实用QQ钱包可以开通很多QQ方面的业务,比如:充值Q币Q点.开通QQ绿钻.开通QQ黑钻.开通炫舞紫钻.开通黄钻贵族.开通黄钻豪华.开通超级会员.开通音速紫钻.开通CF会员.开通QQ堂紫钻.开通QQ红钻.开通QQ蓝钻,等等.在这里分享一篇用支付宝钱包开通QQ会员的经验,希望这篇经验起到举一反三的效果. 登录支付宝钱包 选择更多 选择游戏充值 选择Q币充值 点"Q币"选择"QQ会员" 点数量后

支付宝钱包在电脑端修改登录名绑定手机号码

  1.打开www.alipay.com,点击[登录框右上角二维码区域]; 2.提示[扫码登录],展示二维码; 3.登录支付宝钱包,点击[二维码标志]进入扫码页面,扫描电脑端展示的[扫描登录二维码]; 4.完成扫码提示[扫码成功],请立即点击支付宝钱包页面的[我确认登录支付宝网页],完成登录; 温馨提示:[扫描成功]10分钟内未完成[我确认登录支付宝网页],本次扫码失效需要重新扫码. 5.提示[已确认],用户登录成功. 扫码登录成功后,修改手机号码流程如下: 1.登录支付宝,点击[账户设置]--

支付宝钱包地铁票怎么购买?

  支付宝钱包地铁票怎么买?小编将在下文介绍支付宝钱包购买地铁票方法,支付宝钱包越来越亲密,实用功能也越来越多,那么如何使用它来购买地铁票呢?请看下文吧. 9月22日是世界无车日,此前,支付宝钱包联合杭州地铁在9月19日-21日向杭州的私家车主免费发放9000张电子地铁票,私家车主可以在支付宝钱包的"杭州地铁无车日"服务窗中领取电子地铁票.凭行驶证和电子地铁票在地铁站兑换实体票,可以免费乘坐杭州地铁. 据介绍,这是杭州地铁在O2O上的首次尝试.而此次电子地铁票的发送活动则预示着支付宝将

支付宝钱包如何转账到银行卡

  支付宝给银行卡直接转账的功能很便捷,不需要开通网银,现在还可以通过手机支付宝钱包给他人银行卡转账.给他人转账也从最初的银行转到银行网银转账,但是银行网银转账操作也能很麻烦,要开通网银,而且还要数字证书才可以的,但是有了支付宝就方便多了,就算没开通网银也可以给国内各大银行卡直接转账的,不仅电脑可以转账了,手机支付宝钱包也可以直接转账,快捷方便易操作.并且手机支付宝转账真正做到了便捷现在就来教下大家怎么使用手机支付宝钱包给银行卡转账吧. 打开你的支付宝钱包 进入支付宝钱包 点击"转账"

支付宝钱包和支付宝有什么区别?

  什么是支付宝?支付宝是一个国内领先的独立第三方网络支付平台,是阿里巴巴公司开发组建的,可以将存款转入支付宝内,然后在网上购物时,用来支付货款的一个工具.2013年8月,用户使用支付宝付款不用再捆绑信用卡或者储蓄卡,能够直接透支消费,额度最高5000元. 支付宝 什么是支付宝钱包?支付宝钱包是2013年阿里巴巴公司开发的一个功能,是国内领先的移动支付平台,隶属于支付宝,支付宝钱包可以用来还信用卡.缴费.充话费.转账.付款.收款.卡券管理,还可以用余额宝理财,是一个非常好的功能软件. 支付宝钱包

支付宝钱包新增无忧停车功能

  支付宝钱包已经和第三方服务商"无忧停车"合作,在北京正式展开"智能停车"项目试点.目前清华科技园.北京人民医院.世茂百货3个停车场已经实现了通过高清摄像头识别车牌号.支付宝钱包公众号自动计费并交费的"不停车通行"体验. 汽车在车库入口时,高清摄像头会自动识别车牌号并放行.取车前,车主只要关注支付宝钱包中的无忧停车公众服务号,并在公众号中绑定自己的车牌号,系统就会自动发送包括停车场名字.停车时间和车费信息在内的缴费页面,车主可以直接在公众号中缴

iOS中 支付宝钱包详解/第三方支付

版权声明:本文为博主原创文章,未经博主允许不得转载. 每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 一.在app中成功完成支付宝支付的过程   1.申请支付宝钱包.参考网址:  https://b.alipay.com/order/productDetail.htm?productId=2014110308141993&tabId=4#ps-tabinfo-hash      这是使用支付宝支付的第一步,合作申请通过之后,会集成一个开发文件.即使不申请也可

支付宝钱包北京试点收停车费 自动计费可实现“不停车通行”

支付宝钱包收停车费新浪科技讯 支付宝钱包已经和第三方服务商"无忧停车"合作,在北京正式展开"智能停车"项目试点.目前清华科技园.北京人民医院.世茂百货3个停车场已经实现了通过高清摄像头识别车牌号.支付宝钱包公众号自动计费并交费的"不停车通行"体验.汽车在车库入口时,高清摄像头会自动识别车牌号并放行.取车前,车主只要关注支付宝钱包中的无忧停车公众服务号,并在公众号中绑定自己的车牌号,系统 就会自动发送包括停车场名字.停车时间和车费信息在内的缴费页面