iOS Apple Pay详解以及处理支付逻辑(附带Demo)
Apple Pay的简单介绍。
Apple Pay并不是独立的第三方支付服务,相比较支付宝和微信支付,他没有自己的账户,也不参与资金的流动, Apple Pay只是将原有的实体银行卡变成手机上“虚拟的银行卡”。Apple Pay依赖iPhone系统底层的整合,在便捷程度上,非第三方支付能比。如果你们真的要和第三方的支付对比的话.虎哥在这里只说一句话:一个是系统级的,一个是应用级的,剩下的,你们自己看着办。
Apple Pay 是在 iOS 8 中第一次被介绍,它可以为你的应用中的实体商品和服务,提供简单、安全、私密的支付方式。它使得用户支付起来非常简便,只需按一下指纹就可以授权进行交易。
并且Apple Pay 也只能在特定的设备上使用,目前为止,这些设备包括 iPhone 6, iPhone 6+, iPad Air 2, iPad mini 3. 这是因为 Apple Pay 需要特定的硬件芯片来支持,这个硬件叫做 Secure Element (简称SE,安全元件),他可以用来存储和加解密信息。可以把他理解成需要一种硬件的支持.
实际上Apple Pay是在2016年的2月份才来到中国大陆.也就是说,如果我们要实现Apple Pay就要让版本号支持到iOS9以上的系统,至于为什么到今年的2月份才来到大陆,原因很简单,没有跟中国大陆的银行谈好合作.
首批支持 Apple Pay的银行有:中国农业银行、中国银行、上海银行、中国建设银行、中信银行、招商银行、民生银行、广发银行、中国工商银行、兴业银行、中国邮政储蓄银行、上海浦东发展银行。
以下银行将会陆续支持 Apple Pay:平安银行、光大银行、广州银行、华夏银行、宁波银行、交通银行、北京银行。
以上就是我给大家Apple Pay的简单介绍。
开发流程
我们在写代码前需要做一些工程的配置:我们需要有一个具有ApplePay服务的APPid.以及真机测试的证书和描述文件
1、登录开发者账号,进行真机证书的申请。
1)在Identifiers中AppIDs中创建一个App ID
![](https://i-blog.csdnimg.cn/blog_migrate/4700c93ac9d47c6c6a8c3ff8cfd7a263.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/4ac6964f8d77b2bf45cbd23a48d02146.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/8dc0c1ce361d986395cb66c37012e716.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/07d17a63c767d9bf73a30dec17db1c71.webp?x-image-process=image/format,png)
最最最重要的有点,我们要勾选ApplePay的服务:
![](https://i-blog.csdnimg.cn/blog_migrate/351613203112f0b90b956b181fa4171d.webp?x-image-process=image/format,png)
然后点击继续:
![](https://i-blog.csdnimg.cn/blog_migrate/a4ad46a385b5fd0335a58eaa0ebeb3c9.webp?x-image-process=image/format,png)
没错,你们看见这个Apple Pay服务了。但是他是黄色的不可用的。是不是感觉和我们之前做远程推送服务的时候有点像。没错,我们还需要一样东西:Merchant IDs(商业ID)
![](https://i-blog.csdnimg.cn/blog_migrate/09a961a403b1fb83e333f7e94bad333b.webp?x-image-process=image/format,png)
点击创建商业ID
![](https://i-blog.csdnimg.cn/blog_migrate/05d38b7ab065d00306ec69d957078c05.webp?x-image-process=image/format,png)
注意商业ID命名格式,merchant.com.lanou3g.hanshanhuApplePayTest这个值,我们工程中需要用到。
![](https://i-blog.csdnimg.cn/blog_migrate/df988dc74077437fa48d3441f34f6b71.webp?x-image-process=image/format,png)
生成完成后,还没有结束,我们还需要进行商业id的修改:
![](https://i-blog.csdnimg.cn/blog_migrate/61b719121cddbc3b0cd39a9dfc6e1b69.webp?x-image-process=image/format,png)
点击修改后会出现这样的界面,选着YES
为什么选着YES。自行百度翻译后,你就能得到答案。
![](https://i-blog.csdnimg.cn/blog_migrate/eddfffb0ccd878ce14a2bf9f2adac672.webp?x-image-process=image/format,png)
然后,他需要一个CSR文件。
![](https://i-blog.csdnimg.cn/blog_migrate/4bb096f23389adc1c4ea539a53a0fa16.webp?x-image-process=image/format,png)
创建一个CSR文件:
打开你的钥匙串
![](https://i-blog.csdnimg.cn/blog_migrate/b095c2a98bf2553ed31765c7468f95d4.webp?x-image-process=image/format,png)
生成CRS文件
1选择证书助理
![](https://i-blog.csdnimg.cn/blog_migrate/f3a9fa32e8c02760375319e3f3f7db64.webp?x-image-process=image/format,png)
2请求证书
![](https://i-blog.csdnimg.cn/blog_migrate/333cc6352868a7faaab77383515c9b64.webp?x-image-process=image/format,png)
3填写信息,选择存储到磁盘
![](https://i-blog.csdnimg.cn/blog_migrate/fd2ef16131ac3d5dc1ab81433e9f15c6.webp?x-image-process=image/format,png)
点击继续,存储到磁盘
![](https://i-blog.csdnimg.cn/blog_migrate/26d63ab7c329404d8fd720ae5099474c.webp?x-image-process=image/format,png)
然后回到开发者中心,选择上传
![](https://i-blog.csdnimg.cn/blog_migrate/cc9b96397294bb9063a5dc387c340571.webp?x-image-process=image/format,png)
完成后就可以继续,然后选择done
![](https://i-blog.csdnimg.cn/blog_migrate/3ebf44f9c231e35218a647e52bf48c4a.webp?x-image-process=image/format,png)
接下来就是代码部分了,新建工程。创建完成后,对当前xcode进行配置信息。
![](https://i-blog.csdnimg.cn/blog_migrate/c0036499df814996fe3a37e140329393.webp?x-image-process=image/format,png)
接着还需要配置一个Capabilities
![](https://i-blog.csdnimg.cn/blog_migrate/e789feabac19b6a869a262f5d147dc88.webp?x-image-process=image/format,png)
选择后,下面会出现一些红色的错误。因为我们当前这个工程中的配置还未完成。接着我们需要创建一个测试的开发证书。然后还有一个我们APPid对应的描述文件。
那么这里证书创建我就不在演示了。
我们看下描述文件的创建图解
![](https://i-blog.csdnimg.cn/blog_migrate/3d4292353655c06f3b80cb8c1f134803.webp?x-image-process=image/format,png)
选择我们刚刚创建的具有Apple Pay支付功能的APPid
![](https://i-blog.csdnimg.cn/blog_migrate/929cb28aa990c46591b97bfe5c568cdf.webp?x-image-process=image/format,png)
选择我们的测试证书
![](https://i-blog.csdnimg.cn/blog_migrate/8967a8f70a200a40437b7f7493ca9a60.webp?x-image-process=image/format,png)
然后选择自己的设备进行真机测试
![](https://i-blog.csdnimg.cn/blog_migrate/eaa079c4731a088d4b51409a4b77f945.webp?x-image-process=image/format,png)
给描述文件起名字
![](https://i-blog.csdnimg.cn/blog_migrate/c4bc2b67d80325445e71e7de5a43ea3a.webp?x-image-process=image/format,png)
然后证书和描述文件下载下来,双击运行。然后继续配置xcode
![](https://i-blog.csdnimg.cn/blog_migrate/5b8cf6c1709d9fcfcd24148701eafb71.webp?x-image-process=image/format,png)
然后你回到Capabilities的位置, 你就会发现,红色错误解决了。
![](https://i-blog.csdnimg.cn/blog_migrate/6760db58f6a0fa3cefffeba2f46aee22.webp?x-image-process=image/format,png)
以上就是Xcode的配置。不要担心,没有了。这次真的没有了。
接下来,我们说下代码部分:
我们需要添加一个按钮,进行支付代码的实现。我们要添加的按钮是一个 PKPaymentButton, 这个在 iOS 8.3 时引入。这个按钮是本地化的,能够提供标准的样式。因此,我们强力推荐使用这个按钮来启动 Apple Pay 的支付页面。
![](https://i-blog.csdnimg.cn/blog_migrate/b4e797542f5fab35658f1a07c7f6188b.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/5ca3777e3f0c785252c1d266eb8bed66.webp?x-image-process=image/format,png)
也就是说,系统给我们提供了一个按钮,专门用来处理ApplePay的操作,其实这个按钮可不是随便都可以使用:
![](https://i-blog.csdnimg.cn/blog_migrate/3a93a67f0b359c80efe7cb42192d2975.webp?x-image-process=image/format,png)
看不懂没关系。翻译如下:
Do:
iOS8.3 及其以后只使用苹果提供的按钮 API;
iOS8.3 之前的 iOS8 系统,用苹果提供的切图;
Apple Pay 按钮只能唤起苹果支付 sheet;
Set up 按钮只能初始化到安装 Apple Pay;
按钮尺寸大于等于其他支付方式;
横竖屏样式统一;
根据背景色协调使用黑色或白色的 Apple Pay 按钮以及是否带边框线;
Don‘t:
不可以自定义按钮,只能用苹果提供的 API;
不可将 Apple Pay 按钮唤起其他 views;
不要将 Apple Pay 按钮用于市场交流宣传你的 app,它仅作为页面交互使用;
不要比其他支付按钮小;
不需要国际化,Apple Pay按钮API自带国际化;
也就是说:这个按钮,我们只能用来做支付,别的事情不能做。并且这个按钮在我们的storyboard和Xib中是没有的。必须要代码实现。
图片资源信息:
![](https://i-blog.csdnimg.cn/blog_migrate/75f35c937aae448c49c9a1f165a2ee27.webp?x-image-process=image/format,png)
切图可以拉伸,但是不可以变窄!
不可改变高度;
选择你需要高度的切图;
Do not alter the Apple Pay logo or Buy with or Set up message;
这个按钮有三个样式:White; WhiteOutLine; Black
同样具有三个不同类型:Plain; Buy;SetUp
那么我们看下OC语言中,这个按钮的创建方式。
首先我们需要在我们的工程中引入头文件#import<PassKit/PassKit.h>
如图:
![](https://i-blog.csdnimg.cn/blog_migrate/4dcedda019a6be682e07777edb6b676b.webp?x-image-process=image/format,png)
支付按钮的方法代码实现:
![](https://i-blog.csdnimg.cn/blog_migrate/2f55d5ab862179f82783f15c7bd0f7e1.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/8465e5474fb3d91f01878f1a5972b058.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/9d899b4da988a485bb15c56661b48d6b.webp?x-image-process=image/format,png)
然后还需要遵循他的协议并且实现他的代理方法
![](https://i-blog.csdnimg.cn/blog_migrate/ffc5c03bf4ed968601136fe771e64577.webp?x-image-process=image/format,png)
实现代理方法:
在Apple Pay验证了支付之后,仍然需要开发者来完成交易,这可以用didAuthorizePayment委托方法来完成,它需要你连接服务器并上传支付令牌和其他信息,以完成整个支付流程。
![](https://i-blog.csdnimg.cn/blog_migrate/04b8e5fe13486ef573ef4219246804db.webp?x-image-process=image/format,png)
然后实现取消完成后的代理方法。
![](https://i-blog.csdnimg.cn/blog_migrate/ea160e9c7bb177818f925093336cb7dc.webp?x-image-process=image/format,png)
支付授权的流程:
1.框架发送支付请求给安全模块,只有安全模块可以访问存储在设备上的标记化的卡信息。
2.安全模块把特定的卡和商家等支付数据加密,以保证只有苹果可以读取,然后发送给框架。框架会将这些数据发送给苹果。
3.苹果服务器再次加密这些支付数据,以保证只有商家可以读取。然后服务器对它进行签名,生成支付token,然后发送给设备。
4.框架调用相应的代理方法并传入这个token,然后你的代理方法传送token给你的服务器。
也就说,Apple Pay只做了支付信息的传递,不做支付功能。真正实现Apple Pay功能的是我们公司的后台人员。
服务器接收到token后的一般处理流程
1.验证支付数据的哈希表和签名 为加密过的支付数据解码 向支付处理系统提交支付数据 向订单追踪系统提交订单
2.处理支付请求时,你有两个选择;你既可以利用支付平台处理支付请求,也可以自己实现支付请求处理流程。一个常用的支付平台可以完成上述大部分操作。
demo:下载链接:(ps:有详细的注释)
http://pan.baidu.com/s/1pLb3Pr1
(ps:关于支持Apple Pay支付平台的更多信息,请参考developer.apple.com/apple-pay/)