文档章节

Apple Pay在APP应用内的集成

Marginx
 Marginx
发布于 2016/11/07 22:59
字数 1361
阅读 693
收藏 1

Apple Pay接入iOS端最主要的工作就是申请授权和SDK的集成,只要 授权的开发者才能接入sdk,apple通过授权team id的方式对开发者授权 最近在做这个东西,发现网上相关资料少的很,整理出来供准备接入的开发者参考,有疑问的可以直接联系我,我们共同讨论! 首先,把招商银行APP 添加Apple Pay的场景多玩几遍,明白我们要做什么!

1. 申请授权

  • 开发者发送Team ID到apple-pay-provisioning@apple.com申请entitlements,没有这个entitlement无法调起Apple Pay API
  • 在开发者中心将entitlement添加到provisionProfile中,并生成新的provisionProfile
  • 下载包含entitlement的provisionProfile并导入到项目中

2. 加载的整个流程图

我了个大擦,oschina的markdown不支持时序图语法,请找个支持时序图语法的markdown编辑器打开下面内容,查看整个流程图!

webank app->PassKit:是否支持Apple Pay
PassKit-->webank app:返回bool结果
webank app->PassKit:绑定卡片列表
PassKit-->webank app:PKPasses
webank app->PassKit:获取加密证书
PassKit->Apple server:获取APP加密证书+nOnce
PassKit->PassKit:将nOnce送给SE签名\n(NOnce+AccountIDHash)
PassKit-->webank app:加密证书+sData+nOnce
webank app->webank server:证书+nonce+nonceSignonce
webank server->webank server:生成一个临时的密钥对
webank server->webank server:生成encryptedPassData\n(用apple提供的公钥)
webank server-->webank app:encryptedPassData+临时公钥
webank app->PassKit:添加卡片
PassKit-> Apple server:卡片添加权限检查(EncData)
Apple server->Apple server:verifyAndConsumenOnce
Apple server->PNOs:联网查询
PNOs-->Apple server:返回查询结果
Apple server-->PassKit:权限状态+TnC
PassKit->Apple server:enableCard(cardId+OTP)
Apple server->PNOs:联网连接配置
PNOs-->Apple server:response
Apple server-->PassKit:返回卡片相关信息
PassKit->PassKit:addDisabledPass(绑定流程结束)
Apple server->PassKit:notify(激活完成通知)
PassKit->PassKit:refreshPass

3. Apple Pay的加载时候的方法调用&& Passkit的集成

结合国内现有的案例(比如招行APP)来讲一下绑定和激活Apple Pay整个流程以及实现过程的一些技术点,具体集成代码参考苹果官方提供的PassKit.framework以及相关的开发者文档

###3.1 权限检查

  • 使用PKAddPaymentPassViewController提供的类方法检查APP是否有添加银行卡到Apple Pay的权限

    NS_CLASS_AVAILABLE_IOS(9_0) @interface PKAddPaymentPassViewController : UIViewController
    + (BOOL)canAddPaymentPass;
    
    
  • 使用PKPassLibrary提供的方法检测当前设备是否能够添加输入的银行到Apple Pay

    NS_CLASS_AVAILABLE_IOS(6_0)
    @interface PKPassLibrary : NSObject
    // Returns YES if either the current device or an attached device both supports adding payment passes and does not already contain
    // a payment pass with the supplied primary account identifier.
    // indicates whether the app can add a card to Apple Pay on the devices for the provided FPAN ID
    - (BOOL)canAddPaymentPassWithPrimaryAccountIdentifier:(NSString *)primaryAccountIdentifier NS_AVAILABLE_IOS(9_0);
    

    PKPassLibrary也提供了类方法查询绑定卡片信息,但都需要你的APP有相应的权限,简单来说,就是在招行APP中你无法获取Apple Pay绑定的建行卡信息

    - (NSArray<PKPass *> *)passes;
    - (nullable PKPass *)passWithPassTypeIdentifier:(NSString *)identifier serialNumber:(NSString *)serialNumber;
    - (NSArray<PKPass *> *)passesOfType:(PKPassType)passType NS_AVAILABLE_IOS(8_0);
    - (BOOL)containsPass:(PKPass *)pass;
    

###3.2 添加银行卡到wallet按钮的展示

Apple规定,接入Apple Pay的APP必须遵循他的视觉规范,入口按钮必须用官方提供的PKAddPassButton,生成之后张这个样子

输入图片说明

#import <UIKit/UIKit.h>
    NS_ASSUME_NONNULL_BEGIN
    typedef NS_ENUM(NSInteger, PKAddPassButtonStyle) {
    PKAddPassButtonStyleBlack = 0,
    PKAddPassButtonStyleBlackOutline,
    } NS_ENUM_AVAILABLE_IOS(9_0);
    
    NS_CLASS_AVAILABLE_IOS(9_0) @interface PKAddPassButton : UIButton
    + (instancetype)addPassButtonWithStyle:(PKAddPassButtonStyle)addPassButtonStyle;
    - (instancetype)initWithAddPassButtonStyle:(PKAddPassButtonStyle)style NS_DESIGNATED_INITIALIZER;
    @property (nonatomic, assign) PKAddPassButtonStyle addPassButtonStyle UI_APPEARANCE_SELECTOR;
    @end
    NS_ASSUME_NONNULL_END
    #endif

从用户体验的角度出发,苹果希望APP在确保用户卡片能添加到Apple Pay之后才展示该button给用户,即预检测发生在button展示之前,这一块可能会影响到上架审核

###3.3 Configuration && delegate 相关类以及方法如下

  • PKAddPaymentPassViewController初始化方法

    - (nullable instancetype)initWithRequestConfiguration:(PKAddPaymentPassRequestConfiguration *)configuration
                                             delegate:(nullable id<PKAddPaymentPassViewControllerDelegate>)delegate NS_DESIGNATED_INITIALIZER;
    

该方法返回一个添加Apple Pay的view controller 对象,这个对象用来提供configuration 和 delegate.

  • PKAddPaymentPassRequestConfiguration 这个类由一个实例方法和若干属性组成

    • 实例化一个configuration对象,encryptionScheme为接入方数据传输过程中使用的加密方案

      /* Schemes defined in PKConstants.h.
      * Supported Schemes:
      *  PKEncryptionSchemeECC_V2:
      *      ephemeralPublicKey
      *  PKEncryptionSchemeRSA_V2:
      *      wrappedKey
      */
      - (nullable instancetype)initWithEncryptionScheme:(PKEncryptionScheme)encryptionScheme NS_DESIGNATED_INITIALIZER;
      
    • 若干可选参数,很多参数从命名上就知道是干嘛用的,到具体用的时候再对照开发文档看即可

    @property (nonatomic, copy, readonly) PKEncryptionScheme encryptionScheme;
    @property (nonatomic, copy, nullable) NSString *cardholderName;
    @property (nonatomic, copy, nullable) NSString *primaryAccountSuffix;
    
    @property (nonatomic, copy) NSArray<PKLabeledValue *> *cardDetails NS_AVAILABLE_IOS(10_1);
    
    @property (nonatomic, copy, nullable) NSString *localizedDescription;
    @property (nonatomic, copy, nullable) NSString *primaryAccountIdentifier;
    @property (nonatomic, copy, nullable) PKPaymentNetwork paymentNetwork;
    @property (nonatomic, assign) BOOL requiresFelicaSecureElement NS_AVAILABLE_IOS(10_1);
    
  • PKAddPaymentPassViewControllerDelegate

    @protocol PKAddPaymentPassViewControllerDelegate<NSObject>
    /* Certificates is an array of NSData, each a DER encoded X.509 certificate, with the leaf first and root last.
    * The continuation handler must be called within 20 seconds, or the flow will terminate with
    * PKAddPaymentPassErrorInvalidRequest.
    */
    - (void)addPaymentPassViewController:(PKAddPaymentPassViewController *)controller
    generateRequestWithCertificateChain:(NSArray<NSData *> *)certificates
                               nonce:(NSData *)nonce
                      nonceSignature:(NSData *)nonceSignature
                   completionHandler:(void(^)(PKAddPaymentPassRequest *request))handler;
    

    为Apple Pay调用方提供certificate chainsnOncenOnceSignature 以及一个回调block,供代理去处理一个添加Apple Pay的请求,但苹果规定这个回调必须在20秒内完成,否则流程将会终止。 request相关东西在下文将介绍。

###3.4 Provision request && delegate

  • PKAddPaymentPassRequest,请求里面包含了APP服务端传过来的一些银行卡信息以及加密信息

    NS_CLASS_AVAILABLE_IOS(9_0) @interface PKAddPaymentPassRequest : NSObject
    - (instancetype)init NS_DESIGNATED_INITIALIZER;
    
    @property (nonatomic, copy, nullable) NSData *encryptedPassData;
    @property (nonatomic, copy, nullable) NSData *activationData;
    
    /* Scheme dependent properties:
    */
    @property (nonatomic, copy, nullable) NSData *ephemeralPublicKey;
    @property (nonatomic, copy, nullable) NSData *wrappedKey;
    @end
    
  • 请求结束之后的回调

    /* Error parameter will use codes from the PKAddPaymentPassError enumeration, using the PKPassKitErrorDomain domain.
    */
    - (void)addPaymentPassViewController:(PKAddPaymentPassViewController *)controller didFinishAddingPaymentPass:(nullable PKPaymentPass *)pass error:(nullable NSError *)error;
    @end
    

© 著作权归作者所有

共有 人打赏支持
Marginx
粉丝 4
博文 17
码字总数 19301
作品 0
深圳
加载中

评论(10)

1
1234yws

引用来自“marginxie”的评论

引用来自“说来话长”的评论

开发者发送Team ID到apple-pay-provisioning@apple.com申请entitlements,请问这个具体是怎么操作的?自动配置的怎么操作?

@说来话长 问题解决了么?不好意思,最近比较忙没有怎么查看博客消息。

引用来自“说来话长”的评论

你好,还没解决 不知道这个entitlements 怎么配置,配不好真机不能运行

引用来自“marginxie”的评论

给我留一个邮箱吧,我可以给你分享一些资料

引用来自“What_ever”的评论

jet1988han@163.com 多谢
给我也发一份吧,14385788@qq.com
多谢
What_ever
What_ever

引用来自“marginxie”的评论

引用来自“说来话长”的评论

开发者发送Team ID到apple-pay-provisioning@apple.com申请entitlements,请问这个具体是怎么操作的?自动配置的怎么操作?

@说来话长 问题解决了么?不好意思,最近比较忙没有怎么查看博客消息。

引用来自“说来话长”的评论

你好,还没解决 不知道这个entitlements 怎么配置,配不好真机不能运行

引用来自“marginxie”的评论

给我留一个邮箱吧,我可以给你分享一些资料
jet1988han@163.com 多谢
Marginx
Marginx

引用来自“marginxie”的评论

引用来自“说来话长”的评论

开发者发送Team ID到apple-pay-provisioning@apple.com申请entitlements,请问这个具体是怎么操作的?自动配置的怎么操作?

@说来话长 问题解决了么?不好意思,最近比较忙没有怎么查看博客消息。

引用来自“说来话长”的评论

你好,还没解决 不知道这个entitlements 怎么配置,配不好真机不能运行
我理解,给你的开发者账号授权这个过程是你们的产品经理或者项目经理完成的,授权完之后你才开始开发
Marginx
Marginx

引用来自“marginxie”的评论

引用来自“说来话长”的评论

开发者发送Team ID到apple-pay-provisioning@apple.com申请entitlements,请问这个具体是怎么操作的?自动配置的怎么操作?

@说来话长 问题解决了么?不好意思,最近比较忙没有怎么查看博客消息。

引用来自“说来话长”的评论

你好,还没解决 不知道这个entitlements 怎么配置,配不好真机不能运行
entitlements不是你手写的
是你账号通过苹果授权之后,你在你的开发者中心会有相应的配置文件
Marginx
Marginx

引用来自“marginxie”的评论

引用来自“说来话长”的评论

开发者发送Team ID到apple-pay-provisioning@apple.com申请entitlements,请问这个具体是怎么操作的?自动配置的怎么操作?

@说来话长 问题解决了么?不好意思,最近比较忙没有怎么查看博客消息。

引用来自“说来话长”的评论

你好,还没解决 不知道这个entitlements 怎么配置,配不好真机不能运行
给我留一个邮箱吧,我可以给你分享一些资料
What_ever
What_ever

引用来自“marginxie”的评论

引用来自“说来话长”的评论

开发者发送Team ID到apple-pay-provisioning@apple.com申请entitlements,请问这个具体是怎么操作的?自动配置的怎么操作?

@说来话长 问题解决了么?不好意思,最近比较忙没有怎么查看博客消息。
你好,还没解决 不知道这个entitlements 怎么配置,配不好真机不能运行
子义孔夫
子义孔夫

引用来自“说来话长”的评论

开发者发送Team ID到apple-pay-provisioning@apple.com申请entitlements,请问这个具体是怎么操作的?自动配置的怎么操作?
同问,在线等。作者说说配置过程吧。。。
Marginx
Marginx

引用来自“说来话长”的评论

开发者发送Team ID到apple-pay-provisioning@apple.com申请entitlements,请问这个具体是怎么操作的?自动配置的怎么操作?

@说来话长 问题解决了么?不好意思,最近比较忙没有怎么查看博客消息。
Marginx
Marginx
问题解决么?
What_ever
What_ever
开发者发送Team ID到apple-pay-provisioning@apple.com申请entitlements,请问这个具体是怎么操作的?自动配置的怎么操作?
Apple Pay 应用内支付流程分析

接入方式 Apple Pay接入方式的选择上有两种。一种是使用 CUP SDK(CUP 就是 China Union Pay)等第三方的 SDK。另外一种就是使用 iOS 的 PassKit Framework 和银联的接口来接入。本质上来说,...

背锅侠
2016/02/23
79
0
App集成ApplePay的一些资料整理

首先apple pay不是苹果自己的事,所以,除了要看苹果的资料,把代码写进ios客户端app,还需要看银联的接口,把钱弄到你的卡里。 而且发现银联的网站上居然有比苹果更详细易懂的文档,看来国企...

cuibo1123
2016/02/19
0
0
iOS Apple Pay开发流程

一:介绍 项目中要用到支付功能,需要支付宝支付、支付宝网页支付、微信支付、银联支付、Apple_pay,所以打算总结一下,方便以后的查阅,也方便大家, 用到的地方避免再次被坑。 今天我们就主...

展菲
2017/11/01
0
0
iOS常见支付概述

一、常见的支付方案简介 在微信支付中 微信支付的网址是: https://pay.weixin.qq.com/wiki/doc/api/index.html 进去之后,我们可以看到网页,但我接下来主要讲的是app支付 app支付的过程:商...

上官尘
2016/03/08
66
0
Apple Pay--iOS开发

一、什么是Apple Pay?   1. 概念     Apple Pay,简单来说, 就是一种移动支付方式。通过Touch ID/ Passcode,用户可使用存储在iPhone 6, 6p等设备上的信用卡和借记卡支付证书来授权支付...

秦无炎
2016/07/11
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

c语言之内存分配笔记

先看一个数组: short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0; 或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组...

DannyCoder
44分钟前
0
0
Shell | linux安装包不用选择Y/N的方法

apt-get install -y packageOR echo "y" | sudo apt-get install package

云迹
今天
1
0
Hadoop的大数据生态圈

基于Hadoop的大数据的产品圈 大数据产品的一句话概括 Apache Hadoop: 是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架...

zimingforever
今天
4
0
八大包装类型的equals方法

先看其中一个源码 结论:八大包装类型的equals方法都是先判断类型是否相同,不相同则是false,相同则判断值是否相等 注意:包装类型不能直接用==来等值比较,否则编译报错,但是数值的基本类型...

xuklc
今天
2
0
NoSQL , Memcached介绍

什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗...

TaoXu
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部