標籤:package 返回 圖片 匯入 標頭檔 sar 設定 驗證 strong
Apple Pay正式在國內上線的那天,一起工作的小夥伴就走進了Starbucks,7-11等帶有銀聯閃付的店進行了嘗鮮。不管是否要再次輸入一次密碼,但是它的出現確實給我們帶來了極大的便捷。下面就嘗試在一個Demo中來整合下Apple Pay的功能。
下面圖片是借的別人的
Apple Pay流程
Apple Pay運行環境:
iPhone 6以上裝置,當然也包括最新出來的iPhone SE。iOS版本在9.2以上。
Xcode版本號碼 7.2.1
APP接入ApplePay不需要POS機,但是還是要和銀行簽約,比如和銀聯簽約。
準備工作
在接入Apple Pay之前,首先要申請MerchantID及對應的認證。
申請Merchant ID
需要以merchant開頭的一個字串
僅在中國使用
申請App ID,這裡和Merchant ID填寫一樣的名字為了辨別
申請好後再許可權裡面開啟ApplePay功能,並配置merchant認證
選擇Edit進行相應配置
配置成功後你會看到
配置APP ID和Merchant ID關聯成功搭建工程檔案
bundleID設定,對應手動產生的bundleID
Bundle Id設定
Capability中啟用Apple Pay許可權,並選擇merchantID.
Apple Pay使能並勾選對應merchantID設定需要匯入的標頭檔、引入的庫
#import <PassKit/PassKit.h>//使用者綁定的銀行卡資訊#import <PassKit/PKPaymentAuthorizationViewController.h>//Apple pay的展示控制項#import <AddressBook/AddressBook.h>//使用者聯絡資訊相關
在開始Apple Pay支付前需要帶代碼中進行,系統版本檢測,裝置是否支援ApplePay檢測以及使用者是否綁定有對應的銀行,三步操作。
if(![PKPaymentAuthorizationViewController class]) {//PKPaymentAuthorizationViewController需iOS8.0以上支援NSLog(@"作業系統不支援ApplePay,請升級至9.0以上版本,且iPhone6以上裝置才支援");return;}
//檢查當前裝置是否可以支付
if(![PKPaymentAuthorizationViewController canMakePayments]) {//支付需iOS9.0以上支援NSLog(@"裝置不支援ApplePay,請升級至9.0以上版本,且iPhone6以上裝置才支援");return;}
//檢查使用者是否可進行某種卡的支付,是否支援Amex、MasterCard、Visa與銀聯四種卡,根據自己項目的需要進行檢測
NSArray*supportedNetworkCards =@[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay];if(![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetworks]) {NSLog(@"沒有綁定支付卡");return;}NSLog(@"可以支付,開始建立支付請求");
//當以上三種檢查都通過後我這裡以人民幣作為測試
下面是代碼:
//// ViewController.m// PayDemo//// Created by Jackey on 2017/3/2.// Copyright ? 2017年 com.zhouxi. All rights reserved.//#import <PassKit/PassKit.h> //使用者綁定的銀行卡資訊#import <PassKit/PKPaymentAuthorizationViewController.h> //Apple Pay的展示控制項#import <AddressBook/AddressBook.h> //使用者聯絡資訊相關#import "ViewController.h"@interface ViewController ()<PKPaymentAuthorizationViewControllerDelegate>@property (nonatomic, strong) NSMutableArray *summaryItems; //賬單列表@property (nonatomic, strong) PKPaymentAuthorizationViewController *payVC;@property (nonatomic, strong) PKPaymentRequest *payRequest;@end@implementation ViewController@synthesize payRequest;- (void)viewDidLoad { [super viewDidLoad]; PKPaymentButton *payButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypeBuy style:PKPaymentButtonStyleWhiteOutline]; payButton.center = self.view.center; [payButton addTarget:self action:@selector(action) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:payButton]; PKPaymentButton *setupButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline]; setupButton.center = CGPointMake(self.view.center.x, self.view.center.y + 50); [setupButton addTarget:self action:@selector(jump2MakePaymentsUsingNetworks) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:setupButton]; //檢測當前系統版本是否支援Apple Pay if (![PKPaymentAuthorizationViewController class]) { NSLog(@"系統版本太低, 請升級至9.0以上版本, 且iPhone6以上裝置才支援"); } else { NSLog(@"恭喜您, 當前系統支援Apple Pay!"); } //檢查當前裝置是否可以支付 if (![PKPaymentAuthorizationViewController canMakePayments]) { NSLog(@"裝置不支援Apple Pay, 請升級至9.0以上版本, 且iPhone6以上裝置才支援"); } else { NSLog(@"恭喜您, 當前裝置支援Apple Pay"); } //檢查使用者是否可以進行某種銀行卡的支付, 是否支援Amex, MasterCard, Visa與銀聯四中卡 NSArray *supportedNetworkCards = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay]; if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetworkCards]) { NSLog(@"沒有綁定支付卡"); } else { NSLog(@"有綁定支付卡, 可以開始建立支付請求了"); } //開始配置支付資訊 payRequest = [[PKPaymentRequest alloc] init]; payRequest.countryCode = @"CN"; //國家代碼 payRequest.currencyCode = @"CNY"; //RMB的幣種代碼 payRequest.merchantIdentifier = @"merchant.com.zhouxi.PayDemo"; //申請的merchantID payRequest.supportedNetworks = supportedNetworkCards; //使用者可以進行支付的銀行卡 payRequest.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV; //設定支援的交易處理協議, 3DS必須支援, EMV為可選 //payRequest.requiredShippingAddressFields = \ PKAddressFieldPostalAddress | PKAddressFieldPhone | PKAddressFieldName; //設定發貨地址 payRequest.requiredShippingAddressFields = PKAddressFieldNone; //空發貨地址 payRequest.shippingMethods = @[]; //設定配送方式 NSDecimalNumber *totalAmount = [NSDecimalNumber decimalNumberWithString:@"0.01"]; //建立金額 PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"重慶周希" amount:totalAmount]; self.summaryItems = [NSMutableArray arrayWithArray:@[total]]; payRequest.paymentSummaryItems = self.summaryItems; }- (void)action { //初始化ApplePay控制項 self.payVC = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:payRequest]; self.payVC.delegate = self; [self presentViewController:self.payVC animated:YES completion:nil];}- (void)jump2MakePaymentsUsingNetworks { /** * 跳轉到添加銀行卡介面,系統直接就給我們提供了一個方法,直接建立介面,然後open即可 */ PKPassLibrary *library = [[PKPassLibrary alloc] init]; /** * 跳轉到綁定銀行卡介面 */ [library openPaymentSetup];}#pragma mark - PKPaymentAuthorizationViewControllerDelegate Methods- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus))completion { //支付憑據, 發給伺服器端進行驗證支付師傅真是有效 PKPaymentToken *payToken = payment.token; //賬單資訊 PKContact *billingContact = payment.billingContact; //送貨資訊 PKContact *shippingContact = payment.shippingContact; //發貨方式 PKContact *shippingMethod = payment.shippingMethod; //等待伺服器返回結果後再進行系統block調用 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //類比伺服器通訊 completion(PKPaymentAuthorizationStatusSuccess); });}- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller { [controller dismissViewControllerAnimated:YES completion:nil];}@end
iOS整合ApplePay