Apple Pay
一个方便 & 安全的移动支付技术,让用户完成他们的支付环节并把支付相关的信息告诉你
只可以购买实物或者服务,不可以用来支付IAP
应用内集成Apple Pay需要两个部分:交易授权与交易处理。交易授权在应用内进行,通过PassKit.framework所提供的接口向用户获取支付授权(payment token);而交易处理则需要授权后调用可受理交易的服务器接口(将token传入服务器进行处理),你可以选择某个支付平台来处理交易,或者也可以自己实现交易处理过程,苹果官方比较推荐前者。
譬如选择了接入银联的Apple Pay,所以除了查看 Apple 的文档以外,还要看银联的开发文档。
配置
Merchant Identifier
1. 到 Member Center 上为 App 注册 Merchant ID
2. 为 Merchant ID 上传 CSR (从银联获取)
3. 通过上传的 CSR 生成证书,并下载
Steps
1. 创建 Payment Request,设置它的 subtotal,discount 等信息
2. 通过 payment authoriztion view controller 展示支付信息,等待用户支付授权
3. 用户授权支付后,Apple Pay 加密处理支付信息,依据 merchant id 以及对应的支付卡信息计算出 payment token
4. payment token 用 Merchant Id对应的证书加密,发送到 Apple Server
5. Apple Server 把 token 交到我们的 App
6. Payment token 交给可以处理交易的第三方平台,我们这里是银联SDK
注意: app bundle 里不需要包含 Merchant Id 的证书
Payment Request
1. 创建 Payment Request 之前,最好先检查是否可以使用 Payment
canMakePayments 是否支持 Apple Pay,NO时不要展示 Apple Pay 按钮
canMakePaymentsUsingNetworks:
如果 canMakePayments 是 YES,canMakePaymentsUsingNetworks 是 NO。意味着当前设备没有绑银行卡,你可以展示一个 setup 按钮,推荐调用 openPaymentSetup 鼓励用户添加银行卡
2. Apple Pay 的条件满足以后,在用户按下 Apple Pay 后应该马上展示 payment 的信息等待用户授权。
3. 如果支付流程只在 Web 的方式上进行,你要在现有的支付流程中插入 Native 代码的逻辑,譬如是捕捉url的方式。
Currency Code & Country Code
currencyCode 是描述支付所用的货币,三位字符:USD
countryCode 是处理这个订单的地方,两位字符:US
Merchant Id
request 的 merchant id 必须在 app entitlement 里声明
Authorizing Payments
当用户授权了支付,Apple Pay 会生成一个与 Apple Server 和本设备的 Security Element 对应的 payment token。
1. Security Element 在获取 payment request 之后,把payment card 以及 商户 的信息加密后送到 Apple 的服务端
2. Apple 的服务端再利用配置好的 Merchant ID 的证书加密 payment 数据,返回给设备
3. 在 paymentAuthorizationViewController:didAuthorizePayment:completion: 协议中返回 token。app 把 token 发到拥有解释能力的服务端进行扣款。
4. 当 Apple Pay 显示了支付的状态信息之后,paymentAuthorizationViewControllerDidFinish: 会触发,app dimiss 支付授权的界面,并展示自己的订单确认界面。
Processing Payments
使用的是银联SDK,有银联处理支付之后的事宜。
UI
Apple Pay 的 UI 有严格要求:
1. 对于 iOS8.3 及以后,使用 PKPaymentButton 创建按钮
2. 对于 iOS8.3 以前,使用官方指定尺寸的图片
2. Apple 对 Apple Pay 的展示有严格要求,甚至是 "Apple Pay" 这个词组都不允许有任何不一致, 如果不想反复被reject还是先看看 [Apple Pay Identity Guide](https://developer.apple.com/apple-pay/Apple-Pay-Identity-Guidelines.pdf)
3. 不允许翻译:Apple,Apple Pay,iPhone,Touch ID 以及其它Apple 的 trademark。
HIG
入口:Button
当用户按下 Apple Pay 的按钮,必须马上展示 Payment sheet。如果当前的设备不支持 Apple Pay 功能,你可以展示 Apple Pay 的 Set up 按钮,或者不展示 Apple Pay 按钮。
![Apple Pay Button](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/Art/apple_pay_small_button_2x.png)
Payment Sheet
用于展示订单的支付,配送,TAX等方面的信息(如果需要),app 可以指定 sheet 中的内容,但不可以干扰用户对 sheet 的交互
Payment Token
用户通过 Touch ID 授权(有些情况还需要银行的 PIN code)之后,你的 app 会获得 PassKit 的 payment token。里面包含完成交易所必要的信息,包括识别设备的 account number,金额,唯一的一次性密文。拥有证书私钥的商户可以解密这些支付信息,或者是提供支付SDK的商户。
在中国,目前能够提供支持 Apple Pay 支付解决方案的支付平台:
银联,连连支付(LianlianPay),首信易支付(PayEase),易宝支付(YeePay),银联商务(UMS)
Apple Demo
[Emporium](https://developer.apple.com/library/ios/samplecode/Emporium/Introduction/Intro.html#//apple_ref/doc/uid/TP40016175)
配置步骤笔记
下载来的项目有一些配置项目要留意补充
1. 到 itunesconnet 上配置 merchant,app id,provisioning profile(demo项目中还包含 watch)
2. AppConfiguration.swift 可能要修改 merchant ID 与你在 itunesconnect 中
配置的一样
3. 项目中有 User-Defined Setting “EMPORIUM_BUNDLE_PREFIX”, 用来配置 bundle id 以及
4. ProductTableViewController.swift 是生成 payment request 以及进行支付授权的界面。
supportedNetworks 增加 PKPaymentNetworkChinaUnionPay (iOS 要求9.2以上,修改 deployment target...)
paymentRequest 的 countryCode & currencyCode 要改成 CN & CNY
Apple Review Guides
Review Guide 是会更新的,建议定期查一下
[29.Apple Pay](https://developer.apple.com/app-store/review/guidelines/#apple-pay)
1. 使用 Apple Pay 的 app 必须提供完整的消费信息。如果 Apple Pay 用于订阅类型的周期性消费,你需要描述清楚订阅的周期,以及周期内所提供的服务,以及如何取消订阅
2. 使用的 Apple Pay 视觉元素必须符合官方要求 [Apple Pay Identity Guidelines](https://developer.apple.com/apple-pay/Apple-Pay-Identity-Guidelines.pdf)
3. 购买的东西必须符合地方法律
4. 必须提供 privacy policy
5. 从 Apple Pay 获取的数据在用于提供第三方实现支付时要符合法律要求
其它
Wallet 绑定银行卡
Apple Pay 的设计理念:不收集任何支付,交易的信息。而一个交易涉及到的有用户,商户(或者支付的app)和银行。基于安全的考虑,Apple Pay 要求用户设置了密码。
绑定银行卡:
1. 用户输入卡号等信息,iOS 把信息加密后发送到 Apple 的服务器
2. Apple 加密信息,根据你的支付网络(eg.银联),进行对应的加密。信息还包含:你的iTunes 上的一些交易信息,你的设备信息(手机号码,名称,设备型号,地理位置等)。
3. 发卡银行依据 Apple 发过来的信息决定能否让你绑卡成功
4. 绑卡成功的话,银行给 Apple 发送一个加密了的设备唯一的 Device Account Number (以及用于每次交易时生成动态安全码的key),Apple 不能对 Device Account Number 解密,只保存到设备上的 Security Element 芯片里。也不会备份到 iCloud。
5. Apple 保存卡号的一部分,以及 Device Account Number 的一部分。。卡描述信息到 Wallet,用以帮助你管理银行卡。
假如 card number 理解成我们的 urs,Device Account Number 就是设备信息的种子,还有生成OTP的key,三者
Apple Pay 店内支付
1. iPhone 接近 NFC 终端时会展示你的默认银行卡,通过你的 Touch ID 或者密码授权支付。Apple Watch 需要在解锁状态下双击 side button.
2. 授权后,Device Account Number ,动态安全码以及一些附加信息会发送给 NFC 终端
3. 支付组织通过动态码验证支付请求是否来自你的授权设备
Apple Pay 应用内支付
1. Apple Pay 在获取用户授权后加密交易数据,处理后再用开发者指定的key加密数据,把结果发送给开发者app。
2. 与店内支付类似,Device Account Number 以及动态安全码等信息会发送给 Apple
手机丢失
1. Find My iPhone 会清理你的绑定卡信息
2. 可以进入 iCloud settings 移除设备的支付授权。
后记
1. 成功调出 Apple Pay 界面,指纹授权支付提示错误
Reference
[ENJOY的Apple Pay应用内支付接入实践](http://geek.csdn.net/news/detail/60849)
[Apple Pay security and privacy overview](https://support.apple.com/en-sg/HT203027)