本來想簡單總結一下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/