9- ApplePay支付界面调用和获取Payment参数,银联扣款流程

Posted on Posted in iOS, 全部文章

这两天Apple Pay貌似很是火热,自己下载的app里,’Enjoy’和’美团’也都集成了Apple Pay. 我最近也看了一下Apple Pay的集成,客服端确实很简单,不过需要提示大家几个我自己躺雷和遇到问题的地方. 然后给大家附上一些我一些参考的帖子.

前话

Apple Pay功能支持的是iPhone6以上,iOS9.2以上. 且目前企业级证书是不支持的,只有个人开发者证书才支持所以我们下边提到的所有情况都是在满足这个前提下出现的.

文章主要结构如下:

  • 客户端apple pay支付界面代码流程

  • 真实银联扣款流程

另外,我遇到的两个雷是:

  • 注册了merchant ID之后,在XCode配置完成,但是运行时候出现“Payment request is invalid: check your entitlements. Connection to remote alert view service failed”的情况

  • 输入指纹(输入PIN码),支付完成后,没有进入didAuthorizePayment方法

遇到的一个问题:

  • 根据开通Apple Pay的App ID创建的描述文件,会在刚刚创建状态直接变成”invalid”,或者过一段时间状态自动从”activity”变成”invalid.”

客户端apple pay支付界面代码流程

这里我分为三个部分,如下:

  1. 注册merchant ID,配置支付证书,创建支付App ID,创建Profile.
  2. 本地判断是被是否支持Apple Pay,然后创建显示支付的sheet
  3. 支付完成后,回调方法中获取Payment相关加密数据

注册merchant ID,配置支付证书,创建支付App ID,创建Profile.

这一步骤很简单,推荐简书作者Yasin的简书的文章《Apple Pay准备工作-申请MerchantID及对应证书详细图文教程》,链接地址:http://www.jianshu.com/p/2e5e45afc246

本地判断是被是否支持Apple Pay,然后创建显示支付的sheet

这一步就是具体代码,没有太多的技术含量.相关的文章也都写的很好,直接看这些文章和对应的Demo即可。需要提及的是,Apple Pay中是可以选择收货方式和填写收货地址的,但是这种方式在我们现在的app上,不是很合适。

推荐demo:

  1. 这个demo比较全面,包括机型判断,首推. 地址:https://github.com/SummertimSadness/ApplePayDemo
  2. 这个文章好像是印度妹子写的,分为part1和part2两部分,并且附有Demo地址。这两个Demo中就有对选择收货方式和填写收货地址的代码。 苹果中,用户选择收货地址和收货方式,是通过回调代理方法的方式来获取的 文章地址:https://itechroof.wordpress.com/2016/01/15/apple-pay-part-1/
  3. 这个demo地址很简单,但是没有对于设备是否支持Apple Pay做判断,但是在最开始躺雷的时候,我和作者沟通了好多次,回调不进入**didAuthorizePayment**方法,就是和该作者讨论的. demo地址:https://github.com/lintide/ApplePayDemo

支付完成后,回调方法中获取Payment相关加密数据

在我们录入指纹,并且输入正确PIN码后,会返回下列两个方法中:

- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:  (PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus))completion {
    NSLog(@"验证指纹成功,苹果返回银联卡相关加密数据did authorize payment token: %@, %@", payment.token, payment.token.transactionIdentifier);

    completion(PKPaymentAuthorizationStatusSuccess);
}

- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {
    NSLog(@"支付完成或者用户点击取消");
    [controller dismissViewControllerAnimated:controller completion:NULL];
}

第一个方法didAuthorizePayment如log中写的那样,是在成功之后返回的.我们不管是跟第三方SDK还是自己公司后台服务器处理加密数据,我们都要Payment数据. 另外,真实的扣款流程我们在下面小节中提到.

第二个方法,就是我们在present弹起Apple Pay相关sheet之后,我们点击”取消”按钮和验证指纹成功,系统会回调这个方法,我们主要在这个方法中,把弹起的支付sheet再给diss下去.

至于其他方法,我这里就不做提及(另外上边说的和在支付sheet中用户填入收货地址和选择收货方式),我们可以点击去看头文件.

真实银联扣款流程

我们在didAuthorizePayment方法中获取到Payment相关加密数据后,并不是真正的完成了扣款的交易.这里我们需要提到Aplle Pay他只是一种代为扣款的方式,就好比你直接给商家现金,给现金就是一种方式,但是真正的扣钱,还是要等商家给你找零钱回来才算是真正的完成. 在大陆地区,银联就好比是这个大商家.

在正式接入Apple Pay功能时,还需要注册:https://open.unionpay.com/ajweb/product/detail?id=80

我们还需要利用Payment相关加密数据和银联后台做扣款业务的对接. 这里也分为两种形式: 第一种是使用第三方SDK ,这种方式的优点是我们不用处理加密数据,缺点就是支付的界面我们不能自定义.具体参考银联相关文档.地址:https://open.unionpay.com/ajweb/help/file/techFile?productId=80

第二种是公司后台对加密数据进行解密处理,然后调用银联接口. 这种方式的优点就是能对支付界面自己掌控,缺点就是解密过程尤为辛苦.

接下来

关于实际的demo例子的话,推荐大家追踪关注下边三个地址,其中两个作者正在申请银联的接入资格,想必之后肯定会更新相关文章.还有一个就是接入”Enjoy”的开发者承诺过段时间会把后台解析Payment相关加密数据和银联支付相关,有需要的同学可以继续关注.

地址一:https://github.com/lintide/ApplePayDemo

地址二:http://www.cocoachina.com/ios/20160219/15345.html

地址三:http://blog.nswebfrog.com/2016/02/20/apple-pay-analysis/

说说前边的雷和问题

另外,我遇到的两个雷是:

? 注册了merchant ID之后,在XCode配置完成,但是运行时候出现“Payment request is invalid: check your entitlements. Connection to remote alert view service failed”的情况

这个问题困扰了我一天,问题出现在自己太过于疏忽了.粗心大意害死人啊.我们要注意在XCode中的Capability选择了merchant ID之后,我们还需要在代码这一行对应修改merchant ID.

payment.merchantIdentifier = @"merchant.com.lauren.nihao11";

? 输入指纹(输入PIN码),支付完成后,没有进入didAuthorizePayment方法

这个问题当时也比较郁闷,因为在模拟器上是会进入这个方法的.后来才发现我们在指定merchantCapabilities的时候,必须有PKMerchantCapability3DSPKMerchantCapabilityEMV. 否则只会进入paymentAuthorizationViewControllerDidFinish这个回调. 另外其他两个’PKMerchantCapabilityCredit’和’PKMerchantCapabilityDebit’我们也可以酌情添加.

payment.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV | PKMerchantCapabilityCredit | PKMerchantCapabilityDebit;

遇到的一个问题:

? 根据开通Apple Pay的App ID创建的描述文件,会在刚刚创建状态直接变成”invalid”,或者过一段时间状态自动从”activity”变成”invalid.”

这个问题貌似不单单只是出现在开通了Apple Pay的App ID创建Profile的时候.解决方法就是点击对应描述文件那行,然后点击’Edit‘,接着重新’Generate‘一下即可.

结尾

Apple Pay编程指导:http://www.jianshu.com/p/a5342940afa3

苹果Apple Pay开发文档:https://developer.apple.com/apple-pay/Getting-Started-with-Apple-Pay.pdf

Swift相关:http://nshipster.com/apple-pay/

其它:http://www.cocoachina.com/ios/20140910/9573.html


希望能和大家交流技术

欢迎大家关注我的微博和我GitHub,我会不时分享和转发一些大牛的技术贴和开源项目.

新浪微博:http://weibo.com/1594425143/profile?topnav=1&wvr=6&is_all=1

GitHub:https://github.com/lilongcnc


2 thoughts on “9- ApplePay支付界面调用和获取Payment参数,银联扣款流程

发表评论

电子邮件地址不会被公开。 必填项已用*标注