
最近蘋果推出了一種新的支付方式–ApplePay支付,雖然毀譽參半,但是不得不承認國內很多的公司還有商家已經開通了ApplePay,可能最先鋒的莫過於肯德基和招商銀行了。拋開優劣與否不說,作為一個開發者自然要第一時間把ApplePay搞懂搞通,用不用再另說。
習慣了蘋果開發的人一定會料到,新的蘋果支付一定是需要一個新的證書的,沒錯,需要創建一個新的商業證書。

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

點擊continue

點擊register

現在新添加的Merchant ID已經顯示出來了,可以添加到列表裡了。

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

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


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

選擇剛才創建的證書進行上傳,並且點擊生成。

選擇描述文件選項,創建一個描述文件,然後點開他的詳細信息,點擊編輯。

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

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

2 在Capability標簽中把ApplePay選項打開,並且將MerchantIDs選中,如下圖

導入需要的框架對應的頭文件PassKit/PassKit.h 和AddressBook/AddressBook.h,並且遵循PKPaymentAuthorizationViewControllerDelegate
1 2 3
#import#import @interface ViewController ()
支付界面都是采用的PKPaymentAuthorizationViewController,每一條支付信息可以采用PKPaymentSummaryItem來進行編輯,最後調用蘋果支付的時候就是調用的這個頁面。
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 31 32 33 34 35 36 37 38 39
- (IBAction)payAction:(UIButton *)sender {
if([PKPaymentAuthorizationViewController canMakePayments]) {
NSLog(@"支持支付");
// 我們後面創建出來的支付頁面就是根據這個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];
// 這裡填的是就是我們創建的merchat IDs
request.merchantIdentifier = @"merchant.com.coderqi.applepay.pay";
request.merchantCapabilities = PKMerchantCapabilityEMV;
//增加郵箱及地址信息
request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;
// 根據request去創建支付頁面
PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
// 設置代理
paymentPane.delegate = self;
if (!paymentPane) {
NSLog(@"出問題了");
} else {
// 模態推出頁面
[self presentViewController:paymentPane animated:YES completion:nil];
}
} else {
NSLog(@"該設備不支持支付");
}
}
接下來就是代理回調的處理,服務器接收到了我們的請求之後收到返回信息會調用對應的方法。
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 31 32 33
#pragma mark ----支付狀態
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion{
/* //這是老版,已過時
NSError *error;
ABMultiValueRef addressMultiValue = ABRecordCopyValue(payment.billingAddress ,kABPersonAddressProperty);
NSDictionary*addressDictionary=(__bridge_transferNSDictionary*) ABMultiValueCopyValueAtIndex(addressMultiValue,0);
//這裡模擬取出地址裡的每一個信息。
NSLog(@"%@",addressDictionary[@"State"]);
NSData *json = [NSJSONSerialization dataWithJSONObject:addressDictionary options:NSJSONWritingPrettyPrinted error: &error];
//這裡需要將Token和地址信息發送到自己的服務器上,進行訂單處理,處理之後,根據自己的服務器返回的結果調用completion()代碼塊,根據傳進去的參數界面的顯示結果會不同
PKPaymentAuthorizationStatus status; //Fromyourserver
completion(status);
*/
//這是新版
//拿到token,
PKPaymentToken *token = payment.token;
//拿到訂單地址
NSString *city = payment.billingContact.postalAddress.city;
NSLog(@"city:%@",city);
///在這裡將token和地址發送到自己的服務器,有自己的服務器與銀行和商家進行接口調用和支付將結果返回到這裡
//我們根據結果生成對應的狀態對象,根據狀態對象顯示不同的支付結構
//狀態對象
PKPaymentAuthorizationStatus status = PKPaymentAuthorizationStatusFailure;
completion(status);
}
#pragma mark ----支付完成
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {
// 支付完成後讓支付頁面消失
[controller dismissViewControllerAnimated:YES completion:nil];
}