开发apple pay碰到的问题总结
本来想简单总结一下Apple Pay 开发过程中的几个问题, 结果被下面这篇文章全碰上了, 干脆全文转载, 作者对相关资源整理得比较详细, 比较有参考价值
总的来说, 我们做过 APNs 推送的话, 申请 商户ID 并关联到 apple id, 申请证书, 生成provisioning profile等步骤都差不多
然后我真机调试有两个地方没通过, 下文也总结了, 我拎出来单独说一下:
1, Payment request is invalid: check your entitlements. Connection to remote alert view service failed
原因: 粗心, 把merchant id写错了.
之所以要把粗心的事也列出来, 是因为, 我出问题是粗心, 但是因为集成苹果支付的过程中, 是需要在配置界面的Capabilities里面用下拉列表选择一个merchant id, 以及代码里还要写一次的, 如果你有多个merchant id, 或者开发过程中切换过, 下拉列表值和代码里手写的值要记得同步, 没有同步, 一样会得上上面的错误
2, 进不到didAuthorizePayment方法.
原因, payrequest.merchantCapabilities = PKMerchantCapability3DS|PKMerchantCapabilityEMV. 看到了吧, 后面的 EMV 是必须要加的
大部分碰到同样问题的同学估计都是看 WWDC 的视频, 里面的小哥说3DS 是必须的, 显然在咱们大天朝, EMV 也是必须的, 下文有更详细的说明.
好吧, 下面是转载的全文
来源: http://www.lilongcnc.cc/2016/02/28/9-applepay支付界面调用和获取payment参数银联扣款流程/#comment-4
这两天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支付界面代码流程
这里我分为三个部分,如下:
- 注册merchant ID,配置支付证书,创建支付App ID,创建Profile.
- 本地判断是被是否支持Apple Pay,然后创建显示支付的sheet
- 支付完成后,回调方法中获取
Payment相关加密数据
注册merchant ID,配置支付证书,创建支付App ID,创建Profile.
这一步骤很简单,推荐简书作者Yasin的简书的文章《Apple Pay准备工作-申请MerchantID及对应证书详细图文教程》,链接地址:http://www.jianshu.com/p/2e5e45afc246
本地判断是被是否支持Apple Pay,然后创建显示支付的sheet
这一步就是具体代码,没有太多的技术含量.相关的文章也都写的很好,直接看这些文章和对应的Demo即可。需要提及的是,Apple Pay中是可以选择收货方式和填写收货地址的,但是这种方式在我们现在的app上,不是很合适。
推荐demo:
- 这个demo比较全面,包括机型判断,首推. 地址:https://github.com/SummertimSadness/ApplePayDemo
- 这个文章好像是印度妹子写的,分为part1和part2两部分,并且附有Demo地址。这两个Demo中就有对选择收货方式和填写收货地址的代码。
苹果中,用户选择收货地址和收货方式,是通过回调代理方法的方式来获取的文章地址:https://itechroof.wordpress.com/2016/01/15/apple-pay-part-1/ - 这个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的时候,必须有PKMerchantCapability3DS和PKMerchantCapabilityEMV. 否则只会进入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
开发apple pay碰到的问题总结的更多相关文章
- 【转】iOS开发 -- Apple Pay
技术博客原地址:http://www.cnblogs.com/dashunzi/p/ApplePay.html#top 原技术博客中有源码和视频,有感兴趣的朋友可以研究一下! 一.什么是Apple P ...
- iOS开发 Apple Pay
一.什么是Apple Pay? 1. 概念 Apple Pay,简单来说, 就是一种移动支付方式.通过Touch ID/ Passcode,用户可使用存储在iPhone 6, 6p等设备上的信用卡和借 ...
- 快速玩转Apple Pay开发
快速玩转Apple Pay开发 更新时间:2016年02月20日09时25分 来源:传智播客 Apple Pay 2016年2月18日上午,苹果公司宣布,与中国银联达成合作,正式在中国大陆上线Appl ...
- Apple Pay 初探
Apple Pay 一.概述 1.支付方式:Touch ID/ Passcode 2.设备要求:iPhone6以上(iphone:线上/线下 ipad:线上 watch:线下) 3.系统要求:iOS8 ...
- iOS Apple Pay
iOS 苹果支付 需要证书支持支付功能 targets 打开支付功能按钮 //ApplePay#import <PassKit/PassKit.h> ...
- Apple Pay(转)
Apple Pay 是在 iOS 8 中第一次被介绍,它可以为你的应用中的实体商品和服务,提供简单.安全.私密的支付方式.它使得用户支付起来非常简便,只需按一下指纹就可以授权进行交易. Apple P ...
- 集成 Apple Pay
作者感言 在中秋过后终于把国内的三大支付平台SDK集成都搞定了, 现在我们终于可以来研究Apple自家的支付Apple Pay最后:如果你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会参考 ...
- iOS App集成Apple Pay教程(附示例代码)
苹果在本周一发布了iOS 8.1版本,并正式开放了Apple Pay支付系统.Apple Pay是一个基于NFC的支付系统,不久将被数以万计的线下零售商店予以支持.即便这项科技并不是彻底的突破性进展, ...
- Apple Pay的实现
首先是搜到的大神写的全套知识点:http://www.jianshu.com/p/8d7b86f1d142 http://www.cnblogs.com/dashunzi/archive/2016/0 ...
随机推荐
- Python——functools
该模块为高阶函数提供支持——作用于或返回函数的函数被称为高阶函数.在该模块看来,一切可调用的对象均可视为本模块中所说的“函数”. 目录 一.模块方法 1. functools.cmp_to_key(f ...
- 再读GFS论文
http://loopjump.com/gfs_paper_note/ 再读GFS的一些笔记.主要涉及GFS架构.Chunk大小选择的一些折中考量.元数据管理及锁.写数据流程.GFS一致性模型的理解. ...
- ASP.NET 5中的那些K
ASP.NET 5最大的变化是什么?首当其冲的就是多了很多K,K表示的是ASP.NET vNext的项目代号“Project K”,但很容易让人想到一个汉字——“坑”,希望K不要成为“坑”的缩写. K ...
- Java多线程系列--“基础篇”04之 synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
- Javascript编程风格
Douglas Crockford是Javascript权威,Json格式就是他的发明. 去年11月他有一个演讲(Youtube),谈到了好的Javascript编程风格是什么.我非常推荐这个演讲,它 ...
- 原生JS查找元素
今天写了一个很简单.很粗暴的通过JS根据类来查找DOM元素. 为了降低它的粗暴等级(耗费性能)我给了三个等级. 首先性能最好的,适合FF,CH,IE8,通过querySelectorAll这个API. ...
- 设置与获取Cookie
自己编写的一个Cookie设置与获取函数,大家有什么感觉需要改进的地方,请告知与我,我一定虚心接受. JavaScript - Code: function setCookie(name,value, ...
- Linq查询操作之排序操作
在Linq中排序操作可以按照一个或多个关键字对序列进行排序.其中第一个排序关键字为主要关键字,第二个排序关键字为次要关键字.Linq排序操作共包含以下5个基本的操作. 1.OrderBy操作,根据排序 ...
- 使用 TOP 限制更新的数据
可以使用 TOP 子句来限制 UPDATE 语句中修改的行数.当 TOP (n) 子句与 UPDATE 一起使用时,将针对随机选择的 n 行执行删除操作.例如,假设您要为一位高级销售人员减轻销售负担, ...
- Lua使用心得(1)
这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口.组件,随便你怎么叫),希望能用脚本来控制主程序的行为.这实 ...