Apple Pay--iOS开发

一、什么是Apple Pay?

  1. 概念
    Apple Pay,简单来说, 就是一种移动支付方式。通过Touch ID/ Passcode,用户可使用存储在iPhone 6, 6p等设备上的信用卡和借记卡支付证书来授权支付; 它是苹果公司在2014苹果秋季新品发布会上发布的一种基于NFC的手机支付功能,于2014年10月20日在美国正式上线,2016年2月18日凌晨5:00, Apple Pay 业务在中国上线。
  2. 使用前提
    (1)支持设备
Paste_Image.png

(3)银行支持
(2)系统支持(iOS8.0+版本, 注意:iOS9.2才真正的支持“银联支付”, 意味着iOS9.2以后才可以在中国市场使用)
需要将被支持银行的银行卡, 添加到手机wallet应用当中 

1463646106122946.png

二、 应用场景?

  1. 线下支付

除下使用前提之外, 还要求      
商家支持(要求必须有支持NFC的刷卡机)
如果发现以下标识,就代表该商家支持Apple Pay
苹果公开的Apple Pay商家有:


1463646216287151.png
  1. 线上支付

除下使用前提之外, 还要求
App 支持

目前支持Apple Pay支付方式的App并不多。很多公司也在集成当中,这也是写这篇博客的目的。
1463646348641388.png

唯品会


1463646612131578.png

大众点评

目前, 苹果公开的支持Apple Pay的APP列表:


1463646495715575.png

三、 与微信支付以及支付宝等第三方支付平台的区别?

  1. 硬件方面
    Apple Pay:必须是iOS设备, 而且是按照线上支付和线下支付区分不同的真机设备(具体参考表1)
    微信、支付宝: 基本跟硬件设备无关, 支持大多数的只能手机
  2. 网络环境要求
    Apple Pay:线上支付需要联网, 线下支付无需联网就可以支付
    微信、支付宝: 无论是线上还是线下支付, 都需要联网使用
  3. 使用技术
    Apple Pay:线下支付使用的是 基于NFC的近场通讯技术
    微信、支付宝: 线下支付使用的是 扫码支付(条形码、二维码)
  4. 主要功能
    Apple Pay:线上支付、线下支付、部分升级后的ATM机可以取款
    微信、支付宝: 线上支付、线下支付、转账、理财等
  5. 安全性能
    Apple Pay:不保留银行卡信息,并且不会暴漏给外界、不分流银行存款(不需要从银行卡转钱到另外一个平台)、不能充值 ,安全性较高。
    微信、支付宝: 密码保护,身份验证等手段保护账户,安全性相对稍差。
  6. 支付时长
    Apple Pay:无论是线上支付,还是线下支付, 只需要验证指纹即可支付。非常迅速
    微信、支付宝: 需要扫码支付, 流程相对繁琐,所以时长较长
  7. 各自弊端
    Apple Pay:只适用于苹果设备, 支付场景单一,无转账理财等业务
    微信、支付宝: 安全性较差, 必须联网操作,需要充值到对应平台

四、线上支付集成步骤
 1. 配置支付环境
使用XCode创建一个工程, 并设置好对应的BundleID

注册并配置一个商业标示符

添加一个App ID

配置Merchant ID

为Merchant ID 配置证书, 并下载证书安装到钥匙串

检查安装到钥匙串中的证书是否有效

绑定Merchant ID 到 APP ID

2. 配置Xcode 项目
调整系统最低部署版本(iOS8.0)

开启Apple Pay功能

3. 代码实现
判断当前设备是否可以支付

判断"Wallet有没有添加该支付网络的储蓄卡/信用卡"

创建一个支付请求, 并配置各项信息

弹出授权控制器,让用户给支付授权

处理支付凭证

4. 服务器处理

五、 具体步骤实现
 1. 配置支付环境
使用XCode创建一个工程, 并设置好对应的BundleID

1463647751122748.png

注册并配置一个商业标示符

(1)添加一个App ID, 并勾选Apple Pay功能


1463647813346836.png

1463647820105539.png

(2)配置Merchant ID


1463647849472058.png

1463647859858225.png

(3)为Merchant ID 配置证书, 并下载证书安装到钥匙串

1463647881293562.png

1463647889569181.png

1463647896134977.png

        
(4)检查安装到钥匙串中的证书是否有效
问题描述:有可能会出现
1463648006106391.png
提示
问题原因:系统根证书/中级证书颁发机构过期
解决方案: 重新下载证书, 并安装,具体下载列表看下图
1463648019652103.png
  
     
(5)绑定Merchant ID 到 APP ID
1463648044125583.png

1463648060105234.png

1463648072120226.png

1463648082729646.png
 
1463648130134801.png
 
        
 2. 配置Xcode 项目
调整系统最低部署版本(iOS8.0)

1463648171914855.png

      
开启Apple Pay功能

1463648416102196.png

注意: 以上步骤截图,只是关键处截图,如果在具体细节处遇到问题,欢迎关注公众号(王顺子),共同探讨。或者参照具体视频教程,链接地址,后续附上。
  
 3. 代码实现    
(1)判断当前设备是否可以支付

if(![PKPaymentAuthorizationViewController canMakePayments])
{
    NSLog(@"不能支付");
    return;
}

(2)判断"Wallet有没有添加该支付网络的储蓄卡/信用卡"

 if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay]]) {
        NSLog(@"Wallet没有添加该支付网络的储蓄卡/信用卡");
  
        // 创建一个设置按钮
//        PKPaymentButton *button = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline];
//        [button addTarget:self action:@selector(jump) forControlEvents:UIControlEventTouchUpInside];
//        button.center = self.view.center;
//        [self.view addSubview:button];
  
  
        return;
    }

(3)创建一个支付请求, 并配置各项信息

// 1. 创建一个支付请求
    PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
  
  
    // 2. 参数配置
    // 2.1 商店标识
    request.merchantIdentifier = @"merchant.520it.com";
  
    // 2.2 货币代码
    request.currencyCode = @"CNY";
  
    // 2.3 国家编码
    request.countryCode = @"CN";
  
    // 2.4 支持的支付网络(PKPaymentNetworkChinaUnionPay iOS9.2开始支持)
    request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay];
  
    // 2.5 支付请求包含一个支付摘要项目的列表
    NSDecimalNumber *price1 = [NSDecimalNumber decimalNumberWithString:@"2"];
    PKPaymentSummaryItem *item1 = [PKPaymentSummaryItem summaryItemWithLabel:@"手榴弹" amount:price1];
  
    NSDecimalNumber *price2 = [NSDecimalNumber decimalNumberWithString:@"6"];
    PKPaymentSummaryItem *item2 = [PKPaymentSummaryItem summaryItemWithLabel:@"炸弹" amount:price2 type:PKPaymentSummaryItemTypePending];
  
    NSDecimalNumber *totalAmount = [NSDecimalNumber zero];
    totalAmount = [totalAmount decimalNumberByAdding:price1];
    totalAmount = [totalAmount decimalNumberByAdding:price2];
    PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"小码哥财务中心" amount:totalAmount type:PKPaymentSummaryItemTypePending];
    // 注意: 数组最后一个是总价格
    request.paymentSummaryItems = @[item1, item2, total];
  
  
    // 2.6 运输方式
    NSDecimalNumber *shippingPrice = [NSDecimalNumber decimalNumberWithString:@"18.0"];
    PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@"顺丰快递" amount:shippingPrice];
    method.detail = @"24小时送到!";
    method.identifier = @"shunfeng";
    request.shippingMethods = @[method];
    request.shippingType = PKShippingTypeServicePickup;
  
  
    // 2.7 通过指定merchantCapabilities属性来指定你支持的支付处理标准,3DS支付方式是必须支持的,EMV方式是可选的,
    request.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV | PKMerchantCapabilityCredit | PKMerchantCapabilityDebit;
      
    // 2.8 需要的配送信息和账单信息
    request.requiredBillingAddressFields = PKAddressFieldAll;
    request.requiredShippingAddressFields = PKAddressFieldAll;
  
    // 2.9 存储额外信息
    // 使用applicationData属性来存储一些在你的应用中关于这次支付请求的唯一标识信息,比如一个购物车的标识符。在用户授权支付之后,这个属性的哈希值会出现在这次支付的token中。
    request.applicationData = [@"购物车ID: 123456" dataUsingEncoding:NSUTF8StringEncoding];

(4)弹出授权控制器,让用户给支付授权

// 3. 开始支付
    PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
    if (paymentPane == nil) {
        NSLog(@"授权控制器创建失败");
        return;
    }
    paymentPane.delegate = self;
    [self presentViewController:paymentPane animated:YES completion:nil];

(5)处理支付凭证(token)

 *  当授权成功之后会调用这个代理方法
 */
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus status))completion;
{
//    PKPayment *temp = payment;
    NSLog(@"验证授权---%@", payment.token);
    NSLog(@"验证通过后, 需要开发者继续完成交易");
    // 它需要你连接服务器并上传支付令牌和 其他信息,以完成整个支付流程。
    BOOL isSuccess = YES;
    if (isSuccess) {
        completion(PKPaymentAuthorizationStatusSuccess);
    }else
    {
        completion(PKPaymentAuthorizationStatusFailure);
    }
      
}

(6)关闭授权控制器

/**
 *  当授权成功之后或者取消授权之后会调用这个代理方法
 */
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
    NSLog(@"取消或者交易完成");
    [self dismissViewControllerAnimated:YES completion:nil];
}
  • 支付授权的流程:
    框架发送支付请求给安全模块,只有安全模块可以访问存储在设备上的标记化的卡信息。

安全模块把特定的卡和商家等支付数据加密,以保证只有苹果可以读取,然后发送给框架。框架会将这些数据发送给苹果。

苹果服务器再次加密这些支付数据,以保证只有商家可以读取。然后服务器对它进行签名,生成支付token,然后发送给设备。

框架调用相应的代理方法并传入这个token,然后你的代理方法传送token给你的服务器。

Paste_Image.png

  
  4. 服务器接收到token后的一般处理流程
验证支付数据的哈希表和签名

为加密过的支付数据解码

向支付处理系统提交支付数据

向订单追踪系统提交订单

处理支付请求时,你有两个选择;你既可以利用支付平台处理支付请求,也可以自己实现支付请求处理流程。一个常用的支付平台可以完成上述大部分操作。
  关于支持Apple Pay支付平台的更多信息,请参考developer.apple.com/apple-pay/

视频获取链接:
http://pan.baidu.com/s/1mhzzqic 提取码回复后可见。

来源:
http://bbs.520it.com/forum.php?mod=viewthread&tid=254&extra=page%3D1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 一、什么是Apple Pay? 概念 Apple Pay,简单来说, 就是一种移动支付方式。通过Touch ID/...
    Jack_Baiyx阅读 12,029评论 0 3
  • 苹果支付(Apple Pay): Apple Pay,简单来说, 就是一种移动支付方式。通过Touch ID/ P...
    西风颂阅读 3,695评论 6 19
  • Apple Pay 一个方便 & 安全的移动支付技术,让用户完成他们的支付环节并把支付相关的信息告诉你 只可以购买...
    skingtree阅读 1,773评论 0 4
  • 1.About Apple Pay Apple Pay是一种移动支付技术,让使用者把它们对真实的物品和服务的支付信...
    NEWWORLD阅读 5,170评论 14 51
  • 山村夜深, 虫鸣嘤嘤,蟋蟀唧唧,声响清晰,就在窗外------屋后山坡。蛙声咕咕变奏,不太容易听清,来自远处田地池...
    caa45b5096fb阅读 129评论 0 0