iOS集成ApplePay
Posted 一切都是最好的安排
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS集成ApplePay相关的知识,希望对你有一定的参考价值。
Apple Pay正式在国内上线的那天,一起工作的小伙伴就走进了Starbucks,7-11等带有银联闪付的店进行了尝鲜。不管是否要再次输入一次密码,但是它的出现确实给我们带来了极大的便捷。下面就尝试在一个Demo中来集成下Apple Pay的功能。
下面图片是借的别人的
Apple Pay运行环境:
iPhone 6以上设备,当然也包括最新出来的iPhone SE。ios版本在9.2以上。
Xcode版本号 7.2.1
APP接入ApplePay不需要POS机,但是还是要和银行签约,比如和银联签约。
准备工作
在接入Apple Pay之前,首先要申请MerchantID及对应的证书。
需要以merchant开头的一个字符串
申请App ID,这里和Merchant ID填写一样的名字为了辨别
申请好后再权限里面打开ApplePay功能,并配置merchant证书
配置成功后你会看到
搭建工程文件
bundleID设置,对应手动生成的bundleID
Capability中启用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的主要内容,如果未能解决你的问题,请参考以下文章