首页 > 代码库 > iOS集成ApplePay

iOS集成ApplePay

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