Apple Pay入門
概述
利用apple,用戶可以在您的app中輕松地購(gòu)買實(shí)物商品和服務(wù)??蛻舾矚g使用 Apple Pay,因?yàn)樗麄冊(cè)谫?gòu)物時(shí)無需輸入賬單、送貨和聯(lián)系人詳細(xì)信息。而且,Apple Pay 具有更高的安全性,能讓客戶和開發(fā)者安心使用。Apple 不會(huì)存儲(chǔ)或共享客戶的實(shí)際信用卡和借記卡卡號(hào),因此商家和 App 開發(fā)者無需負(fù)責(zé)管理和保護(hù)實(shí)際的信用卡和借記卡卡號(hào)。
由于具備這些優(yōu)點(diǎn),在按照推薦方式實(shí)施了 Apple Pay 之后,開發(fā)者的結(jié)賬轉(zhuǎn)換率提高為原來的 2 倍,結(jié)賬時(shí)間也大幅縮短;而且,在整合了 Apple Pay 之后,客戶的忠誠(chéng)度和購(gòu)買頻率也都提高了。
在您的 App 中,用戶可以使用 Touch ID 為付款授權(quán),以釋放安全地存儲(chǔ)在 iPhone 和 iPad 上的令牌化信用卡和借記卡付款憑證。此外,用戶還可將其賬單、送貨和聯(lián)系人信息存儲(chǔ)在 Wallet 這一 App 中。這樣一來,當(dāng)客戶在您的 App 中使用 Touch ID 為購(gòu)買項(xiàng)目授權(quán)時(shí),系統(tǒng)就會(huì)隨付款憑證一道提供這些信息。
目前,Apple Pay 可在澳大利亞、加拿大、中國(guó)、英國(guó)和美國(guó)使用。
先決條件
除了使用PassKit 框架實(shí)施 Apple Pay 之外,您還必須:
- 通過付款處理機(jī)構(gòu)或網(wǎng)關(guān)設(shè)置一個(gè)帳戶。
- 通過“證書、標(biāo)識(shí)符和描述文件”(“Certificates, Identifiers & Profiles”)注冊(cè)一個(gè)商家 ID。
- 生成一個(gè) Apple Pay 證書,用于加密和解密付款令牌
- 在您的 App 中包括一個(gè) Apple Pay 授權(quán)
- 遵循“應(yīng)用審核準(zhǔn)則”的第 29 節(jié)中列出的要求
- 遵循《App 審核準(zhǔn)則》(“App Review Guidelines”)第 29 節(jié)中列出的要求。
在App中設(shè)置Apple Pay

? ? ? ?第一步先修改target為iOS 8.1,然后在項(xiàng)目Capabilities里將Apple Pay設(shè)置為on,這將自動(dòng)導(dǎo)入需要的庫文件,然后添加一個(gè)權(quán)限文件并設(shè)置,最后修改或創(chuàng)建你的App ID。

? ? ? ?如果沒有有效merchant ID,我們需要?jiǎng)?chuàng)建一個(gè),訪問蘋果iOS 開發(fā)者中心的位于Identifiers > Merchant ID的頁面。
? ? ? ?跟隨創(chuàng)建流程創(chuàng)建完成后,我們需要給Merchant ID添加一個(gè)證書簽名請(qǐng)求(Certificate Signing Request),以便加密支付令牌來保證其安全性。為達(dá)到這個(gè)目的,導(dǎo)航至你的Merchant ID,并點(diǎn)擊Edit按鈕來修改它。跟隨流程添加證書簽名請(qǐng)求
? ? ? ?編輯完成后回到Xcode,刷新Merchant ID區(qū)塊。選中merchant ID 然后進(jìn)入代碼編寫
編寫代碼
- 在適當(dāng)?shù)奈募袑?dǎo)入passkit框架
#import <PassKit/PassKit.h> - 遵循代理協(xié)議
@interface ViewController () <PKPaymentAuthorizationViewControllerDelegate> - 創(chuàng)建支付請(qǐng)求
首先確認(rèn)設(shè)備是否支持Apple Pay支付
if([PKPaymentAuthorizationViewController canMakePayments])
接下來開始創(chuàng)建Apple Pay支付請(qǐng)求
PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
request.countryCode = @"CN";
request.currencyCode = @"CNY";
request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa];
request.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV;
request.merchantIdentifier = @"merchant.com.UNIBOX.UNIBOX";
request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;
request.requiredShippingAddressFields = PKAddressFieldPostalAddress;
currencyCode列表查詢
countryCode列表查詢
supportedNetworks 支持的支付方式
通過在supportedNetworks屬性中填入字符串常量數(shù)組來指定你支持的支付網(wǎng)絡(luò)。通過指定merchantCapabilities屬性來指定你支持的支付處理標(biāo)準(zhǔn),3DS支付方式是必須支持的,EMV方式是可選的。
通過填充 requiredBillingAddressFields和 requiredShippingAddressFields屬性來指定所需賬單信息和配送地址信息
使用applicationData屬性來存儲(chǔ)一些在你的應(yīng)用中關(guān)于這次支付請(qǐng)求的唯一標(biāo)識(shí)信息,比如一個(gè)購(gòu)物車的標(biāo)識(shí)符。在用戶授權(quán)支付之后,這個(gè)屬性的哈希值會(huì)出現(xiàn)在這次支付的token中。
-
添加物品到支付頁
使用PKPaymentSummaryItem來創(chuàng)建物品并顯示,這個(gè)對(duì)象描述了一個(gè)物品和它的價(jià)格,數(shù)組最后的對(duì)象必須是總價(jià)格。
PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem summaryItemWithLabel:@"Widget 1" amount:[NSDecimalNumber decimalNumberWithString:@"0.99"]];PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem summaryItemWithLabel:@"Widget 2" amount:[NSDecimalNumber decimalNumberWithString:@"1.00"]]; PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"My Company Name" amount:[NSDecimalNumber decimalNumberWithString:@"1.99"]]; request.paymentSummaryItems = @[widget1, widget2, total]; 配置配送方式
PKShippingMethod *method1 = [PKShippingMethod summaryItemWithLabel:@"24小時(shí)內(nèi)配送" amount:[NSDecimalNumber decimalNumberWithString:@"10。00"]];
method1.detail = @"24小時(shí)內(nèi)配送";
method1.identifier = @"24hours";
PKShippingMethod *method2 = [PKShippingMethod summaryItemWithLabel:@"兩天內(nèi)配送" amount:[NSDecimalNumber decimalNumberWithString:@"5.00"]];
method2.detail = @"兩天內(nèi)配送";
method2.identifier = @"2days";
request.shippingMethods = @[method1,method2];顯示認(rèn)證視圖
PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
paymentPane.delegate = self;
[self presentViewController:paymentPane animated:YES completion:nil];代理說明
送貨地址回調(diào)
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingContact:(PKContact *)contact
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<pkshippingmethod *> * _Nonnull, NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{
//contact送貨地址信息,PKContact類型
//送貨信息選擇回調(diào),如果需要根據(jù)送貨地址調(diào)整送貨方式,比如普通地區(qū)包郵+極速配送,偏遠(yuǎn)地區(qū)只有付費(fèi)普通配送,進(jìn)行支付金額重新計(jì)算,可以實(shí)現(xiàn)該代理,返回給系統(tǒng):shippingMethods配送方式,summaryItems賬單列表,如果不支持該送貨信息返回想要的PKPaymentAuthorizationStatus
completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, summaryItems);
}
送貨方式回調(diào)
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingMethod:(PKShippingMethod *)shippingMethod
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{
//配送方式回調(diào),如果需要根據(jù)不同的送貨方式進(jìn)行支付金額的調(diào)整,比如包郵和付費(fèi)加速配送,可以實(shí)現(xiàn)該代理
completion(PKPaymentAuthorizationStatusSuccess, summaryItems);
}
支付卡選擇回調(diào)
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectPaymentMethod:(PKPaymentMethod *)paymentMethod completion:(void (^)(NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{
//支付銀行卡回調(diào),如果需要根據(jù)不同的銀行調(diào)整付費(fèi)金額,可以實(shí)現(xiàn)該代理
completion(summaryItems);
}
付款成功蘋果服務(wù)器返回信息回調(diào),做服務(wù)器驗(yàn)證
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion {
PKPaymentToken *payToken = payment.token;
//支付憑據(jù),發(fā)給服務(wù)端進(jìn)行驗(yàn)證支付是否真實(shí)有效
PKContact *billingContact = payment.billingContact; //賬單信息
PKContact *shippingContact = payment.shippingContact; //送貨信息
PKContact *shippingMethod = payment.shippingMethod; //送貨方式
//等待服務(wù)器返回結(jié)果后再進(jìn)行系統(tǒng)block調(diào)用
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//模擬服務(wù)器通信
completion(PKPaymentAuthorizationStatusSuccess);
});
}
支付完成回調(diào)
-(void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{
[controller dismissViewControllerAnimated:YES completion:nil];
}