下面图片是借的别人的
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];
}
//这个方法可以开始配置ApplyPay银行卡
- (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