Apple Pay入門
概述
利用apple,用戶可以在您的app中輕松地購買實(shí)物商品和服務(wù)耕挨∮德Γ客戶更喜歡使用 Apple Pay耸弄,因?yàn)樗麄冊(cè)谫徫飼r(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 之后,客戶的忠誠度和購買頻率也都提高了谤饭。
在您的 App 中查辩,用戶可以使用 Touch ID 為付款授權(quán),以釋放安全地存儲(chǔ)在 iPhone 和 iPad 上的令牌化信用卡和借記卡付款憑證网持。此外,用戶還可將其賬單长踊、送貨和聯(lián)系人信息存儲(chǔ)在 Wallet 這一 App 中功舀。這樣一來,當(dāng)客戶在您的 App 中使用 Touch ID 為購買項(xiàng)目授權(quán)時(shí)身弊,系統(tǒng)就會(huì)隨付款憑證一道提供這些信息辟汰。
目前,Apple Pay 可在澳大利亞阱佛、加拿大帖汞、中國、英國和美國使用凑术。
先決條件
除了使用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è)購物車的標(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];
}