轉(zhuǎn)載并整理于博客園"大順子"博客
轉(zhuǎn)載并整理于CocoaChina-iOS開發(fā)
--參考資料
蘋果開發(fā)者中心-Apple Pay入門
PassKit Framework
Apple pay目前的設(shè)備支持情況
設(shè)備支持圖
可以看到對于iPhone主要是iphone6以上的設(shè)備
Apple Pay目前的系統(tǒng)支持情況
iOS8.0以上,但是需要注意的是直到iOS9.2才真正的支持銀聯(lián)支付
Apple Pay的集成
-
配置支付環(huán)境萌京、標(biāo)識符以及相應(yīng)的證書
- 創(chuàng)建一個(gè)工程闪彼,并設(shè)置好對應(yīng)的Bundle ID
- 注冊并配置一個(gè)商業(yè)標(biāo)識符(merchant ID)
- 添加一個(gè)App ID,并在App Services中勾選Apple Pay選項(xiàng)
- 配置一個(gè)Merchat ID秃流,并點(diǎn)擊Edit將選項(xiàng)勾選為Yes巫击,表示支持美國以外的地區(qū)支持支付
- 下載Merchant ID證書蚓哩,并且驗(yàn)證有效性
- 綁定Merchant ID到App ID
-
配置Xcode中的選項(xiàng)
- 更改iOS Deployment Target為8.0
- 在Target -> Capabilities 中開啟Apple Pay服務(wù)并選擇Marchat ID
-
步驟理解以及相應(yīng)的代碼實(shí)現(xiàn)
-
判斷當(dāng)前設(shè)備是否可以支付(包含兩個(gè)部分:1规婆、當(dāng)前設(shè)備的硬件是否支持泽裳;2隘谣、當(dāng)前設(shè)備的軟件環(huán)境是否支持)
// 1增拥、當(dāng)前設(shè)備是否支持Apple Pay if (![PKPaymentAuthorizationViewController canMakePayments]) { NSLog(@"當(dāng)前設(shè)備不支持Apple Pay支付"); }
-
判斷是否已經(jīng)添加了可以支付的銀行卡
// 2、判斷是否添加了可用于支付的銀行卡 // PKPaymentNetworkPrivateLabel為儲蓄卡/信用卡 if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkAmex,PKPaymentNetworkDiscover,PKPaymentNetworkMasterCard,PKPaymentNetworkPrivateLabel,PKPaymentNetworkVisa]]) { NSLog(@"沒有添加銀行卡"); // 2.1 當(dāng)沒有銀行卡的時(shí)候創(chuàng)建按鈕 PKPaymentButton *payButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline]; [payButton addTarget:self action:@selector(addCard:) forControlEvents:UIControlEventTouchUpInside]; //將payButton添加到頁面的指定位置上 }else{ // 2.2 當(dāng)有銀行卡的時(shí)候創(chuàng)建按鈕 PKPaymentButton *payButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypeBuy style:PKPaymentButtonStyleBlack]; [payButton addTarget:self action:@selector(pay:) forControlEvents:UIControlEventTouchUpInside]; //將payButton添加到頁面的指定位置上 } // 2.3 沒有銀行卡時(shí)跳轉(zhuǎn)至添加銀行卡頁面 - (void)addCard:(PKPaymentButton*)button{ PKPassLibrary *passLibrary = [[PKPassLibrary alloc] init]; if ([passLibrary isPaymentPassActivationAvailable]) { [passLibrary openPaymentSetup]; } } // 2.4 有銀行卡時(shí)跳轉(zhuǎn)至支付頁面 - (void)pay:(PKPaymentButton*)button{ //創(chuàng)建支付請求并進(jìn)行授權(quán)處理 }
-
創(chuàng)建一個(gè)支付請求寻歧,并配置各項(xiàng)信息
// 1跪者、創(chuàng)建一個(gè)支付請求 PKPaymentRequest *request = [[PKPaymentRequest alloc] init]; // 1.1 創(chuàng)建支付請求 // 1.1.1 配置 merchant id request.merchantIdentifier = @"xxx"; // 1.1.2 配置貨幣信息以及國家信息 request.countryCode = @"CN"; request.currencyCode = @"CNY"; // 1.1.3 配置請求支持的卡片類型 request.supportedNetworks = @[PKPaymentNetworkChinaUnionPay,PKPaymentNetworkVisa]; // 1.1.4 配置商家驗(yàn)證方式 request.merchantCapabilities = PKMerchantCapability3DS; // 1.1.5 配置商品列表(需要注意的點(diǎn)是paymentSummaryItems數(shù)組的最后一個(gè)成員應(yīng)該為總額) NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"12.6"]; PKPaymentSummaryItem *item = [PKPaymentSummaryItem summaryItemWithLabel:@"蘋果" amount:price]; NSDecimalNumber *totalPrice = [NSDecimalNumber decimalNumberWithString:@"12.6"]; PKPaymentSummaryItem *totalItemCost = [PKPaymentSummaryItem summaryItemWithLabel:@"總額" amount:totalPrice]; request.paymentSummaryItems = @[item,totalItemCost]; // 1.2 配置請求的附加項(xiàng) // 1.2.1 配置發(fā)票的收獲地址 request.requiredBillingAddressFields = PKAddressFieldAll; // 1.2.2 是否顯示收獲地址 request.requiredShippingAddressFields = PKAddressFieldAll; // 1.2.3 配置快遞方式 NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"12.0"]; PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@"順風(fēng)快遞" amount:number]; method.identifier = @"shunfeng"; method.detail = @"當(dāng)日可達(dá)"; request.shippingMethods = @[method];
-
彈出授權(quán)控制器,讓用戶進(jìn)行支付授權(quán)
// 彈出用戶支付授權(quán)頁面 PKPaymentAuthorizationViewController *authCtrl = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request]; authCtrl.delegate = self; [self presentViewController:authCtrl animated:YES completion:nil];
-
處理支付憑證熄求,以及彈出的模態(tài)控制器的處理
//支付憑證是一個(gè)需要由服務(wù)器參與的過程渣玲,蘋果通過產(chǎn)生支付憑證,發(fā)送給服務(wù)器弟晚, 服務(wù)器對憑證進(jìn)行處理忘衍,處理完之后將支付狀態(tài)返回給客戶端,讓客戶端進(jìn)行處理卿城。
憑證產(chǎn)生圖//具體的返回地方實(shí)在委托當(dāng)中 // 授權(quán)成功調(diào)用此方法 - (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus status))completion{ //服務(wù)器處理結(jié)果的過程 //payment中有一個(gè)token枚钓,包含支付信息,發(fā)送給服務(wù)器瑟押, 服務(wù)器進(jìn)行相應(yīng)的處理后返回一個(gè)支付狀態(tài)搀捷,然后客戶端進(jìn)行 處理; //可以對支付狀態(tài)進(jìn)行匹配多望。包含在PKPaymentAuthorizationStatus中嫩舟。 } // 授權(quán)是否結(jié)束,包括授權(quán)finish怀偷,或者取消授權(quán)家厌,對控制器的處理 - (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{ NSLog(@"授權(quán)完成"); [self dismissViewControllerAnimated:YES completion:nil]; }
-
-
服務(wù)器處理
- 驗(yàn)證支付數(shù)據(jù)的哈希表和簽名
- 為加密過的支付數(shù)據(jù)解碼
- 向支付處理系統(tǒng)提交支付數(shù)據(jù)
- 向訂單追蹤系統(tǒng)提交訂單
處理支付請求時(shí),你有兩個(gè)選擇椎工;你既可以利用支付平臺處理支付請求饭于,也可以自己實(shí)現(xiàn)支付請求處理流程蜀踏。一個(gè)常用的支付平臺可以完成上述大部分操作。
關(guān)于支持Apple Pay支付平臺的更多信息掰吕,請參考developer.apple.com/apple-pay/