前段时间看到差评的公众号发了一篇文章《“支付宝碰一下”到底是个啥?》,轻蔑的喵了一眼,心想不就是 NFC 支付嘛,都几十年的老技术了,有啥好惊讶的。随便翻了一下内容,看到这句话不淡定了。
抱着好奇心,我认真看完了全文,然后我确实被支付宝的骚操作惊到了,搞出这个人的脑回路肯定不正常,但确实很巧妙。
过去十几年,移动支付在国内迅速普及,离不开支付宝和微信大力推广,大家都习惯了使用手机扫收款码或者出示付款码付款。而在此过程中,大家还是会有争论,就是扫码支付好,还是 NFC 支付好,这类话题在知乎上也有很多争论(为何扫码支付在中国流行,在发达国家被排斥?)。总结来说,NFC 支付需要 POS 机,申请门槛高,手续费高,这阻挡了它在移动支付时代在国内的普及,而扫描支付收费低,不需要昂贵的设备,所以迅速占领了国内的市场,同时也形成了国内扫码支付的格局。但!这些回答都有个共性,就是论支付的便利性,NFC 支付应该是最便捷的,最符合人类直观感受的,大家不需要打开支付 App ,出示付款码 or 扫一扫,只需要碰一下商家设备,就完成支付了。我想这也是支付宝推出“碰一下支付”的原因,主要还是为了便捷性。
支付宝推出“支付宝碰一下”完全是无奈之举,这其中原因主要还是苹果公司没有给第三方公司开放 NFC 权限,国内的 Apple pay 是和银联合作的,它只是在手机中模拟了一张银行卡,本质还是 POS 机模式。正如“差评”中说的那样“国内安卓和 iOS 两大系统活跃设备数大概二八开,分别有 9.5 亿和 2.6 亿用户。作为跨端的第三方支付,支付宝肯定得找一个 iOS 与安卓都能用的方案”。
那支付宝是如何解决兼容问题的,我根据“差评”文章中提到的内容,以及反编译支付宝 Android App ,得出了以下结论(不一定准确。在了解“支付宝碰一下”的原理之前,首先需要了解“扫码支付的方式”和 NFC 的三种主要操作模式。
无金额的收款码,这种类型就是我们去各种小商小贩消费,他们会提供一个收款码,我们扫描这个收款码,手动输入付款金额,然后输入密码付款。这种付款方式成本最低,打印一个收款码就行,但它有个很明显的弊端,只适合小本生意,因为你无法使用收银系统跟踪这些订单的类型,也就不知道这笔交易卖的是什么商品,后期也就无法分析相关数据去优化你的商业模式。
带金额的收款码。这个方式可能是最早的收款模式,但是随着移动支付的普及越来越被人忘记,它目前还在使用的场景就是 PC 浏览器支付了,通过生成带有金额的付款码,用户打开支付 App 扫描支付。
为什么要提扫码支付的方式呢?因为支付宝的“支付宝碰一下”本质是带金额的收款码,只不过之前我们是通过摄像头获取二维码的订单信息。比如上面的扫码支付,它本质是一个链接“https://qr.alipay.com/bavh4wjlxf12tper3a”,它是支付宝返回的 qr_code 。而“支付宝碰一下”是通过手机的 NFC 读取器模式获取付款链接,这就是支付宝的骚操作了,“支付宝碰一下”不是手机模拟 NFC 卡让收款设备去读取数据的传统模式,而是通过让收款设备模拟 NFC 卡,让手机开启 NFC 读卡模式读取收款设备上的信息。也就是说“支付宝碰一下”是伪 NFC 支付,为了兼容 iOS 设备,它不是传统的卡模式模式。
那么支付宝是如何实现这样一套伪 NFC 支付功能的呢?
有一种 NFC 芯片叫做动态 NFC 标签,它可以随时通过编程改变 NFC tag 中的信息内容。“支付宝碰一下”的那款设备本质就是一个 NFC Tag 生成器,收银机下发的带金额的收款二维码 qr_code 都会被这台设备转化为一条链接然后烧写到 NFC 动态芯片中,手机 NFC 读取 NFC 动态芯片的收款链接,唤醒支付宝支付。这也是为什么支付宝的这款设备可以兼容现有收银系统的原因。
先上结论,下面这个截图是我专门跑到一个配备了“支付宝碰一下”设备商家的店里,通过 NXP TagInfo App 读取到的信息。
iOS 在 NFC tag 这没有太多花花肠子,它是最简单的,手机 NFC 读取到 tag 中的 URI (对应上面信息中的第一条)唤醒“快应用”,快应用再唤醒支付宝 App ,然后跳转支付( [支付宝 NFC 支付丝滑体验] )。当然,这其中会出现一个问题,就是在 iOS 的设备上,如果有人发了那条收款链接,是可以直接唤醒支付宝,即使没有通过 NFC 。当然,我不确定支付宝在 iOS 有没有做保护措施判断链接是来自什么途径,不然的话,开启了“碰一下“极速模式的话,有个人给你发了这条链接,你点了就付款出去了。
Android 麻烦许多,但 Android 也会避免 iOS 上出现无法判断链接来源的问题,因为 Android 有一套 Android Application Record (AAR)标签系统。当手机 NFC 读取到对应的 NFC Tag 时,它可以直接唤醒跳转到指定的 Android App ,详细内容可以查看 Android NFC API。这也是为什么“支付宝碰一下”在 Android 使用更便捷的原因。通过反编译支付宝的 APP ,查看 AndroidManifest.xml 文件,我们可以看到,根据 NFC Tag 中的 Record #2 ,它唤醒了包名为 com.eg.android.AlipayGphone (支付宝包名),同时携带的 URI data 满足第四条的规则,随后它会唤醒支付宝的 SchemeLauncherActivity 的界面处理 data 。
只有通过手机 NFC 读取到的链接,才会跳转到付款界面,不然会报错。
通过反编译代码我们也可以看到,支付宝有判断链接来源。
判断 Intent 的 action 来源确定是否是 NFC 。
链接中的信息解读:
scheme decode 后为:alipay://nfc/app?id=20002123&appScheme=NFC_PAY_APP&pageParams=%7B%22k%22%3A%220bc141253ld7rnmlllee1af_n%22%7D
pageParams decode 后为:{"k":"0bc141253ld7rnmlllee1af_n"}
“支付宝碰一下”设备主要传递的信息就是这个 json 的 k 值,它其实就是和摄像头扫描付款码获取到的信息是一样的。
在看完支付宝 Android App 处理“支付宝碰一下”整个流程的代码之后,我发现发送到支付宝后端唯一有效的值就是通过"_"截断的 k 值,也就是这么一串"0bc141253ld7rnmlllee1af"值。
所以我猜“支付宝碰一下”的设备是不是就是通过把 qr_code 链接中的“https://qr.alipay.com/bavh4wjlxf12tper3a”, prefix+'_n'直接写入到动态 NFC 芯片中了。所以我尝试去模拟一下这个过程,我买来了最便宜的 NFC NDEF 芯片。
随后我通过支付宝开放平台当面付的扫码支付的接口 alipay.trade.precreate 来从支付宝后端获取 qr_code ,将其拼接为完整的“支付宝碰一下”nfc link ,最后通过 NXP 的 TagWriter App 写入信息。
结论:模拟失败,我猜支付宝那个“碰一下设备”还是做了一层中转的,它应该是吧 qr_code 再去转换了一下,兼容现有收银系统的同时,也防止我这种人直接把设备破解了。
当我剖析了“支付宝碰一下”的原理,为支付宝为了兼容苹果手机而想到这么一个骚操作感到惊讶地时候,我看到一条这样的消息《为避免巨额罚单,苹果向第三方开放 NFC 支付》。
苹果又双叒叕一次向欧盟低头了。当地时间 7 月 11 日,欧盟委员会方面宣布已与苹果公司达成和解协议,后者承诺向竞争对手免费开放基于近场通信( NFC )技术的移动支付功能,并且相关承诺将持续 10 年,适用于整个欧洲经济区。这将是苹果史上第一次向第三方开放 NFC 支付,继此前的第三方应用商店、第三方支付渠道之后,苹果 “围墙花园” 仅存的篱笆又一次被推倒。
也就是说,支付宝为了规避苹果公司不给第三方提供 NFC 接口功能,而绞尽脑汁搞出来这么一个伪 NFC 支付功能,还专门设计了一台收款设备,现在因为苹果公司要开放 NFC 功能给第三方,完完全全泡汤了。这不是 49 年入国军的行为嘛!他们还要花大力气去推广这个设备,到时苹果开放了 NFC 功能,能够实现真 NFC 支付的话,这些设备不就成电子垃圾了?我看市场报价这台设备 1800 元,不是纯纯的坑商家行为吗?
但是,当我看到反编译的支付宝 APP ,支付宝其实把 NFC 那几种模式都集合起来了,我想事情并没有那么简单。试想一下,当苹果开放了其 NFC 功能给第三方之后,所有公司做的第一件事是什么?没错,尽量让自己公司的 APP 适配实现 NFC 支付功能,但还存在另外一个问题,你的 APP 有 NFC 支付方式,但商家有 NFC 收款设备吗?现在大大小小的商家收银系统都是围绕扫描支付做的,它们并没有 NFC 收款功能( POS 机除外)。
结论:支付宝现在推这么一个 NFC 伪支付功能和设备,他们主要是想打一个时间差,在苹果给第三方开放 NFC 功能之前,先把 NFC 收款设备普及出去!因为那台现在可以动态生成 NFC Tag 的伪 NFC 支付收款设备,它是联网的,它可以随时更新系统和软件实现真 NFC 收款功能。等微信支付这些竞争对手实现 NFC 支付功能之后,它们要推收款设备的时候会发现商家都用上了支付宝的设备,支付宝会给你兼容?还是你让商家又摆几个设备上去?同时支付宝现在就培养用户使用“碰一下支付”的习惯,让用先入为主,后期其它三方公司想要改变用户习惯,还要普及收款设备,阻力可不小!
思考:前面提到 Android 目前有三种 NFC 功能,“支付宝碰一下”使用了最简单的第一种,Apple Pay 和各种 Android 手机厂商的各种 Pay 使用的都是第三种卡模拟模式。如果后期支付宝和微信实现真 NFC 支付功能,他们会选择哪种呢?是目前主流的卡模拟模式( POS 机模式),还是使用第二种点对点通信,我猜支付宝肯定不会选择卡模拟模式( POS 机模式)。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.