Kealdish's Studio.

ApplePay线上支付教程

字数统计: 1k阅读时长: 4 min
2016/01/14 Share

第一部分 准备阶段

1)硬件要求:
iPhone6及更新的设备,还有iPad air2和iPad mini3之后的平板,以及apple watch。具体型号(截止2016年2月):iPhone 6,iPhone 6 Plus,iPhone 6s, iPhone 6s Plus;iPad Air 2,iPad mini 3,iPad mini 4,iPad Pro;还有Apple Watch。

2)系统要求:
iPhone或iPad至少要升到iOS 9.2版,手表至少watch OS 2.1。

3)配置支付环境
1.进入苹果开发者中心,注册App ID。
App ID必须是explicit类型,否则无法使用ApplePay服务。

2.勾选Apple Pay并点击continue,然后点击“submit”提交。

3.在App IDs中找到刚刚注册成功的App ID,点击edit,对Apple Pay进行配置。

4.创建MerchantID。

5.配置Apple Pay服务,勾选Merchant ID。

6.App ID的apple pay选项变成enable表示配置成功。

7.创建Xcode项目,填入刚注册的BundleID。

8.在项目的target->Capabilities中,打开Apple Pay,并勾选Merchant ID。

第二部分 代码实现

项目地址:https://github.com/ZakariyyaSv/ApplePayDemo

一、判断支付环境

1.导入Passkit框架,加载view。

1
#import <PassKit/PassKit.h>

2.判断当前设备是否支持Apple Pay以及wallet中是否有符合所支持网络的银行卡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 1.判断当前设备是否支持ApplePay
if ([PKPaymentAuthorizationViewController canMakePayments]) {
// 2.判断是否添加了银行卡
if ([PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkChinaUnionPay]]) {
// 3.1添加支付按钮,点击跳转去支付
PKPaymentButton *buyBtn = [PKPaymentButton buttonWithType:PKPaymentButtonTypeBuy style:PKPaymentButtonStyleBlack];
[buyBtn addTarget:self action:@selector(buyOnClick) forControlEvents:UIControlEventTouchUpInside];
[self.payView addSubview:buyBtn];
}
else {
// 3.2添加设置按钮,点击跳转去wallet绑定银行卡
PKPaymentButton *setupBtn = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline];
[setupBtn addTarget:self action:@selector(jumpToWallet) forControlEvents:UIControlEventTouchUpInside];
[self.payView addSubview:setupBtn];
}
}
else {
NSLog(@"The device cannot support ApplePay!");
}

运行效果如下图所示:

3.若wallet中没有绑定所支持网络的银行卡,则点击按钮跳转到wallet中去绑定银行卡。

1
2
3
4
- (void)jumpToWallet{
PKPassLibrary *walletLibrary = [[PKPassLibrary alloc] init];
[walletLibrary openPaymentSetup];
}

4.若该设备支持Apple Pay并且有绑定所支持网络的银行卡则发起支付请求。

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
- (void)buyOnClick{
NSLog(@"start to pay!");
// 创建支付请求,配置请求信息。
PKPaymentRequest *payRequest = [[PKPaymentRequest alloc] init];
// 国家代码
payRequest.countryCode = @"CN";
// 货币代码
payRequest.currencyCode = @"CNY";
// 商家ID
payRequest.merchantIdentifier = @"merchant.com.zakariyya.fabrunMerchant";
// 商家的处理方式
payRequest.merchantCapabilities = PKMerchantCapability3DS;
// 商家支持的网络
payRequest.supportedNetworks = @[PKPaymentNetworkChinaUnionPay];
// 配置支付订单的详情
PKPaymentSummaryItem *cameraItem = [PKPaymentSummaryItem summaryItemWithLabel:@"单反相机" amount:[NSDecimalNumber decimalNumberWithString:@"5999.0"] type:PKPaymentSummaryItemTypeFinal];
PKPaymentSummaryItem *totalItem = [PKPaymentSummaryItem summaryItemWithLabel:@"佳能" amount:[NSDecimalNumber decimalNumberWithString:@"5999.0"] type:PKPaymentSummaryItemTypeFinal];
payRequest.paymentSummaryItems = @[cameraItem,totalItem];
// 跳转并验证支付权限
PKPaymentAuthorizationViewController *authViewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:payRequest];
authViewController.delegate = self;
[self presentViewController:authViewController animated:YES completion:nil];
}

支付请求配置包括国家代码、货币代码、商家ID、商家的处理方式、商家支持的网络、订单的详情,这几个要素缺一不可。
其中,merchantCapabilities是一个枚举值:

1
2
3
4
5
6
typedef NS_OPTIONS(NSUInteger, PKMerchantCapability) {
PKMerchantCapability3DS = 1UL << 0, // Merchant supports 3DS
PKMerchantCapabilityEMV = 1UL << 1, // Merchant supports EMV
PKMerchantCapabilityCredit NS_ENUM_AVAILABLE_IOS(9_0) = 1UL << 2, // Merchant supports credit
PKMerchantCapabilityDebit NS_ENUM_AVAILABLE_IOS(9_0) = 1UL << 3 // Merchant supports debit
} NS_ENUM_AVAILABLE(NA, 8_0);

这些枚举值当中PKMerchantCapability3DS是必选项,其他的则是可选项。

supportedNetworks是一个包含常量字符串的数组:

1
2
3
4
5
6
7
extern NSString * const PKPaymentNetworkAmex NS_AVAILABLE(NA, 8_0);
extern NSString * const PKPaymentNetworkChinaUnionPay NS_AVAILABLE(NA, 9_2);
extern NSString * const PKPaymentNetworkDiscover NS_AVAILABLE(NA, 9_0);
extern NSString * const PKPaymentNetworkInterac NS_AVAILABLE(NA, 9_2);
extern NSString * const PKPaymentNetworkMasterCard NS_AVAILABLE(NA, 8_0);
extern NSString * const PKPaymentNetworkPrivateLabel NS_AVAILABLE(NA, 9_0);
extern NSString * const PKPaymentNetworkVisa NS_AVAILABLE(NA, 8_0);

国内一般我们用到的会是中国银联,即PKPaymentNetworkChinaUnionPay,注意:iOS 9.2以后才开始支持银联支付。

5.监听用户授权状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma mark - PKPaymentAuthorizationViewControllerDelegate
// 用户授权成功后调用此方法
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus))completion{
// 一般在此处,拿到支付信息,发送给服务端处理,处理完毕后,服务器会返回一个状态来告诉客户端是否支付成功,然后由客户端进行处理。
BOOL isSuccess = YES;
if (isSuccess) {
completion(PKPaymentAuthorizationStatusSuccess);
}
else {
completion(PKPaymentAuthorizationStatusFailure);
}
}
// 用户授权成功或者用户取消授权操作时调用该方法
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{
NSLog(@"Authorization did finished!");
[self dismissViewControllerAnimated:YES completion:nil];
}

附:

ApplePay支付流程

第三方支付解决方案

CATALOG
  1. 1. 第一部分 准备阶段
  2. 2. 第二部分 代码实现
    1. 2.0.1. 一、判断支付环境
  • 3. 附: