V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lyonlui
V2EX  ›  程序员

支付宝推出“支付宝碰一下”支付,本以为是 49 年入国军,但感觉他们可能想的更远

  •  2
     
  •   lyonlui · 121 天前 · 930 次点击
    这是一个创建于 121 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    前段时间看到差评的公众号发了一篇文章《“支付宝碰一下”到底是个啥?》,轻蔑的喵了一眼,心想不就是 NFC 支付嘛,都几十年的老技术了,有啥好惊讶的。随便翻了一下内容,看到这句话不淡定了。

    差评文章

    抱着好奇心,我认真看完了全文,然后我确实被支付宝的骚操作惊到了,搞出这个人的脑回路肯定不正常,但确实很巧妙。

    “支付宝碰一下”

    过去十几年,移动支付在国内迅速普及,离不开支付宝和微信大力推广,大家都习惯了使用手机扫收款码或者出示付款码付款。而在此过程中,大家还是会有争论,就是扫码支付好,还是 NFC 支付好,这类话题在知乎上也有很多争论(为何扫码支付在中国流行,在发达国家被排斥?)。总结来说,NFC 支付需要 POS 机,申请门槛高,手续费高,这阻挡了它在移动支付时代在国内的普及,而扫描支付收费低,不需要昂贵的设备,所以迅速占领了国内的市场,同时也形成了国内扫码支付的格局。但!这些回答都有个共性,就是论支付的便利性,NFC 支付应该是最便捷的,最符合人类直观感受的,大家不需要打开支付 app ,出示付款码 or 扫一扫,只需要碰一下商家设备,就完成支付了。我想这也是支付宝推出“碰一下支付”的原因,主要还是为了便捷性。

    “支付宝碰一下”原理

    支付宝推出“支付宝碰一下”完全是无奈之举,这其中原因主要还是苹果公司没有给第三方公司开放 NFC 权限,国内的 Apple pay 是和银联合作的,它只是在手机中模拟了一张银行卡,本质还是 POS 机模式。正如“差评”中说的那样“国内安卓和 iOS 两大系统活跃设备数大概二八开,分别有 9.5 亿和 2.6 亿用户。作为跨端的第三方支付,支付宝肯定得找一个 iOS 与安卓都能用的方案”

    那支付宝是如何解决兼容问题的,我根据“差评”文章中提到的内容,以及反编译支付宝 Android app ,得出了以下结论(不一定准确。

    在了解“支付宝碰一下”的原理之前,首先需要了解“扫码支付的方式”和 NFC 的三种主要操作模式。

    扫码支付的方式

    1. 付款码支付(商家扫用户付款码)。这种类型是目前有一定规模商家用的最多的方式,不同于用户主动扫码,这种方式是用户出示自己的付款码,由商家确定金额,通过扫描枪扫描用户的付款凭证。这种方式同样十分便捷,而且收银系统的成本很低,也能轻易跟踪订单的内容,退款也容易。

    1. 扫码支付(用户扫商家二维码)。这种方式分为两种。

    无金额的收款码,这种类型就是我们去各种小商小贩消费,他们会提供一个收款码,我们扫描这个收款码,手动输入付款金额,然后输入密码付款。这种付款方式成本最低,打印一个收款码就行,但它有个很明显的弊端,只适合小本生意,因为你无法使用收银系统跟踪这些订单的类型,也就不知道这笔交易卖的是什么商品,后期也就无法分析相关数据去优化你的商业模式。

    带金额的收款码。这个方式可能是最早的收款模式,但是随着移动支付的普及越来越被人忘记,它目前还在使用的场景就是 PC 浏览器支付了,通过生成带有金额的付款码,用户打开支付 App 扫描支付。

    携带订单信息的收款码

    具有 NFC 功能的 Android 设备三种操作模式

    • 读取器/写入器模式,允许 NFC 设备读取和写入被动 NFC 标签和贴纸。
    • 点对点模式,允许 NFC 设备与其他 NFC 对等设备交换数据; Android Beam 使用此操作模式。
    • 卡模拟模式,允许 NFC 设备本身充当 NFC 卡。然后,可通过外部 NFC 读取器(例如 NFC 销售终端)访问模拟 NFC 卡。

    为什么要提扫码支付的方式呢?因为支付宝的“支付宝碰一下”本质是带金额的收款码,只不过之前我们是通过摄像头获取二维码的订单信息。比如上面的扫码支付,它本质是一个链接“https://qr.alipay.com/bavh4wjlxf12tper3a”,它是支付宝返回的 qr_code 。而“支付宝碰一下”是通过手机的 NFC 读取器模式获取付款链接,这就是支付宝的骚操作了,“支付宝碰一下”不是手机模拟 NFC 卡让收款设备去读取数据的传统模式,而是通过让收款设备模拟 NFC 卡,让手机开启 NFC 读卡模式读取收款设备上的信息。也就是说“支付宝碰一下”是伪 NFC 支付,为了兼容 iOS 设备,它不是传统的卡模拟模式。

    那么支付宝是如何实现这样一套伪 NFC 支付功能的呢?

    NFC 动态标签

    有一种 NFC 芯片叫做动态 NFC 标签,它可以随时通过编程改变 NFC Tag 中的信息内容。“支付宝碰一下”的那款设备本质就是一个 NFC Tag 生成器,收银机下发的带金额的收款二维码 qr_code 都会被这台设备转化为一条链接然后烧写到 NFC 动态芯片中,手机 NFC 读取 NFC 动态芯片的收款链接,唤醒支付宝支付。这也是为什么支付宝的这款设备可以兼容现有收银系统的原因。

    iOS 和 Android 的唤醒原理

    先上结论,下面这个截图是我专门跑到一个配备了“支付宝碰一下”设备商家的店里,通过 NXP TagInfo App 读取到的信息。

    iOS 在 NFC tag 这没有太多花花肠子,它是最简单的,手机 NFC 读取到 tag 中的 URI (对应上面信息中的第一条)唤醒“快应用”,快应用再唤醒支付宝 App ,然后跳转支付( [支付宝 NFC 支付丝滑体验] )。当然,这其中会出现一个问题,就是在 iOS 的设备上,如果有人发了那条收款链接,是可以直接唤醒支付宝,即使没有通过 NFC 。当然,我不确定支付宝在 iOS 有没有做保护措施判断链接是来自什么途径,不然的话,开启了“碰一下“极速模式的话,有个人给你发了这条链接,你点了就付款出去了。

    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 。

    链接中的信息解读:

    原链接:https://render.alipay.com/p/s/ulink/?scene=nfc&scheme=alipay%3A%2F%2Fnfc%2Fapp%3Fid%3D20002123%26appScheme%3DNFC_PAY_APP%26pageParams%3D%257B%2522k%2522%253A%25220bc141253ld7rnmlllee1af_n%2522%257D

    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 值,它其实就是和摄像头扫描付款码获取到的信息是一样的。

    处理 pageParams 的代码

    尝试模拟“支付宝碰一下”

    在看完支付宝 Android App 处理“支付宝碰一下”整个流程的代码之后,我发现发送到支付宝后端唯一有效的值就是通过"_"截断的 k 值,也就是这么一串"0bc141253ld7rnmlllee1af"值。 RPC 远程调用唯一传递的有效参数就是这个 token

    支付宝 app 日志打印的内容

    所以我猜“支付宝碰一下”的设备是不是就是通过把 qr_code 链接中的“https://qr.alipay.com/bavh4wjlxf12tper3a”,prefix+'_n'直接写入到动态 NFC 芯片中了。所以我尝试去模拟一下这个过程,我买来了最便宜的 NFC NDEF 芯片。 几毛钱一个的 NFC Tag

    随后我通过支付宝开放平台当面付的扫码支付的接口 alipay.trade.precreate 来从支付宝后端获取 qr_code ,将其拼接为完整的“支付宝碰一下”nfc link ,最后通过 NXP 的 TagWriter App 写入信息。 先后创建“启动应用”和“链接” 内容是支付宝报名和上面提到的链接

    结论:模拟失败,我猜支付宝那个“碰一下设备”还是做了一层中转的,它应该是吧 qr_code 再去转换了一下,兼容现有收银系统的同时,也防止我这种人直接把设备破解了。 模拟失败 场景凭证无效

    为何认为是 49 年入国军行为

    当我剖析了“支付宝碰一下”的原理,为支付宝为了兼容苹果手机而想到这么一个骚操作感到惊讶地时候,我看到一条这样的消息《为避免巨额罚单,苹果向第三方开放 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 机模式)。

    第 1 条附言  ·  120 天前
    有“支付宝碰一下”这个设备的人吗?
    4 条回复
    lyonlui
        1
    lyonlui  
    OP
       120 天前
    有“支付宝碰一下”这个设备的人吗?
    lyonlui
        2
    lyonlui  
    OP
       114 天前
    文章中猜测的流程是错的 😅 ,“碰一下支付”应该属于第一种条码支付,之前考虑的逻辑是错的。要兼容现有市面上的收银设备,唯一的解决方案就是让“碰一下支付”的设备伪装成扫码枪,单纯的作为一个键盘输入设备,而不是我之前猜想的那样需要收银机下发信息到“碰一下支付”的设备。真正的流程应该是下图。

    https://s3.bmp.ovh/imgs/2024/08/02/2b2a1c87e70dd1bd.jpg
    lyonlui
        3
    lyonlui  
    OP
       103 天前
    上文中经过分析,正文中提到的判断链接来源的安全问题上,除了 Android 支付宝在两个手机平台上都实现了安全的验证,完整的验证逻辑暂时没能分析出来,作者猜想大部分是在云端进行的,后来也找了一些支付宝泄露出来的风控机制的一些报道和文章,可以确认的是这个验证设计得很复杂且有效的。

    这几年互联网的创新产品已经比较少了,楼主对这些一直很感兴趣,因此也花了很多时间对支付宝新出的这个“碰一下支付”来进行分析,在过程中也学习收获很多,不得不讲作为大厂支付宝还是很有实力的,期待它后面的市场反响。
    jeesk
        4
    jeesk  
       48 天前
    最近看了同事的苹果手机能够碰一碰交换名片, 以前用苹果手机的时候竟然没有发现,今天研究发现 android nfc 其实也支持点对点 , 但是看了文档后发现 android nfc 点对点被遗弃了, 连 api 都删除了。 谷歌真的狗。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2802 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:16 · PVG 08:16 · LAX 16:16 · JFK 19:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.