1. 配置支付環境
使用XCode創建一個工程, 并設置好對應的BundleID
注冊并配置一個商業標示符
(1)添加一個App ID, 并勾選Apple Pay功能
(2)配置Merchant ID
(3)為Merchant ID 配置證書, 并下載證書安裝到鑰匙串
(4)檢查安裝到鑰匙串中的證書是否有效
問題描述: 有可能會出現
提示
問題原因:?系統根證書/中級證書頒發機構過期
解決方案: ??重新下載證書, 并安裝,具體下載列表看下圖
(5)綁定Merchant ID 到 APP ID
2. 配置Xcode 項目
調整系統最低部署版本(iOS8.0)
開啟Apple Pay功能
注意: 以上步驟截圖, 只是關鍵處截圖, 如果在具體細節處遇到問題, 歡迎關注公眾號(王順子),共同探討。或者參照具體視頻教程, 鏈接地址, 后續附上。
3.?代碼實現
(1)判斷當前設備是否可以支付
1
5if(![PKPaymentAuthorizationViewController canMakePayments])
{
NSLog(@"不能支付");
return;
}
(2)判斷"Wallet有沒有添加該支付網絡的儲蓄卡/信用卡"
1
12if(![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay]]) {
NSLog(@"Wallet沒有添加該支付網絡的儲蓄卡/信用卡");
// 創建一個設置按鈕
//??????? PKPaymentButton *button = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline];
//??????? [button addTarget:self action:@selector(jump) forControlEvents:UIControlEventTouchUpInside];
//??????? button.center = self.view.center;
//??????? [self.view addSubview:button];
return;
}
(3)創建一個支付請求, 并配置各項信息
// 1. 創建一個支付請求
51// 1. 創建一個支付請求
PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
// 2. 參數配置
// 2.1 商店標識
request.merchantIdentifier = @"merchant.520it.com";
// 2.2 貨幣代碼
request.currencyCode = @"CNY";
// 2.3 國家編碼
request.countryCode = @"CN";
// 2.4 支持的支付網絡(PKPaymentNetworkChinaUnionPay iOS9.2開始支持)
request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay];
// 2.5 支付請求包含一個支付摘要項目的列表
NSDecimalNumber*price1 = [NSDecimalNumberdecimalNumberWithString:@"2"];
PKPaymentSummaryItem *item1 = [PKPaymentSummaryItem summaryItemWithLabel:@"手榴彈"amount:price1];
NSDecimalNumber*price2 = [NSDecimalNumberdecimalNumberWithString:@"6"];
PKPaymentSummaryItem *item2 = [PKPaymentSummaryItem summaryItemWithLabel:@"炸彈"amount:price2 type:PKPaymentSummaryItemTypePending];
NSDecimalNumber*totalAmount = [NSDecimalNumberzero];
totalAmount = [totalAmount decimalNumberByAdding:price1];
totalAmount = [totalAmount decimalNumberByAdding:price2];
PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"小碼哥財務中心"amount:totalAmount type:PKPaymentSummaryItemTypePending];
// 注意: 數組最后一個是總價格
request.paymentSummaryItems = @[item1, item2, total];
// 2.6 運輸方式
NSDecimalNumber*shippingPrice = [NSDecimalNumberdecimalNumberWithString:@"18.0"];
PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@"順豐快遞"amount:shippingPrice];
method.detail = @"24小時送到!";
method.identifier = @"shunfeng";
request.shippingMethods = @[method];
request.shippingType = PKShippingTypeServicePickup;
// 2.7 通過指定merchantCapabilities屬性來指定你支持的支付處理標準,3DS支付方式是必須支持的,EMV方式是可選的,
request.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV | PKMerchantCapabilityCredit | PKMerchantCapabilityDebit;
// 2.8 需要的配送信息和賬單信息
request.requiredBillingAddressFields = PKAddressFieldAll;
request.requiredShippingAddressFields = PKAddressFieldAll;
// 2.9 存儲額外信息
// 使用applicationData屬性來存儲一些在你的應用中關于這次支付請求的唯一標識信息,比如一個購物車的標識符。在用戶授權支付之后,這個屬性的哈希值會出現在這次支付的token中。
request.applicationData = [@"購物車ID: 123456"dataUsingEncoding:NSUTF8StringEncoding];
(4)彈出授權控制器,讓用戶給支付授權
// 3. 開始支付
8// 3. 開始支付
PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
if(paymentPane ==nil) {
NSLog(@"授權控制器創建失敗");
return;
}
paymentPane.delegate =self;
[selfpresentViewController:paymentPane animated:YEScompletion:nil];
(5)處理支付憑證(token)
/**
*? 當授權成功之后會調用這個代理方法
*/
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void(^)(PKPaymentAuthorizationStatus status))completion;
{
//??? PKPayment *temp = payment;
NSLog(@"驗證授權---%@", payment.token);
NSLog(@"驗證通過后, 需要開發者繼續完成交易");
// 它需要你連接服務器并上傳支付令牌和 其他信息,以完成整個支付流程。
BOOLisSuccess =YES;
if(isSuccess) {
completion(PKPaymentAuthorizationStatusSuccess);
}else
{
completion(PKPaymentAuthorizationStatusFailure);
}
}
(6)關閉授權控制器
/**
*? 當授權成功之后或者取消授權之后會調用這個代理方法
*/
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
NSLog(@"取消或者交易完成");
[selfdismissViewControllerAnimated:YEScompletion:nil];
}
*?支付授權的流程:
框架發送支付請求給安全模塊,只有安全模塊可以訪問存儲在設備上的標記化的卡信息。
安全模塊把特定的卡和商家等支付數據加密,以保證只有蘋果可以讀取,然后發送給框架??蚣軙⑦@些數據發送給蘋果。
蘋果服務器再次加密這些支付數據,以保證只有商家可以讀取。然后服務器對它進行簽名,生成支付token,然后發送給設備。
框架調用相應的代理方法并傳入這個token,然后你的代理方法傳送token給你的服務器。
4. 服務器接收到token后的一般處理流程
驗證支付數據的哈希表和簽名
為加密過的支付數據解碼
向支付處理系統提交支付數據
向訂單追蹤系統提交訂單
處理支付請求時,你有兩個選擇;你既可以利用支付平臺處理支付請求,也可以自己實現支付請求處理流程。一個常用的支付平臺可以完成上述大部分操作。
關于支持Apple Pay支付平臺的更多信息,請參考developer.apple.com/apple-pay/