最近蘋果推出了一種新的支付方式–ApplePay支付,雖然毀譽參半,但是不得不承認(rèn)國內(nèi)很多的公司
還有商家已經(jīng)開通了ApplePay,可能最先鋒的莫過于肯德基和招商銀行了。拋開優(yōu)劣與否不說,
作為一個開發(fā)者自然要第一時間把ApplePay搞懂搞通,用不用再另說。
ApplePay的支付流程
在具體去進(jìn)行每一步操作的時候一定要先了解一下ApplePay的具體的操作流程。
這里是官方給出的開發(fā)者文檔。所有的流程步驟還有邏輯流程都可以在這里找到答案。
使用ApplePay開發(fā)同樣的需要一個商戶ID,開通權(quán)限,然后根據(jù)需求拼接支付請求。
Apple Pay會對支付信息進(jìn)行加密處理,以防止未獲授權(quán)的第三方獲取用戶的支付信息。
剩下的就是在自己的服務(wù)器上進(jìn)行支付流程和處理了。
ApplePay的開發(fā)流程
1 : 獲取證書
蘋果證書幫助
習(xí)慣了蘋果開發(fā)的人一定會料到,新的蘋果支付一定是需要一個新的證書的,沒錯,
需要創(chuàng)建一個新的商業(yè)證書。

選擇右側(cè)的[Merchant IDs],點擊右上角的添加。

點擊continue

點擊register

現(xiàn)在新添加的Merchant ID已經(jīng)顯示出來了,可以添加到列表里了。

將剛剛添加的MerchantID選中,選擇編輯。

將選項改為Yes,點Continue。再繼續(xù)Continue。然后會需要上傳一個證書。這個時候來到本地打開鑰匙串,生成本地證書,我這里直接貼每一步的截圖了。


將生成的證書放到桌面上。

選擇剛才創(chuàng)建的證書進(jìn)行上傳,并且點擊生成。

選擇描述文件選項,創(chuàng)建一個描述文件,然后點開他的詳細(xì)信息,點擊編輯。

確認(rèn)ApplePay的兩個選項都是enable。如果不是,點擊edit將其勾選上。

生成對應(yīng)的描述文件,在本地運行添加到鑰匙串中。
2 : 工程配置
創(chuàng)建一個新工程,需要注意兩點:
1 在BuildIdentifier中設(shè)置的必須和描述文件一樣。

2 在Capability標(biāo)簽中把ApplePay選項打開,并且將MerchantIDs選中,如下圖

3 代碼編寫
1 導(dǎo)入頭文件
導(dǎo)入需要的框架對應(yīng)的頭文件PassKit/PassKit.h 和AddressBook/AddressBook.h,
并且遵循 PKPaymentAuthorizationViewControllerDelegate
#import <PassKit/PassKit.h>
#import <AddressBook/AddressBook.h>
@interface ViewController ()<PKPaymentAuthorizationViewControllerDelegate>
2: 處理支付頁面
支付界面都是采用的PKPaymentAuthorizationViewController,每一條支付信息可以采用PKPaymentSummaryItem來進(jìn)行編輯,最后調(diào)用蘋果支付的時候就是調(diào)用的這個頁面。
- (IBAction)payAction:(UIButton *)sender {
if([PKPaymentAuthorizationViewController canMakePayments]) {
NSLog(@”支持支付”);
// 我們后面創(chuàng)建出來的支付頁面就是根據(jù)這個request
PKPaymentRequest request = [[PKPaymentRequest alloc] init];
// 商品目錄
PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem summaryItemWithLabel:@”麻辣燙”* amount:[NSDecimalNumber decimalNumberWithString:@”0.01”]];
PKPaymentSummaryItem widget2 = [PKPaymentSummaryItem summaryItemWithLabel:@”肯德基” amount:[NSDecimalNumber decimalNumberWithString:@”0.01”]];
PKPaymentSummaryItem *widget3 = [PKPaymentSummaryItem summaryItemWithLabel:@”海鮮大餐”* amount:[NSDecimalNumber decimalNumberWithString:@”0.02”]];
PKPaymentSummaryItem widget4 = [PKPaymentSummaryItem summaryItemWithLabel:@”coderqi” amount:[NSDecimalNumber decimalNumberWithString:@”0.03”] type:PKPaymentSummaryItemTypeFinal];
request.paymentSummaryItems = @[widget1, widget2, widget3, widget4];
// request.countryCode = @”CN”;
// request.currencyCode = @”CNY”;//人民幣
request.countryCode = @”US”;
request.currencyCode = @”USD”;
request.supportedNetworks = @[PKPaymentNetworkChinaUnionPay, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa];
// 這里填的是就是我們創(chuàng)建的merchat IDs
request.merchantIdentifier = @”merchant.com.coderqi.applepay.pay”;
request.merchantCapabilities = PKMerchantCapabilityEMV;
//增加郵箱及地址信息
request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;
// 根據(jù)request去創(chuàng)建支付頁面
PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
// 設(shè)置代理 paymentPane.delegate = self;
if (!paymentPane) {
NSLog(@”出問題了”);
} else {
// 模態(tài)推出頁面
[self presentViewController:paymentPane animated:YES completion:nil];
} } else {
NSLog(@”該設(shè)備不支持支付”);
}}
3 : 編寫代理回調(diào)
接下來就是代理回調(diào)的處理,服務(wù)器接收到了我們的請求之后收到返回信息會調(diào)用對應(yīng)的方法。
#pragma mark —-支付狀態(tài)
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller*
didAuthorizePayment:(PKPayment )payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion{
/* //這是老版,已過時*
NSError error;
ABMultiValueRef addressMultiValue = ABRecordCopyValue(payment.billingAddress ,kABPersonAddressProperty); NSDictionary *addressDictionary = (__bridge_transfer NSDictionary *) ABMultiValueCopyValueAtIndex(addressMultiValue, 0);
//這里模擬取出地址里的每一個信息。
NSLog(@”%@”,addressDictionary[@”State”]);
NSData *json = [NSJSONSerialization dataWithJSONObject:addressDictionary options:NSJSONWritingPrettyPrinted error: &error];
// 這里需要將Token和地址信息發(fā)送到自己的服務(wù)器上,
進(jìn)行訂單處理,處理之后,根據(jù)自己的服務(wù)器返回的結(jié)果調(diào)用completion()代碼塊,
根據(jù)傳進(jìn)去的參數(shù)界面的顯示結(jié)果會不同
PKPaymentAuthorizationStatus status;
// From your server completion(status);
/ //這是新版 //拿到token, PKPaymentToken *token = payment.token;*
//拿到訂單地址
NSString city = payment.billingContact.postalAddress.city;
NSLog(@”city:%@”,city);
///在這里將token和地址發(fā)送到自己的服務(wù)器,
有自己的服務(wù)器與銀行和商家進(jìn)行接口調(diào)用和支付將結(jié)果返回到這里
//我們根據(jù)結(jié)果生成對應(yīng)的狀態(tài)對象,根據(jù)狀態(tài)對象顯示不同的支付結(jié)構(gòu)
//狀態(tài)對象
PKPaymentAuthorizationStatus status = PKPaymentAuthorizationStatusFailure; completion(status);
}
#pragma mark —-支付完成
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
// 支付完成后讓支付頁面消失
[controller dismissViewControllerAnimated:YES completion:nil];
}
好了,到這里就完事兒了。
好了,到這里就完事兒了。最后,將工程的代碼貼在后邊,各位看官可以隨意下載。代碼Demo。
附贈大神錄得視頻地址:優(yōu)酷:http://v.youku.com/v_show/id_XMTQ4Njk0NTE2MA==.html