這兩天Apple Pay貌似很是火熱,自己下載的app里,'Enjoy'和'美團(tuán)'也都集成了Apple Pay. 我最近也看了一下Apple Pay的集成,客服端確實(shí)很簡單,不過需要提示大家?guī)讉€(gè)我自己躺雷和遇到問題的地方. 然后給大家附上一些我一些參考的帖子.
前話
Apple Pay功能支持的是iPhone6以上,iOS9.2以上. 且目前企業(yè)級(jí)證書是不支持的,只有個(gè)人開發(fā)者證書才支持
所以我們下邊提到的所有情況都是在滿足這個(gè)前提下出現(xiàn)的.
文章主要結(jié)構(gòu)如下:
客戶端apple pay支付界面代碼流程
真實(shí)銀聯(lián)扣款流程
另外,我遇到的兩個(gè)雷是:
(1) 注冊(cè)了merchant ID之后,在XCode配置完成,但是運(yùn)行時(shí)候出現(xiàn)"Payment request is invalid: check your entitlements. Connection to remote alert view service failed"的情況
(2) 輸入指紋(輸入PIN碼),支付完成后,沒有進(jìn)入didAuthorizePayment方法
遇到的一個(gè)問題:
(1) 根據(jù)開通Apple Pay的App ID創(chuàng)建的描述文件,會(huì)在剛剛創(chuàng)建狀態(tài)直接變成"invalid",或者過一段時(shí)間狀態(tài)自動(dòng)從"activity"變成"invalid."
客戶端apple pay支付界面代碼流程
這里我分為三個(gè)部分,如下:
- 注冊(cè)merchant ID,配置支付證書,創(chuàng)建支付App ID,創(chuàng)建Profile.
- 本地判斷是被是否支持Apple Pay,然后創(chuàng)建顯示支付的sheet
- 支付完成后,回調(diào)方法中獲取
Payment相關(guān)加密數(shù)據(jù)
注冊(cè)merchant ID,配置支付證書,創(chuàng)建支付App ID,創(chuàng)建Profile.
這一步驟很簡單,推薦簡書作者Yasin的簡書
的文章《Apple Pay準(zhǔn)備工作-申請(qǐng)MerchantID及對(duì)應(yīng)證書詳細(xì)圖文教程》祥国,鏈接地址:http://www.reibang.com/p/2e5e45afc246
本地判斷是被是否支持Apple Pay,然后創(chuàng)建顯示支付的sheet
這一步就是具體代碼舌稀,沒有太多的技術(shù)含量.相關(guān)的文章也都寫的很好壁查,直接看這些文章和對(duì)應(yīng)的Demo即可。需要提及的是康谆,Apple Pay中是可以選擇收貨方式和填寫收貨地址的沃暗,但是這種方式在我們現(xiàn)在的app上,不是很合適嚼黔。
推薦demo:
- 這個(gè)demo比較全面,包括機(jī)型判斷,首推. 地址:https://github.com/SummertimSadness/ApplePayDemo
- 這個(gè)文章好像是印度妹子寫的唬涧,分為part1和part2兩部分盛撑,并且附有Demo地址抵卫。這兩個(gè)Demo中就有對(duì)選擇收貨方式和填寫收貨地址的代碼介粘。
蘋果中,用戶選擇收貨地址和收貨方式雅采,是通過回調(diào)代理方法的方式來獲取的
文章地址:https://itechroof.wordpress.com/2016/01/15/apple-pay-part-1/ - 這個(gè)demo地址很簡單婚瓜,但是沒有對(duì)于設(shè)備是否支持Apple Pay做判斷巡雨,但是在最開始躺雷的時(shí)候铐望,我和作者溝通了好多次,
回調(diào)不進(jìn)入**didAuthorizePayment**方法
,就是和該作者討論的. demo地址:https://github.com/lintide/ApplePayDemo
支付完成后,回調(diào)方法中獲取Payment相關(guān)加密數(shù)據(jù)
在我們錄入指紋督弓,并且輸入正確PIN碼后愚隧,會(huì)返回下列兩個(gè)方法中:
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment: (PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus))completion {
NSLog(@"驗(yàn)證指紋成功狂塘,蘋果返回銀聯(lián)卡相關(guān)加密數(shù)據(jù)did authorize payment token: %@, %@", payment.token, payment.token.transactionIdentifier);
completion(PKPaymentAuthorizationStatusSuccess);
}
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {
NSLog(@"支付完成或者用戶點(diǎn)擊取消");
[controller dismissViewControllerAnimated:controller completion:NULL];
}
第一個(gè)方法didAuthorizePayment
如log中寫的那樣荞胡,是在成功之后返回的.我們不管是跟第三方SDK還是自己公司后臺(tái)服務(wù)器處理加密數(shù)據(jù),我們都要Payment數(shù)據(jù). 另外廊营,真實(shí)的扣款流程我們?cè)谙旅嫘」?jié)中提到.
第二個(gè)方法露筒,就是我們?cè)趐resent彈起Apple Pay相關(guān)sheet之后敌卓,我們點(diǎn)擊"取消"按鈕和驗(yàn)證指紋成功,系統(tǒng)會(huì)回調(diào)這個(gè)方法,我們主要在這個(gè)方法中,把彈起的支付sheet再給diss下去.
至于其他方法,我這里就不做提及(另外上邊說的和在支付sheet中用戶填入收貨地址和選擇收貨方式),我們可以點(diǎn)擊去看頭文件.
真實(shí)銀聯(lián)扣款流程
我們?cè)?code>didAuthorizePayment方法中獲取到Payment相關(guān)加密數(shù)據(jù)
后,并不是真正的完成了扣款的交易
.這里我們需要提到Aplle Pay他只是一種代為扣款的方式
,就好比你直接給商家現(xiàn)金,給現(xiàn)金就是一種方式,但是真正的扣錢,還是要等商家給你找零錢回來才算是真正的完成. 在大陸地區(qū),銀聯(lián)就好比是這個(gè)大商家.
在正式接入Apple Pay功能時(shí),還需要注冊(cè):https://open.unionpay.com/ajweb/product/detail?id=80
我們還需要利用Payment相關(guān)加密數(shù)據(jù)
和銀聯(lián)后臺(tái)做扣款業(yè)務(wù)的對(duì)接. 這里也分為兩種形式: 第一種是使用第三方SDK ,這種方式的優(yōu)點(diǎn)是我們不用處理加密數(shù)據(jù),缺點(diǎn)就是支付的界面我們不能自定義.具體參考銀聯(lián)相關(guān)文檔.地址:https://open.unionpay.com/ajweb/help/file/techFile?productId=80
第二種是公司后臺(tái)對(duì)加密數(shù)據(jù)進(jìn)行解密處理,然后調(diào)用銀聯(lián)接口. 這種方式的優(yōu)點(diǎn)就是能對(duì)支付界面自己掌控,缺點(diǎn)就是解密過程尤為辛苦.
接下來
關(guān)于實(shí)際的demo例子的話,推薦大家追蹤關(guān)注下邊三個(gè)地址瞬捕,其中兩個(gè)作者正在申請(qǐng)銀聯(lián)的接入資格,想必之后肯定會(huì)更新相關(guān)文章.還有一個(gè)就是接入"Enjoy"的開發(fā)者承諾過段時(shí)間會(huì)把后臺(tái)解析Payment相關(guān)加密數(shù)據(jù)和銀聯(lián)支付相關(guān)
惧蛹,有需要的同學(xué)可以繼續(xù)關(guān)注.
地址一:https://github.com/lintide/ApplePayDemo
地址二:http://www.cocoachina.com/ios/20160219/15345.html
地址三:http://blog.nswebfrog.com/2016/02/20/apple-pay-analysis/
說說前邊的雷和問題
另外,我遇到的兩個(gè)雷是:
(1) 注冊(cè)了merchant ID之后,在XCode配置完成,但是運(yùn)行時(shí)候出現(xiàn)"Payment request is invalid: check your entitlements. Connection to remote alert view service failed"的情況
這個(gè)問題
困擾了我一天,問題出現(xiàn)在自己太過于疏忽了.粗心大意害死人啊.我們要注意在XCode中的Capability選擇了merchant ID之后,我們還需要在代碼這一行對(duì)應(yīng)修改merchant ID.
payment.merchantIdentifier = @"merchant.com.lauren.nihao11";
(2 ) 輸入指紋(輸入PIN碼)后,支付完成后,沒有進(jìn)入didAuthorizePayment方法
這個(gè)問題
當(dāng)時(shí)也比較郁悶,因?yàn)樵谀M器上是會(huì)進(jìn)入這個(gè)方法的.后來才發(fā)現(xiàn)我們?cè)谥付╩erchantCapabilities的時(shí)候,必須有PKMerchantCapability3DS
和PKMerchantCapabilityEMV
. 否則只會(huì)進(jìn)入paymentAuthorizationViewControllerDidFinish
這個(gè)回調(diào). 另外其他兩個(gè)'PKMerchantCapabilityCredit'和'PKMerchantCapabilityDebit'我們也可以酌情添加.
payment.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV | PKMerchantCapabilityCredit | PKMerchantCapabilityDebit;
遇到的一個(gè)問題:
(1) 根據(jù)開通Apple Pay的App ID創(chuàng)建的描述文件,會(huì)在剛剛創(chuàng)建狀態(tài)直接變成"invalid",或者過一段時(shí)間狀態(tài)自動(dòng)從"activity"變成"invalid."
這個(gè)問題
貌似不單單只是出現(xiàn)在開通了Apple Pay的App ID創(chuàng)建Profile的時(shí)候.解決方法就是點(diǎn)擊對(duì)應(yīng)描述文件那行,然后點(diǎn)擊'Edit',接著重新'Generate'一下即可.
結(jié)尾
Apple Pay編程指導(dǎo):http://www.reibang.com/p/a5342940afa3
蘋果Apple Pay開發(fā)文檔:https://developer.apple.com/apple-pay/Getting-Started-with-Apple-Pay.pdf
Swift相關(guān):http://nshipster.com/apple-pay/
其它:http://www.cocoachina.com/ios/20140910/9573.html
交流
希望能和大家交流技術(shù)
歡迎大家關(guān)注我的微博和我GitHub,我會(huì)不時(shí)分享和轉(zhuǎn)發(fā)一些大牛的技術(shù)貼和開源項(xiàng)目.
GitHub:https://github.com/lilongcnc
博客:http://www.lilongcnc.cc