iOS开发-apple pay的实际应用

文档更新说明:

•   2016年03月09日 v1.0  初稿

 零、段子


顾客:能用apple pay吗?
收银员:什么?
顾客:能用苹果支付吗?
收银员:你咋不用梨子支付呢?你咋不上天呢?

 一、前言

        注意,这里面的例子的最低运行环境:xcode 7.2   iOS9.2
        就在几周之前,apple pay进入了我大中华地区,瞬间,许多人都在微博、朋友圈帮助苹果普及着什么是apple pay(也包括我)。但是,作为一个开发人员,我们应该想得更多一点,怎么在我们的app中使用apple pay 呢?
        你可能会马上去翻官方手册。确实,官方手册有时候很有用。翻完之后,你或许也可以像网上很多demo一样,在模拟器上面弹出那个付款的界面,满足一下自己。很快,你就会发现,跟着这个手册,跟着demo怎么不能在真机上面运行呢?
        其实这个问题很好解释,因为苹果支付在中国大陆是和银联合作的,跟着网上的那些教程都没提到银联,所以是不行的。正确的做法是直接上银联官网。银联的开发者技术支持网站:https://open.unionpay.com。

二、要苹果去开发者后台做的事情

        在开发之前,我们首先要去开发者后台做一些操作。

1、申请app id

        这个步骤和平时没什么区别,要注意的就是在App Services中勾选apple pay服务。
1

2、注册商户id(merchant IDs)

          2
          在没有注册这个商户id之前,app id里面的apple pay选项是显示Configurable的。
          这里,直接点击证书选项下面的merchant IDs,在页面中填写好描述和id。这个ID需要记住,后面编写代码的时候需要的。填写完之后点下一步,直到完成。
           这时,配置并没有结束,还有再次点进来,点击edit,在弹出来的“ Are you processing your payments outside of the United States?”选项中,选择yes,表示我们是在美国之外的地区使用。
           之后会让你上传一个证书,如果只是为了测试的话,从我们电脑里面导出一个“从证书颁发机构申请”的证书即可。如果是和银联或者第三方apple pay服务提供商合作的话,他们是会提供这个cer文件的,你把那个上传到苹果后台就可以了。这时,需要在苹果后台做的事情就完成了。
         

三、要去银联官网做的

        前面说到了,apple pay在中国地区是和引来了合作的,当然,也还有其他第三方合作商,比如说连连支付等。在开发者网页中的apple pay里面有说明。在苹果的文档中,也建议我们使用这些第三方的服务来完成apple pay 的接入。ps:反正不管你用不用别人的sdk都是要向银联支付手续费的。
        这里,我就只用了银联的sdk来实现了一下,银联关于apple pay的接入步奏在官网有很详细的资料,这里我就不说明接入步奏了,这里主要讨论的是关于技术开发这一块。用mac的各位亲,银联官网需要使用safari打开,不然登陆的时候输入不了密码~
        进入银联官网,我们直接去找apple pay 的sdk。在这个网页左边,有个DEMO/SDK下载,点击之后直接就可以下载了。

四、工程配置

        打开xcode,新建一个工程,把bundle id改成刚才配置的。点开tagat配置的Capabilities选项,打开里面的apple pay,这时会转圈圈。网速快的话很快就能看到刚才我们申请的merchant ID了,选择哪个merchant ID,然后工程的设置就结束了。

五、导入银联的SDK

  • 1、银联的SDK一共才三个文件(UPAPayPlugin.h、UPAPayPluginDelegate.h和libUPAPayPlugin.a),两个.h文件,一个.a文件,直接拖到我们的工程中。
  • 2、由于银联的sdk中,使用了c++函数,所以我们需要把调用控件的那个文件的后缀名改为.mm,这个问题有两个解决办法:(1)把要调用支付的那个viewController后缀名改为.mm。(2)封装一个支付工具类,工具类使用.mm后缀。
  • 3、添 加 CFNetwork.framework 、 libUPAPayPlugin.a 、 PassKit.framework 、 SystemConfiguration.framework、libz.tbd 到 App 工程中 。
  • 4、把 other linker flags 选项的值设为-ObjC。

六、使用SDK

        银联这个SDK使用起来非常简单,只有一个方法,代理中也只有一个方法。我们在需要支付的地方调用UPAPayPlugin.h中的下面这个方法就可以弹出支付界面了。

/**
 *  支付接口
 *
 *  @param tn             订单信息
 *  @param mode           接入模式,标识商户以何种方式调用支付控件,00生产环境,01测试环境
 *  @param viewController 启动支付控件的viewController
 *  @param delegate       实现 UPAPayPluginDelegate 方法的 UIViewController
 *  @param mID            苹果公司分配的商户号,表示调用Apple Pay所需要的MerchantID;
 *  @return 返回函数调用结果,成功或失败
 */
+ (BOOL)startPay:(NSString*)tn
            mode:(NSString*)mode
  viewController:(UIViewController*)viewController
        delegate:(id<UPAPayPluginDelegate>)delegate
  andAPMechantID:(NSString* )mID;

        这个里面需要说明的一个参数就是tn,tn是银联的支付单号,正式环境中,是由我们自己的后台向银联请求,然后再返回给我们客户端的。如果只是为了测试的话,可以使用银联提供的测试接口http://101.231.204.84:8091/sim/getacptn,这个会直接返回一个支付单号。我们把返回的支付单号放进去即可。
        里面的mID参数就是前面我们在苹果开发者后台申请的商户id。
        如果没问题的话,这样应该是可以弹出支付的窗口了。如果中间有什么bug 的话,可以先去里面的文档里面找找,文档中有提供一些常见问题的解决方法。

七、后记

        其实在百度和Google上面找apple demo,能找到很多,但是大多只能在模拟器上面实现一个界面而已,我开始也在那些demo中郁闷了很久,写这个文章也是希望能帮到一些人,让大家在使用的时候少走弯路。
        在实际应用中,这些步骤是远远不足的,我们在实际中肯定还要和后台做很多磨合,庆幸的是有第三方服务商为我们解决这些问题。所以,如果你们项目中要使用apple pay,我建议还是直接联系第三方提供商吧。据我的了解,一般收取的手续费都是千分之八。
        附上demo:https://github.com/fengqiangboy/UnionApplePayDemo