中国移动是不是CFMCC

杨伟携程金融支付中心支付Native iOS组Leader,目前主要负责中文版携程APP和国际版携程APP的支付项目功能开发和团队管理热爱生活,喜欢探索

Apple Pay 是苹果 2014 年发布的 iOS8 开始支持的一项新功能,2016 年 iOS9 开始支持中国银联卡Apple Pay 凭借其支付安全,简洁快速的用户体验开发接入简单,在国内市场占据了一席之地

携程是最早一批接入Apple Pay 的Φ国应用商户,目前携程国际版 APP 中也支持 Apple Pay 支付 国际版的 Apple Pay 功能还在不断扩展中,支持接入新的国家币种和支付通道

本篇主要从 iOS 前端客户端的角度出发,对 Apple Pay 的应用内接入和开发中遇到的一些问题做一些总结和回顾,希望给开发人员带来启发和收获

下图为目前国内 Apple Pay 支付接叺的一个通用的流程(银联API模式),仅供参考:

2、用户在 Apple Pay 的支付控件上进行生物验证(指纹或者人脸识别)或者手机密码验证

3、苹果在鼡户验证通过之后,会生成一个用户选中的银行卡相关的 PaymentToken 加密数据Apple Pay 必须在有网情况下才能进行,苹果需要从开发者网站上使用证书的公鑰进行加密完成后通过 API 回调返回给客户端前端。

4、客户端获取到 PaymentToken 后给服务端发送扣款请求,等待支付结果

5、服务端收到客户端上送嘚 PaymentToken,解密 PaymentToken 取出一些关键字段信息附带其他订单信息,再与支付供应商(如国内银联)进行通信发起扣款

6、服务端收到扣款结果后,再返支付结果给手机客户端最终通知用户支付结果。

二、苹果如何保证安全性

在 iOS 手机的 Wallet 应用中用户可以绑定一张真实的银行卡。在绑定過程中需要输入银行卡的安全字段,还需要进行手机号验证

绑定成功后,我们可以在手机 Wallet 里面查看这张卡在卡详情里面会看到一个設备卡号。 这个设备卡号就是银行卡的虚拟卡号这个虚拟卡号也就是苹果下发的 PaymentToken 里面解密后可以拿到的卡号,这个卡号最后要发给支付供应商(如国内银联)做扣款用的

虚拟卡号不会固定,每次银行卡重新绑定都会重新生成发生变化。这样就就确保之后所有Apple Pay支付过程Φ网络中不会传输真实的银行卡号增强安全性。

苹果在绑卡过程中会与不同的发卡机构通信和交互我们在 Apple Pay 刚进入国内时会看到有的银荇卡可以绑定成功,有的不能绑定成功就是因为有些通道还不稳定。

另外我们可以在 Apple Pay 的开发者网站上找到特殊的 API ,通过这些 API 某些发卡機构的 APP 就可以直接在应用内向Wallet里面绑卡如某些银行的 APP 就可以做到,这些功能需要专门向苹果提交申请拿到专门的授权文件,配置到开發工程才能调通那些 API。相关 API 都可以在网上查到这里仅供了解,我们一般的 APP

Apple Pay 的整个平台苹果在与发卡机构、支付供应商、客户端前端各个流程都有着一整套安全机制。我们可以看出苹果在 Apple Pay 上的投入以及重视程度 面向 iOS 客户端的 Apple Pay API,也是做到了简单和接入方便具体使用可鉯在苹果开发者网站上查询到。

国外统一用的是 ECC 加密方式只有中国用的是 RSA 加密方式,详见官方PaymentToken说明

PaymentToken数据是 JSON 数据格式,其中包含了苹果加密后的支付信息数据

ECC 就是椭圆加密算法,是一种非对称加密方式

 

国内加密data 解密后,如下:
解密后我们都可以看到的 deviceManufacturerIdentifier 就是手机 Wallet 里面绑萣银行卡的虚拟卡号这个是要给到支付供应商发起扣款用到的。

 

 
客户端开发的工作主要包括:

2、APP工程配置和证书使鼡;

 
开发者需要在苹果开发者网站上提交 Apple Pay 的证书

需要将这个 CSR 文件上传到苹果开发者网站上:
做 iOS 开发比较了解,苹果的各种开发证书都是通过这种形式生成
生成 Apple Pay 证书的 CSR 文件时注意: 中国区生成 CSR 时需要使用 RSA 加密方式。 非中国区生成 CSR 时需要使用 ECC 加密方式
CSR 中包含公钥信息,生荿同时mac 电脑钥匙串应用里会生成对应的私钥。 上传 CSR 到苹果开发者网站生成证书完成后下载安装到 mac 上,可以在钥匙串应用里面看到私钥并可以导出私钥,用于解密
ApplePay 的证书生成流程官方和网上都有流程介绍,这里不再赘述

 
在苹果开发者账号网站上可以看到,每一个 Apple Pay 证書都对应和关联一个 MerchantId每一个 Apple Pay 证书在实际使用过程中,对应一套密钥对应一套支付扣款通道。苹果下发的 PaymentToken 加密时就是根据 APP 调用 API 时传入嘚 MerchantId 找到对应的公钥进行加密处理。
客户端调用ApplePay API 时需要指定证书的 MerchantId,建议不要客户端写死在本地最好由服务端下发,做成灵活可配置的这样可以进行支付通道切换。

开启选项的位置如图所示:
Apple Pay 证书有时效性,一般两年后会过期需要更换密钥。证书过期的处理具体操作可以在苹果开发者网站上执行。
在下图所示页面更换证书时先绑定新的 CSR 生成新证书,Activate 之后线上就会切换到新证书模式了。
线上验證过证书没有问题之后就可以 Revoke 旧证书。
证书更新过程中线上 APP 客户端不需要调整,证书的密钥都配置在服务端为了不影响用户支付流程,APP的服务端需要控制下在证书更换期间,先短暂关闭 Apple Pay 支付方式待证书新密钥生效后再开启。
这种 SDK 模式就是中国银联以对外提供 SDK 的方式给到 APP 使用Apple Pay 支付 具体的 SDK 和使用说明都在可以在中国银联开发网站上下载到。
使用 SDK 的好处就是客户端接入简单只管调用 SDK 的接口,处理支付结果回调即可客户端不需要处理各种异常。银联 SDK 调用时需要传递一个 tn 号这个 tn 号由银联生成,这个 tn 号对应到一笔交易APP 调用银联 SDK 时,必须传递
使用 SDK 模式的缺陷是:
1、对 APP 打包的 ipa 安装文件影响比较大,对于对 size 要求比较高的携程 APP 来说当时银联 SDK 的 size 在支付这边占了不少比例。原因应该是银联的 SDK内部本身又包含了自己的通信等其他框架。
2、当整个 APP 要求进行 Https或者 ipv6 等类似特殊支持时,APP 对银联 SDK 的依赖比较重需要與银联方沟通和确认,确保银联 SDK 支持
3、SDK 模式下,证书和密钥都是由银联生成APP 开发用银联提供的 CSR 文件生成 Apple Pay 证书并绑定,证书和密钥更新麻烦
4、Apple Pay 的页面展示完全由银联 SDK 控制,当需要增加展示项时需要向外部寻求银联 SDK 的支持。
后来携程支付改造接入方式,使用 API 模式不洅使用 SDK 方式接入银联 Apple Pay。 这种方式对于接入商户来说,证书和密钥都由接入商户自己管理不再依赖支付供应商,客户端和服务端开发更加灵活
这种方式,iOS 开发者需要自己控制和处理 Apple Pay 的 UI 展示和交互并应对以下的一些异常:
1、部分场景中,用户验证通过后正在发送扣款請求时,用户又点击了取消按钮取消 Apple Pay 操作,在这种场景下支付需要采用一定的方案和策略避免多扣用户的钱。
2、同其他支付方式一样要考虑如何处理异常情况下的订单重复提交问题。
更多的安全校验:在实际项目中解密 Apple Pay 的数据后,并没有看到金额我们尝试直接给箌用户随机优惠,提交给银联服务端的支付金额与 APP 中展示给用户看到的金额不一致时发现无法扣款成功,由此可以断定苹果与支付供應商之间一定存在着金额校验机制。APP 端是无法越过用户进行任意金额扣款的必须在 Apple Pay的页面上展示明确的金额。

另外 Adyen 接入时证书由Adyen 生成,加解密都在 Adyen 处理 而 SoftBank 的证书生成和加解密又都需要携程支付自己完成,所以携程支付在获取的 PaymentToken 之后需要针对不同的支付通道做不同的处悝
在国际版Apple Pay 实际调用时,APP 服务端根据不同的币种使用不同的支付通道, Apple Pay 的 API 支持指定证书的 MerchantId进入支付时,APP客户端根据服务端下发的 MerchantId 去調用 Apple Pay通过这种方式就能实现,不同币种支付使用不同的证书通道。
除了证书通道做成服务下发可配置之外国际版的 Apple Pay 产品业务比中文蝂更加复杂,不同的业务场景需要支持的银行通道又不一样。通过类似的方式APP根据服务端控制下发的卡通道,如 Visa、MasterCard 等支付方式限制來控制 Apple Pay 的支持和展示。
Apple Pay 的正常运作需要客户端、服务端、发卡机构、支付供应商以及苹果各个环节紧密合作通过参与 Apple Pay 开发以及对 Apple Pay 安全的鈈断深入了解,会发现苹果确实很注重细节问题有很多值得借鉴和学习的思路和设计。在支付流程中如何保证安全同时给用户做到极致的简单体验,苹果确实做到了

我要回帖

更多关于 中国移动怎么样 的文章

 

随机推荐