ApplePay在中國上線後,就有許多線上app前後腳加入了對其的接入支援,個人比較喜歡的ENJOY也搶在首批接入了ApplePay應用內購買。本文將分享作者的接入經驗。
ApplePay是蘋果公司推出的一種線上/線下的便捷支付方式,根據TouchId來驗證支付卡持卡人身份,ApplePay並不參與資金流動,最終還是讓銀行完成扣款處理,目前據Apple介紹只配備在iphone6以上和新款的ipad Air2和ipad mini3上,中國地區最低系統要求為IOS9.2,對於一種新支付體驗,這門檻的確有點高了。蘋果開發文件對ApplePay工作方式的介紹.
線下支付使用NFC POST機只需要與銀聯聯絡簽約租用即可,我們來介紹線上支付的流程和app應用內接入的方法。
目前的接入方式有兩種,一是使用第三方提供商的SDK接入,另一種是讓PassKit Framework直接與銀聯的介面對接,當然網路上還有一些自己使用PassKit PaymentRequest自己生成訂單組織資訊,直接與Apple對接的Demo,因為我們不可能每家銀行跑去簽約,大陸的銀行也不會給我們開放特許,因此這種方式僅僅能用於測試ApplePay的功能和API嚐鮮,並不適用於生產中。
ApplePay官網上有列出中國目前支援並提供SDK的第三方提供商
使用第三方SDK接入的優點是開發成本比較低,並且各自都應該有高度定製的Payment Sheet(因訂單資訊完整度的不同),可供定製更詳細的商品資訊展示,缺點就是要錢。
若我們選擇後者,相對開發成本會高,移動端不僅需要對支援性進行驗證,協商銀聯介面資料對Payment Sheet的展示關閉進行控制,對各種異常進行捕抓和處理,同時後臺需要自己實現對銀聯介面的認證互動,對交易資料的標準封裝,訂單狀態的處理,支付資訊的解密等。
我們選擇使用銀聯SDK接入這種折中的方式,免費,工作量可以接受。
使用銀聯SDK接入的實現方式如圖所示,主要工作是商戶後臺利用現成的API與銀聯的互動:
申請MerchantID並更新你的證照:
向蘋果申請我們獨有的商戶ID,這裡我借用Yasin朋友在簡書上分享的詳細步驟,真的很詳細易懂。
獲得MerchantId後,更新你的證照,並且於專案->targets->Capabilities中開啟ApplePay許可權,選擇正確的MerchantID,讓三個steps成為tick狀態完全許可權的配置。
ok開始與銀聯碰頭,於銀聯商家技術服務中心找到ApplePay入口,然後在”技術文件”選項卡中可以找到相應的SDK和後臺文件。
這裡我使用PHP後臺,在下載的SDK壓縮包裡找到了PHP Version SDK,忽略掉這個外殼,我們需要將子資料夾upacp_demo_app部署到我們的伺服器中。
這裡我將upacp_demo_app部署到我mac的PHP環境中,開啟upacp_demo_app/demo/api_05_app可以看見各種對訂單處理的介面。
訂單的建立,取消,查詢,退款等,現在我們測試下建立訂單介面
訂單引數
下圖是建立訂單的請求引數,目前銀聯建立ApplePay訂單僅支援圖中所示的引數欄位,基本滿足使用但可定製性比較低,最基本的訂單引數merId商戶號,orderId訂單號,txnTime訂單傳送時間,txnAmt訂單金額,目前測試階段我們可以通過直接呼叫此介面post傳參,也可以直接寫死在php檔案中
- 注意:這裡的merId是銀聯商戶號,而非蘋果分配的MerchantID。
測試證照
瞭解到這裡後還沒有具備生成訂單的條件,然後我們需要配置配置簽名證照和驗簽證照的路徑,這些證照在SDK下載包裡面已經有附帶,我們只需要在upacp_demo_app/sdk/SDKConfig.php檔案中配置好他們的路徑即可
這裡需要配置主機的絕對路徑,不能使用專案相對路徑,完成SDK_SIGN_CERT_PATH,SDK_ENCRYPT_CERT_PATH,SDK_VERIFY_CERT_DIR路徑的配置
成功獲取tn
我們請求下Form_6_2_AppConsume.php介面,即可建立訂單,並且返回對應的Trade Name
,在App端我們就是拿這個Trade Name來對相應的訂單進行付款。
拿到訂單tn後,我們已經可以使用銀聯SDK調起支付,在這之前還要做的就是對裝置和平臺的支援性檢測,通過,present出Payment Sheet即可。
工程配置:
1.新增SDK包:
將下載SDK解壓包中找到applePaySDK資料夾,加入到需要接入ApplePay的專案中。
**這裡注意,專案內如果同時支援銀聯普通支付的話,因為兩個庫引用重複,最好的辦法就是升級銀聯SDK至最新版本(3.3.3),當然可以使用新增Linker Flags的方式解決,或者可以自己剝離掉重複部分,我是懶人,我選擇升級哈哈。
2.為工程引入必須的framework:
- CFNetwork.framework
- PassKit.framework
- SystemConfiguration/framework
- libUPAPayPlugin.a
- libz.1.2.5.tbd
3.銀聯SDK使用http請求,在ios9以後需在工程plist檔案中新增NSAppTransportSecurity來支援Http繼續使用。
—注意—
- 因為銀聯SDK內部分程式碼是由C/C++組織,這裡必須新增libz.1.2.5.tbd,並且將引用到UPAPayPlugin.h的原始檔的字尾改為.mm
- 同時檢查Target->Build Settings->Search Paths->Library Search Paths中自定義庫libUPAPayPlugin.a的路徑是否正確
4.最後可以開始寫程式碼了,在需要調起ApplePay支付控制元件的檔案中引入標頭檔案UPAPayPlugin.h(記得檔名字尾需要改成.mm),PassKit/PassKit.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
- (void)verifiesApplePayAbility { if (![PKPaymentAuthorizationViewController class]) { //檢查系統版本支援性 PopMessage(@"當前系統版本不支援ApplePay,最低支援:iphone6, ios9.0以上"); return; } else if (![PKPaymentAuthorizationViewController canMakePayments]) { //檢查裝置支援性 PopMessage(@"當前裝置不支援ApplePay,最低支援:iphone6, ios9.0以上"); return; } else { //檢查卡片支援性 NSArray *supportedNetwork = @[PKPaymentNetworkVisa, PKPaymentNetworkMasterCard, PKPaymentNetworkChinaUnionPay, PKPaymentNetworkAmex, PKPaymentNetworkDiscover]; if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetwork]) { PopMessage(@"沒有繫結支援的卡片"); return; } } //調起蘋果支付控制元件 [self presentPaymentSheet]; } - (void)presentPaymentSheet { WaitingMessage(@"正在撥出ApplePay支付控制元件"); [UPAPayPlugin startPay:yourPayTn mode:self.applePayMode viewController:self delegate:self andAPMechantID:kAppleMechantId]; //-startPay 第一個引數是後臺向銀聯請求建立訂單獲得的商品tn //mode是字串,00為正式環境,01為測試環境 //此處的MechantID傳的是從蘋果那獲取的mechantId } |
如果需要對借記卡/信用卡作限制,在檢查卡片支援性的步驟可以這樣寫:
1 2 3 4 5 6 7 |
//檢查卡片支援性 NSArray *supportedNetwork = @[PKPaymentNetworkVisa, PKPaymentNetworkMasterCard, PKPaymentNetworkChinaUnionPay, PKPaymentNetworkAmex, PKPaymentNetworkDiscover]; PKMerchantCapability capabilities = PKMerchantCapabilityEMV | PKMerchantCapability3DS | PKMerchantCapabilityDebit; if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetwork capabilities:capabilities]) { PopMessage(@"沒有繫結支援的卡片,本支付僅支援使用借記卡支付"); return; } |
最後是銀聯ApplePay的支付回撥:
返回的UPPayResult物件中有各種支付狀態,同時我們還應該檢查他的otherInfo屬性,裡面包含銀聯的優惠活動資訊,如果有則應該在支付成功頁中告知客戶。
1 2 3 4 5 |
//實現UPAPayPluginDelegate - (void)UPAPayPluginResult:(UPPayResult *)payResult { //do something //檢查是否有銀聯優惠資訊,告知客戶 } |
otherInfo中包含優惠資訊的格式為:
1 |
otherInfo = "currency=元 |
!!!目前不支援商戶自定義優惠活動!!!
博主自己研究了php API很久後無果,諮詢銀聯客服,然後徹底死心。。
展示
以下左圖是通過銀聯SDK接入,因為可定製引數比較少,Payment Sheet比較簡短,右圖是使用蘋果API直接生成的訂單。
相信美團的ApplePay也是跟銀聯對接的,心血來潮買了個流量順便作下對比
生產環境:
csr檔案
若需要在生產環境中使用銀聯SDK接入ApplePay,首先需向銀聯申請開通ApplePay服務(聯絡下籤約服務),並從銀聯商戶服務平臺生成ApplePay專用的CSR檔案,重新去蘋果開發者網站簽署證照。
公鑰,私鑰
公鑰在SDK下載包裡面有,私鑰在cfca入網通知郵件裡面附帶也可以自行下載,一個商戶號唯一一份私鑰和授權碼,跟銀聯普通支付私鑰是同一份。
配置
修改生產環境配置檔案中的簽名證照,密碼,後臺url地址
更換正式環境商戶號(也可以是同一個)
app前端startPay方法的mode引數改為”00″