iOS集成ApplePay
下面图片是借的别人的
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 + );
[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)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //模拟服务器通信
completion(PKPaymentAuthorizationStatusSuccess);
});
} - (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller { [controller dismissViewControllerAnimated:YES completion:nil];
} @end
iOS集成ApplePay的更多相关文章
- iOS集成丁香园DXY OAuth 登陆 swift代码示例
问:iOS集成OAuth登陆分几步? 答:和把大象放冰箱里一样. 第一步:打开webview,跳转到登陆页面: let url = "https://auth.dxy.cn/conn/oau ...
- iOS集成支付宝
需要企业和支付宝签约这个是需要审核的[3天左右 以邮件形式告知你] 使用支付宝进行一个完整的支付功能,大致有以下步骤: 1>先与支付宝签约,获得商户ID(partner)和账号ID(sell ...
- iOS 集成Weex入门教程
前言 自Weex发布伊始, 其口号 "Write Once, Run Everywhere"就吸引了大批前端与客户端程序猿纷纷入坑, 我也不能独善其中. 就我目前所学习Weex的经 ...
- iOS 集成百度地图 位置偏移问题
iOS 集成百度SDK 请参考 百度地图官方文档 ,这里不就多啰嗦了 本文介绍的是在百度地图上根据经纬度,自定义气泡时,气泡位置的偏移,在我们天朝这种事是很常见的,也见怪不怪了,在项目中使用的百度地图 ...
- 李洪强iOS之集成极光推送三iOS集成指南
李洪强iOS之集成极光推送三iOS集成指南 SDK说明 适用版本 本文匹配的 SDK版本:r2.1.5 以后.查看最近更新了解最新的SDK更新情况.使用Xcode 6及以上版本可以使用新版Push S ...
- 驰骋工作流引擎-CCMobile与安卓、IOS集成过程中的问题与解决方案
CCMobile与安卓.IOS集成过程中的问题与解决方案 前言: CCMobile(2019版本)是CCFlow&JFlow 的一款移动端审批的产品.系统基于mui框架开发,是一款可以兼容An ...
- IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流
因为公司项目需要,我一个连iPhone都没用过的人竟然跑去开发iOS APP.近一段时间一直忙于赶项目,到今天差不多了,所以记录一下当时遇到的各种坑,先从ios 集成 ijkplayer播放器说起! ...
- iOS开发ApplePay的介绍与实现
1.Apple Pay的介绍 Apple Pay官方 1.1 Apple Pay概念 Apple Pay,简单来说, 就是一种移动支付方式.通过Touch ID/ Passcode,用户可使用存储在i ...
- IOS 集成第三方登录
我使用的是友盟上集成的第三方登录功能,一共使用了三个应用的登录授权,QQ.微信.新浪微博.由于第三方登录授权成功后,需要跳转到一个新的界面,所以这里需要在项目里设置第三方登录的SSO授权.就是必须安装 ...
随机推荐
- HTTP协议缓存策略深入详解之ETAG妙用
Etag是什么: Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等.具体内部含义是使服务器控制的,就像Cookie那样. HTTP协议规格说明定义 ...
- 数据库基础-JOIN
JOIN分类 三.JOIN分类详解 INNER JOIN: 仅仅返回两个表中,匹配列相同的列值,所在行的数据. SELECT * FROM Table1 t1 INNER JOIN Table2 t2 ...
- Canvas贝塞尔二级曲线
当前点到控制点,控制点到末尾点的两个连线,与这两个连线相切:<!DOCTYPE html> <html lang="en"> <head> &l ...
- lufylegend库 鼠标事件 循环事件 键盘事件
lufylegend库 鼠标事件 循环事件 键盘事件 <!DOCTYPE html> <html lang="en"> <head> <m ...
- 关于多字节字符入库失败处理(所谓的Emji),该处理是舍弃特殊字符
具体处理方法及样例如下: /** * 屏蔽超过三个字节以上的字符 * @param strByte * @return */ public static String filterUtf8(byte[ ...
- Java偏向锁实现原理(Biased Locking)
http://kenwublog.com/theory-of-java-biased-locking 阅读本文的读者,需要对Java轻量级锁有一定的了解,知道lock record, mark wor ...
- iOS横向瀑布流的封装
前段时间, 做一个羡慕, 需要使用到瀑布流! 说道瀑布流, 或许大家都不陌生, 瀑布流的实现也有很多种! 从scrollView 到 tableView 书写的瀑布流, 然后再到2012年iOS6 苹 ...
- [python]Python2编码问题
以下内容说的都是 python 2.x 版本 简介 基本概念 Python "帮"你做的事情 推荐姿势 基本概念 我们看到的输入输出都是'字符'(characters),计算机(程 ...
- C#进阶系列——使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)
前言:上篇C#进阶系列——使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.confi ...
- Linux如何创建一个进程
关于准备知识: 每个进程都有以下属性: 1 地址空间 每个进程都有自己的进程地址空间,格式大概是这个样子: 栈(Stack)以帧为单位,当程序调用函数(假如该函数名为fun01)时,stack会向下 ...