Apple pay作為一種全新的支付方式,一經登陸國內,便收到各大銀行的激勵追捧,相信原因大家都了解,所以作為iOS開發人員,個人感覺有必要了解下。
apple pay的使用基本需要下面幾步:
獲得Apple pay開發資格
在開發者中心注冊一個Merchant ID
下載并安裝Merchant ID對應的cer證書,如果安裝證書出現問題可以參考http://www.lxweimin.com/p/a5f0795cf781
在需要使用Apple pay的項目中添加Apple pay功能
1、打開項目當中的Apple pay的開關,選擇對應的Merchant ID
2、導入PassKit框架#import <PassKit/PassKit.h>
3、直接上代碼,簡單實現
#import "ViewController.h"
#import <PassKit/PassKit.h>
@interface ViewController ()<PKPaymentAuthorizationViewControllerDelegate>
/**支付按鈕*/
@property (weak, nonatomic) PKPaymentButton *payButton;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//是否可以使用apple pay
if ([self isApplePayEnable])
{
//創建支付按鈕
[self addPayButton];
}
}
#pragma mark - 是否添加了銀行卡
- (BOOL)isApplePayEnable
{
//1、判斷設備是否支持Apple pay
if (![PKPaymentAuthorizationViewController canMakePayments])
{
return NO;
}
//2、判斷是否綁定了銀行卡
if(![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkAmex,PKPaymentNetworkDiscover,PKPaymentNetworkMasterCard,PKPaymentNetworkPrivateLabel,PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay]])
{
//如果沒有綁定銀行卡可以提示用戶綁定銀行卡菜可以交易
return NO;
}
return YES;
}
#pragma mark - 添加支付按鈕
- (void)addPayButton
{
//創建按鈕
PKPaymentButton *payButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypeBuy style:PKPaymentButtonStyleBlack];
self.payButton = payButton;
CGFloat btnW = payButton.bounds.size.width;
CGFloat btnH = payButton.bounds.size.height;
CGFloat btnX = ([UIScreen mainScreen].bounds.size.width - btnW) * 0.5;
CGFloat btnY = 100;
payButton.frame = CGRectMake(btnX, btnY, btnW, btnH);
[self.view addSubview:payButton];
//添加點擊事件,彈出支付授權控制器
[payButton addTarget:self action:@selector(presentPayViewControler) forControlEvents:UIControlEventTouchUpInside];
}
#pragma mark - 創建支付請求
- (PKPaymentRequest *)createPayRequest
{
PKPaymentRequest *pkRequest = [[PKPaymentRequest alloc] init];
//1、設置貨幣代碼,中國就是CNY,度娘查
pkRequest.currencyCode = @"CNY";
//2、設置國家代碼,同樣找度娘
pkRequest.countryCode = @"CN";
//3、設置支持的綁定卡類型
pkRequest.supportedNetworks = @[PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay];
//4、設置商家id(Merchant ID)
pkRequest.merchantIdentifier = @"merchant.bjwlade";
//5、設置支付的處理標準,具體的,我也不是很清楚,都寫上吧
pkRequest.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityDebit | PKMerchantCapabilityEMV | PKMerchantCapabilityCredit;
//6、可選收貨人送貨信息,這一項可以不設置,如果設置了,就必須在支付控制器,手動添加相關信息
// pkRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress | PKAddressFieldPhone | PKAddressFieldEmail | PKAddressFieldName;
//7、設置賬單,或者說發票的投遞地址,當然也可以不設置,因為用戶可能不需要這個賬單,如果設置了,同樣就必須在支付控制器,手動添加相關信息
//這里設置只有PKAddressFieldPostalAddress有用
// pkRequest.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;
//8、設置默認的收貨人信息,默認的訂單或者發票投遞地址也這樣設置,這里不做設置
//默認設置,如果設置了,在支付控制器頁面是看不到這些信息顯示的
PKContact *contact = [[PKContact alloc] init];
//8.1設置收貨人姓名
NSPersonNameComponents *userName = [[NSPersonNameComponents alloc] init];
userName.givenName = @"曉飛";
userName.familyName = @"王";
contact.name = userName;
//8.2設置收貨人的地址
CNMutablePostalAddress *userAddress = [[CNMutablePostalAddress alloc] init];
userAddress.street = @"回龍觀東大街";
userAddress.city = @"北京";
userAddress.state = @"GA";
userAddress.postalCode = @"100000"; //郵編
contact.postalAddress = userAddress;
//8.3設置收件人信息
pkRequest.shippingContact = contact;
//9、設置貨物的配送方式
pkRequest.shippingMethods = [self setUpPayWay];
//10、設置商品列表
pkRequest.paymentSummaryItems = [self goodList];
return pkRequest;
}
#pragma mark - 商品列表信息
//商品列表的最后一個前面參數必須是收款人,后面參數是收款總價
- (NSArray *)goodList
{
PKPaymentSummaryItem *good1 = [PKPaymentSummaryItem summaryItemWithLabel:@"外星人筆記本電腦" amount:[NSDecimalNumber decimalNumberWithString:@"15000"]];
PKPaymentSummaryItem *good2 = [PKPaymentSummaryItem summaryItemWithLabel:@"羅技鼠標墊" amount:[NSDecimalNumber decimalNumberWithString:@"40"]];
PKPaymentSummaryItem *good3 = [PKPaymentSummaryItem summaryItemWithLabel:@"西部數據移動硬盤SSD 1G" amount:[NSDecimalNumber decimalNumberWithString:@"2500"]];
PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"陳偉" amount:[NSDecimalNumber decimalNumberWithString:@"17540"]];
return @[good1, good2,good3, total];
}
#pragma mark - 配送方式
//PKShippingMethod的label就是標簽描述,amount就是使用費用,如果使用費用直接寫成0,就表示免費
- (NSArray *)setUpPayWay
{
PKShippingMethod * method1 = [PKShippingMethod summaryItemWithLabel:@"順風快遞" amount:[NSDecimalNumber decimalNumberWithString:@"0"]];
method1.identifier = @"順豐";
method1.detail = @"24小時到貨";
PKShippingMethod * method2 = [PKShippingMethod summaryItemWithLabel:@"圓通快遞" amount:[NSDecimalNumber decimalNumberWithString:@"18.00"]];
method2.identifier = @"圓通";
method2.detail = @"貨到付款";
return @[method1, method2];
}
#pragma mark - 支付授權控制器
- (void)presentPayViewControler
{
PKPaymentAuthorizationViewController *payViewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:[self createPayRequest]];
//因為這個控制器有可能創建失敗
if (payViewController)
{
payViewController.delegate = self;
[self presentViewController:payViewController animated:YES completion:nil];
}
}
#pragma mark - PKPaymentAuthorizationViewControllerDelegate
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion
{
NSLog(@"支付成功");
}
//用戶點擊了右上角的取消就會調用此方法
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
NSLog(@"取消支付");
[controller dismissViewControllerAnimated:YES completion:nil];
}
@end
幾個需要注意的地方
1、PKPaymentRequest在設置屬性的時候以下屬性是必須的,否則會導致PKPaymentAuthorizationViewController創建失敗,除了這些必須的,其他屬性設置根據實際情況選擇
currencyCode//貨幣編碼縮寫
countryCode//國家編碼縮寫
supportedNetworks//支持的磁卡類型
merchantIdentifier//在開發者中心創建的商家ID
merchantCapabilities//支付標準
paymentSummaryItems//商品列表
2、貨幣代碼縮寫和國家代碼縮寫
貨幣代碼參考:http://www.webmasterhome.cn/huilv/huobidaima.asp
國家代碼參考:http://country-code.cl/
3、商品列表的最后一個前面參數必須是收款人,后面參數是收款總價,其中總價應該包括郵費
4、由于PKPaymentAuthorizationViewController可能創建失敗,操作改控制器的時候應該先判空
5、由于PKPaymentAuthorizationViewController是一個控制器,所以不一定需要PKPaymentButton來操作,可以直接創建PKPaymentAuthorizationViewController,當普通控制器操作
6、Apple pay使用模擬器同樣可以,本文所有實現都是在模擬器下
7、模擬器下在打開Apple pay的開關的時候,timeout,可以暫時忽略,真機暫時沒有嘗試