版權聲明:本文為作者原創文章, 如果有相同的或者相似的,那將是我的榮幸。
Apple Pay是什么?
Apple Pay目前在國內上線已有一段時間,這意味著消費者可通過 蘋果手機、蘋果手表
等智能設備來進行支付,它的功能類似一個“卡包”,講實體銀行卡虛擬到手機里,用戶可以綁定儲蓄卡或信用卡
實現刷卡支付。
為什么使用Apple Pay
從理論上看:微信支付也好、支付寶也好,均屬于“結算平臺”,他們會透過銀聯,從你的銀行里提出現金代為托管;直至你把金錢放回銀行之前,都只能在微信/支付寶上使用。但 Apple Pay 只是一張電子信用卡,你的錢仍然在銀行里,付款時直接從銀聯向銀行提取。而從技上術上,微信支付也好、支付寶也好,在付款時都要透過相機或條碼機,讀取一次性的二維碼;而 Apple Pay 則透過近場通信 (NFC) 的方式,讀取 iPhone 上的 Token 令牌。
從實際上看:目前微信支付及支付寶的優勢在于低入場門檻:商店只要有臺智能手機,就毋須為移動支付購入/租用新設備,而消費者也不需要很高端的旗艦級設備。而 Apple Pay 優勢是良好的用戶體驗,使用 Apple Pay 付費,既安全、又快捷、隱私度也比較高。
設備支持有哪些要求?
Apple Pay需要支持NFC
功能,目前只限于iPhone 6s、iPhone 6s Plus、iPhone 6、iPhone 6 Plus和Apple Watch這幾款設備使用。同時,用戶需講手機操作系統版本升級到iOS 9.2
以上,Apple Watch則需要Watch OS 2.1
版本以上。
Apple Pay如何使用?
在iPhone
上,先打開系統自帶的Wallet
應用,后點右上角的?
符號,這時你有兩個選擇,可以用攝像頭拍卡就能識別,也可以手動輸入,或者通過iTunes綁定,至于Apple Watch
怎么使用,應該操作差不多,具體情況本人未去實踐,還望諒解。
Apple Pay環境配置
-
配置Bundle ID
14671699608022.jpg -
添加商戶的ID
14671702234549.jpg -
把工程中對應的Bundle ID添加進去
14671703281837.jpg -
點擊創建好的商戶ID
14671705166905.jpg -
編輯商戶ID
14671711439975.jpg -
添加CSR文件
14671714784874.jpg
-
下載配置好的商戶ID
14671715087391.jpg
14671715713657.jpg -
創建對應的App IDs
14671716587260.jpg -
勾選Apple Pay
14671717034194.jpg -
配置支付環境
14671720852032.jpg
-
Clean一下工程,如果工程自動添加此文件則以上步驟正確
14671720005926.jpg
App項目內部集成方式
Apple Pay使用了PassKit框架,所以需要導入相應頭文件
#import <PassKit/PassKit.h>
接收Apple Pay處理信息的回調,需要遵守協議,實現相應的代理方法
@interface ViewController ()<PKPaymentAuthorizationViewControllerDelegate>
@end
為了方便測試,觸發支付操作時間寫在touchBegan:
方法中
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// code...
}
具體代碼實現如下:
- 判斷設備是否支持Apple Pay快捷支付功能
if (![PKPaymentAuthorizationViewController canMakePayments]) {
// 提示用戶該設備不支持Apple Pay快捷支付功能
// code...
return;
}
- 判斷設備是否綁定過可支付的銀行卡
/**
* 若沒有可用銀行卡,則跳轉到設置銀行卡界面
* PKPaymentNetworkVisa Visa國際卡
* PKPaymentNetworkChinaUnionPay 中國銀聯
* PKPaymentNetworkDiscover Discover(美國流行的信用卡)
*/
if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay, PKPaymentNetworkDiscover]]) {
// 進入設置銀行卡界面
[[[PKPassLibrary alloc] init] openPaymentSetup];
}
- 設置商品參數
// 創建商品
NSDecimalNumber *firstAmount = [NSDecimalNumber decimalNumberWithString:@"1.11"];
NSDecimalNumber *secondAmount = [NSDecimalNumber decimalNumberWithString:@"2.22"];
NSDecimalNumber *thirdAmount = [NSDecimalNumber decimalNumberWithString:@"3.33"];
NSDecimalNumber *amountSum = [NSDecimalNumber zero];
amountSum = [amountSum decimalNumberByAdding:firstAmount];
amountSum = [amountSum decimalNumberByAdding:secondAmount];
amountSum = [amountSum decimalNumberByAdding:thirdAmount];
/**
* @param label 商品名稱(英文名稱默認全部顯示大寫)
* @param amount 商品價格 - NSDecimalNumber類型
*/
PKPaymentSummaryItem *firstItem = [PKPaymentSummaryItem summaryItemWithLabel:@"FirstItem" amount:firstAmount];
PKPaymentSummaryItem *secondItem = [PKPaymentSummaryItem summaryItemWithLabel:@"SecondItem" amount:secondAmount];
PKPaymentSummaryItem *thirdItem = [PKPaymentSummaryItem summaryItemWithLabel:@"ThirdtItem" amount:thirdAmount];
PKPaymentSummaryItem *itemsSum = [PKPaymentSummaryItem summaryItemWithLabel:@"PJChao" amount:amountSum];
- 創建支付請求(基本配置)
PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
// 設置商戶ID(merchant IDs)
request.merchantIdentifier = @"merchant.com.zpj.ApplePayTest";
// 設置國家代碼(中國大陸)
request.countryCode = @"CN";
// 設置支付貨幣(人民幣)
request.currencyCode = @"CNY";
// 設置商戶的支付標準(3DS支付方式必須支持,其他方式可選)
request.merchantCapabilities = PKMerchantCapability3DS;
request.paymentSummaryItems = @[firstItem, secondItem, thirdItem, itemsSum];
/**
* 以上參數都是必須的
* 以下參數不是必須的
*/
// 設置收據內容
request.requiredBillingAddressFields = PKAddressFieldAll;
// 設置送貨內容
request.requiredShippingAddressFields = PKAddressFieldAll;
// 設置送貨方式
PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@"阿敏" amount:[NSDecimalNumber decimalNumberWithString:@"10.00"]];
method.identifier = @"阿敏物流";
method.detail = @"12小時到達";
request.shippingMethods = @[method];
- 顯示支付界面
PKPaymentAuthorizationViewController *paymentVC = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
paymentVC.delegate = self;
if (paymentVC == nil) return;
[self presentViewController:paymentVC animated:YES completion:nil];
- 代理方法的實現
#pragma mark - <PKPaymentAuthorizationViewControllerDelegate>
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion
{
/**
* 在這里支付信息應發送給服務器/第三方的SDK(銀聯SDK/易寶支付SDK/易智付SDK等)
* 再根據服務器返回的支付成功與否進行不同處理
* 這里直接返回支付成功
*/
completion(PKPaymentAuthorizationStatusSuccess);
}
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
// 點擊支付/取消按鈕隱藏界面
[controller dismissViewControllerAnimated:YES completion:nil];
}
附上測試結果
終于寫完了,如果有什么問題,還望大神給予指點,Thank you。