文档章节

iOS ApplePay 苹果支付

魔笛GNR
 魔笛GNR
发布于 2016/07/26 15:25
字数 1705
阅读 121
收藏 2
点赞 0
评论 0

环境配置:

1    注册一个你的App ID

1.1    在创建App ID 右边点击+,如下图所示:

1.2    填写App Name、Bundle ID,如下图所示:

1.3    勾选Apple Pay

点击下一步完成注册,会看到Apple Pay 为待配置状态:

1.4    创建商家ID

点击Merchant IDs,再点击+:

填写Merchant ID Name和ID,直至点击完成:

1.4.1    点击App IDs中你创建的App ID,点击Edit:

点击Apple Pay的Edit:

 

勾选刚才创建的商家ID(注:可多选):

点击下一步,直至完成,此时你可以发现Apple Pay变为可用状态了呢:

2    配置商家ID证书

2.1    为Merchant ID 创建证书

点击你的Merchant ID,点击Edit:

点击创建证书:

点击下一步,会提示你是否在中国以外的地区开启Apple Pay,我这里选是:

点击下一步,会让你上传一个请求文件:

2.2    那么这个请求文件如何获取呢?

打开钥匙串,点击左上角钥匙串访问->证书助理->从证书颁发机构请求证书:

我们将证书存放到本地磁盘,会看到在桌面上生产了一个文件(CertificateSigningRequest.certSigningRequest):

2.3    选择上传这个文件:

点击下一步,这时我们的商家ID证书就创建成功了:

2.4    下载安装Merchant ID的证书

 

3    关于证书失效等问题:

3.1    WWDR已过期

以下是苹果证书的官方网址:

http://www.apple.com/certificateauthority/

打开网址:

首先删掉本地已过期的WWDR证书,然后下载安装最新的证书(02/07/23):

3.2    安装受信任的根证书(CA - G2)

安装好之后你会发现,商业ID变成有效的了:

此时关于Apple Pay环境已经配置完成了,下面就来代码实现它吧!

代码实现:

1    开启Apple Pay功能:

在工程中点击项目的Target,选择Capabilities:

开启Apple Pay,并勾选你创建成功的Merchant ID:

2    模拟一个商品的购买

2.1    在根视图故事板中我们添加一个图片,表示这个商品的图片,并且在底部添加一个购买按钮放置的父视图payView,将payView关联至控制器中,如下所示:

2.2    创建Apple Pay按钮

2.2.1    引入PassKit

#import "ViewController.h"

//引入PassKit
@import PassKit;

2.2.2    创建按钮

首先判断当前设备是否支持applePay,如果不支持打印错误信息;如果支持但该用户未添加银行卡,我们创建设置按钮,点击可以跳转到添加银行卡信息的Wallet应用中;如果已添加银行卡,创建购买按钮,点击可购买。具体实现如下:

//1 判断当前设备是否支持applePay
if ([PKPaymentAuthorizationViewController canMakePayments]==NO) {
    
    NSLog(@"当前设备不支持ApplePay");
    
}else if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay]]) {//2 判断是否添加了相应的银行卡 去设置按钮
    
    //不支持 去设置
    PKPaymentButton * jump = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline];
    
    [jump addTarget:self action:@selector(jump:) forControlEvents:UIControlEventTouchUpInside];
    
    jump.frame = self.payView.bounds;
    
    [self.payView addSubview:jump];
    
}else{//3 添加了相应的银行卡 显示购买按钮
    
    //支持 购买
    PKPaymentButton * buy = [PKPaymentButton buttonWithType:PKPaymentButtonTypeBuy style:PKPaymentButtonStyleBlack];
    
    [buy addTarget:self action:@selector(buy:) forControlEvents:UIControlEventTouchUpInside];
    
    buy.frame = self.payView.bounds;
    
    [self.payView addSubview:buy];
    
}

这里我们使用PKPaymentKit提供的专门的按钮:PKPaymentButton ,我们可以通过一下方法来实例化按钮:

//按钮外观 去设置字样 白色底黑边样式的
[PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline];
//按钮外观 支付方式字样 黑底白边样式的
[PKPaymentButton buttonWithType:PKPaymentButtonTypeBuy style:PKPaymentButtonStyleBlack];

运行效果如下:

2.3    跳转到Wallet添加银行卡信息:

#pragma mark - 跳转
- (void)jump:(id)sender{
    
    PKPassLibrary * pk = [[PKPassLibrary alloc]init];
    
    [pk openPaymentSetup];
    
}

2.4    购买请求:

2.4.1    需要注意的:

首先要对购买请求做一些配置,如商家ID、国家代码、货币代码等;

其次要创建一个商品(PKPaymentSummaryItem)的数组。注意:数组最后一个Item代表之前所有Item的合计;

还可以配置一些快递信息等;

最后调起验证用户授权的控制器,并设置代理;

具体实现如下:

#pragma mark - 购买请求
- (void)buy:(id)sender{
    
    //开始购买
    //1 创建一个支付请求
    PKPaymentRequest * request = [[PKPaymentRequest alloc]init];
    
    // 配置支付请求
    // 配置商家id
    request.merchantIdentifier = @"merchant.com.occode.ApplePayTest";
    
    //国家代码
    request.countryCode = @"CN";
    //货币代码
    request.currencyCode = @"CNY";
    
    //支持的支付网络
    request.supportedNetworks = @[PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay];
    
    //支付的处理方式
    request.merchantCapabilities = PKMerchantCapability3DS;
    
    //商品列表
    NSDecimalNumber * number = [NSDecimalNumber decimalNumberWithString:@"6000.0"];
    PKPaymentSummaryItem * item = [PKPaymentSummaryItem summaryItemWithLabel:@"苹果6S" amount:number];
    
    NSDecimalNumber * number11 = [NSDecimalNumber decimalNumberWithString:@"6800.0"];
    PKPaymentSummaryItem * item11 = [PKPaymentSummaryItem summaryItemWithLabel:@"苹果6S+" amount:number11];
    
    NSDecimalNumber * number1 = [NSDecimalNumber decimalNumberWithString:@"12800.0"];
    PKPaymentSummaryItem * item1 = [PKPaymentSummaryItem summaryItemWithLabel:@"魔笛" amount:number1];
    
    request.paymentSummaryItems = @[item,item11,item1];
    
    //附加项
    //是否显示发票收货地址 显示哪些选项
    request.requiredBillingAddressFields = PKAddressFieldAll;
    
    //是否显示快递地址
    request.requiredShippingAddressFields = PKAddressFieldAll;
    
    //配置快递方式
    NSDecimalNumber * number2 = [NSDecimalNumber decimalNumberWithString:@"12.0"];
    PKShippingMethod * m1 = [PKShippingMethod summaryItemWithLabel:@"顺丰快递" amount:number2];
    m1.identifier = @"Shunfeng";
    m1.detail = @"24小时送货上门";
    
    NSDecimalNumber * number3 = [NSDecimalNumber decimalNumberWithString:@"10.0"];
    PKShippingMethod * m2 = [PKShippingMethod summaryItemWithLabel:@"韵达快递" amount:number3];
    m2.identifier = @"Yunda";
    m2.detail = @"送货上门";
    request.shippingMethods = @[m1,m2];
    
    //配置快递类型
    request.shippingType = PKShippingTypeStorePickup;
    
    //附加信息
    request.applicationData = [@"buyId=12345" dataUsingEncoding:NSUTF8StringEncoding];
    
    //2 验证用户的支付授权
    PKPaymentAuthorizationViewController * avc = [[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:request];
    
    avc.delegate = self;
    
    [self presentViewController:avc animated:true completion:nil];
    
}

2.5    实现代理:

我们的订单信息通常都是由我们自己的服务器处理并返回是否支付成功的反馈结果,这里由于我们没有做服务器,所以这里我们假设服务器返回成功,于是客户端完成成功的回调,当用户授权成功获取取消授权,都会触发代理方法DidFinish,具体实现如下:

#pragma mark - PKPaymentAuthorizationViewControllerDelegate

/**
 *  用户授权成功 就会调用这个方法
 *
 *  @param controller 授权控制器
 *  @param payment    支付对象
 *  @param completion 系统给定的回调代码块 需要执行它 来告诉 系统当前的支付状态是否支付成功
 */

- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus))completion{

    NSLog(@"TOKEN transactionIdentifier: %@",payment.token.transactionIdentifier);
    NSLog(@"TOKEN PayData :%@",payment.token.paymentData);
    
    //拿到支付信息 给服务器处理 服务器会返回一个状态 告诉客户端 是否支付成功 有客户端进行处理
    
    BOOL isSuccess = YES;
    
    if (isSuccess) {
        completion(PKPaymentAuthorizationStatusSuccess);
    }else{
        completion(PKPaymentAuthorizationStatusFailure);
    }
    
}

//当用户授权成功 或者 取消授权
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{
    
    NSLog(@"授权结束");
    [controller dismissViewControllerAnimated:true completion:nil];
    
}

2.6    运行效果如下:

点击购买按钮

点击输入手机密码以支付:

此时支付完成了!

 

Demo地址:

github:    
https://github.com/ly918/Demos

 

© 著作权归作者所有

共有 人打赏支持
魔笛GNR
粉丝 6
博文 73
码字总数 36902
作品 0
郑州
iOS工程师
iOS-Security 苹果安全白皮书都讲了些啥?

2017.03.27 原文地址 使用Google 按段落翻译(上传文档的不太准),通读一遍后去掉设备或网络的超专业术语,也算是筛选掉对开发者意义不大的信息吧! 苹果设计的 iOS 平台向来是以安全为核心...

si1ence ⋅ 2017/12/14 ⋅ 0

苹果与微信“短兵相接” “神仙打架”不能让用户买单

苹果与微信此次“短兵相接”,更多反映出两大巨头关于游戏规则的一场“暗战”。即便如此,也绝不能将绑架用户利益、通过随意更改产品功能,作为自己占领高地的“撒手锏”。无论苹果还是微信,...

六库科技 ⋅ 06/08 ⋅ 0

苹果 WWDC 2018 重点推出 iOS 12

苹果正式宣布第 29 届年度全球开发者大会(WWDC 2018)将于美国当地时间 6 月 4 日星期一(北京时间 6 月 5 日凌晨一点)拉开帷幕,大会将持续到 6 月 8 日星期五。和 2017 年一样,此次会议...

问题终结者 ⋅ 04/15 ⋅ 0

苹果宣布将在 2019 年推出 iOS 和 macOS 跨平台功能

苹果 macOS 和 iOS 设备在功能方面越来越接近,现在苹果正在缩小这一差距。在昨天的 WWDC 开发者大会上,苹果表示不会将 iOS 和 macOS 进行合并,而是让 iOS 应用移植到 macOS 上变得更加简单...

王练 ⋅ 06/05 ⋅ 1

苹果WWDC2018开发者大会总结,不错过任何一个重点,最后发布的新品你一定意想不到

前言: 北京时间2018年6月5日1点,苹果在美国圣何塞举行苹果全球开发者大会(WWDC)。在此次开发者大会中,推出全新iOS 12全新系统版本,以及全新watchOS 5,tvOS和macOS Mojave。 iOS 12:增...

马蹄上的茉莉清香i ⋅ 06/06 ⋅ 0

苹果对体无完肤的 iOS 11 最后的弥补

点击上方“CSDN”,选择“置顶公众号” 关键时刻,第一时间送达! 距离万众瞩目的苹果开发者大会(WWDC 2018)的召开还有不到一周时间,苹果公司于今天凌晨,正式发布了 iOS 11 的第十四次更...

csdnnews ⋅ 05/30 ⋅ 0

瞬间被打脸:苹果的iOS 12 USB 封锁模式还未发布就已沦陷

        前言   6月5日,苹果宣布他们在iOS 12系统中加了新的安防取证措施,以防止像Grayshift这样的取证服务商任意读取数据。不过6月15日,根据Vice的一份最新报告显示,Grayshift...

嘶吼RoarTalk ⋅ 06/19 ⋅ 0

iOS 11.4 增加新功能,了解一下

Apple(苹果)iOS系统,一直都在不断更新。早前 Apple 就放出了 iOS 11.4 测试版。如今,最新消息显示,iOS 11.4 测试版又新增了一项功能。 据悉,在最新的iOS 11.4 测试版中,Apple(苹果)...

m7720eiosi6oa9 ⋅ 05/06 ⋅ 0

天生不凡ios怎么在电脑上玩 天生不凡ios电脑版玩法教程

天生不凡ios怎么在电脑上玩呢?现在有很多小伙伴都在玩天生不凡手游,不过相对于传统的在手机上进行游戏,很多人都倾向于新玩法,就是在电脑上玩天生不凡手游。下面小编就给亲们介绍下天生不...

kaopu8520 ⋅ 05/29 ⋅ 0

苹果在研发集AR/VR于一体的头显:8K显示屏无线连接

苹果在研发集AR/VR于一体的头显:8K显示屏无线连接 2018-04-28 10:52编辑: 游星啊分类:业界动态来源:苹果汇 苹果AR头显 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师 京东...

游星啊 ⋅ 04/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud构建微服务架构—创建“服务注册中心”

创建一个基础的Spring Boot工程,命名为eureka-server,并在pom.xml中引入需要的依赖内容: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par......

itcloud ⋅ 7分钟前 ⋅ 0

拖动

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>event</title> <style> #box { width: 100px; height: 100px; background-color: aquamarine; position: absolute; } </style......

fyliujj ⋅ 10分钟前 ⋅ 0

es6 polyfill array

polyfill之javascript函数的兼容写法——Array篇 1. Array.isArray(obj) if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[objec......

球球 ⋅ 12分钟前 ⋅ 0

kibana启动异常

检查一下:kibana.yml 每一对key:value中,冒号之后应有空格。

增删改查1 ⋅ 14分钟前 ⋅ 0

js修改img的src属性刷新图片时的图片缓存问题

问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) 但通过...

HaierBrother ⋅ 14分钟前 ⋅ 0

Mysql

1.Jdbc Url 设置allowMultiQueries为true和false mysql的批量更新是要我们主动去设置的, 就是在数据库的连接url上设置一下,加上* &allowMultiQueries=true *即可。 参数名称 参数说明 缺省...

瑟青豆 ⋅ 17分钟前 ⋅ 0

mysql导出导入表结构与数据

当我们需要进行数据迁移时,mysql自带的mysqldump会是最好的方式。 1.导出某张表的结构和数据 首先,我们应当使用服务器,打开终端,连接到所需要导出的表所在的服务器上。执行命令: mysqld...

hengbao5 ⋅ 17分钟前 ⋅ 0

世界杯也走向“比拼”大数据的时代

《日本经济新闻》6月19日报道称,俄罗斯足球世界杯已于6月14日揭开战幕。作为第21次举办的足球世界杯,如何活用大数据有可能成为决定各支球队胜负的重要因素。从对阵球队的分析到战术建议,还...

加米谷大数据 ⋅ 18分钟前 ⋅ 0

金额转为千分制,金额转中文大写

金额转关为大写 js /** 数字金额大写转换(可以处理整数,小数,负数) */ function digitUppercase(n){ if(!n) reutrn "" let fraction = ['角', '分']; let digit = ['零', '壹', '贰', '叁', ...

YXMBetter ⋅ 20分钟前 ⋅ 0

开发利器JRebel部署SpringBoot项目

不要以为年纪轻轻就跌倒了人生谷底,未来还有更大的下降空间等着你。 idea下载和安装JRebel 激活JRebel 访问https://my.jrebel.com/ 使用facebook或twitter登录 勾选 Build project automati...

郑龙飞 ⋅ 26分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部