Apple Pay
来源:互联网 发布:淘宝旺旺均匀分流方法 编辑:程序博客网 时间:2024/04/30 20:52
相信大家过年来了之后都被苹果的Apple Pay新闻刷屏了吧。在中国Apple公司的一举一动都格外受关注。外界一直谣传的Apple Pay功能终于在中国上线了,不管前景如何,至少在一段时间内这项技术势必在互联网公司掀起一个Apple Pay热(周末逛街发现麦当劳已可使用,有时候科技就在身边无处不在)。外行看热闹,内行看门道。我先做一个先行者为大家介绍下它,同时希望如有不足之处欢迎大家提出。
Apple Pay简介
Apple Pay,是苹果公司在2014年苹果秋季新品发布会上发布的的一种基于NFC的手机支付,于2014年10月20日在美国正式上线。
2016年2月18日正式登录中国。Apple Pay的本质=刷卡,只不过是用手机来代替了实体的卡片,用Touch ID来代替签名。从技术原理上看,Apple Pay在手机内集成了NFC天线和安全芯片,通过空中发卡流程,将银行动态加密的信息集成在安全芯片里,通过NFC传递交易信息完成支付。相当于在手机安全芯片里加载了一张银行卡,与刷银行卡一模一样。
相比支付宝的优点
支付宝扫码付款的步骤是:拿出手机,解锁手机,打开支付宝app,等待欢迎动画,指纹解锁进入界面,打开二维码,最后商家扫码。这一过程尽管已大大优化,仍需8-10秒左右。而Apple Pay是:拿出手机,靠近pos机,屏幕自动点亮,再指纹确认即可,时间可缩短到2-3秒。
哪些设备能用Apple Pay?
设备要求,需要iPhone 6或者更新的手机,还有iPad Air 2与mini 3之后的平板,以及苹果手表。
系统要求,iPhone或iPad至少要升到iOS 9.2版,手表至少watch OS 2.1。
Apple Pay能在哪用?
在中国大陆,目前肯德基、麦当劳、711便利店等线下店可以Apple Pay结账,苹果称之后还会增加;刷公交不行,一卡通的结算系统和银联是两回事。因为Apple Pay兼容银联闪付,所以看见闪付的地方,基本都能用。
App内支付什么意思?
店内支付比较好理解,至于App内支付,以前在猫眼电影买电影票需要会跳转到支付宝结账,现在在应用内点“支付”可以弹出Apple Pay,相比支付宝,它无需跳转到其他App,体验更流畅。iPad只支持App内支付,估计苹果也明白在超市结账掏出个iPad结账会显得很傻(毕竟很少人选择拿个iPad到店里支付)。
Apple Pay对国内的影响
两年前,银联和运营商做出重要支持动作,对搭载NFC支付的手机厂商进行过巨额补贴,却因受制国内近场支付生态环境不成熟而发展缓慢,多家手机厂商对NFC支付的布局“半途而废”。但现在,Apple Pay的入华将一度沉寂的NFC支付技术重新激活同时对安卓手机与银联的合作有明显的带动作用。目前,华为、小米等手机厂商释放出了积极推动NFC支付技术的信号。银联表示,出货量排位前十的多数手机厂商已经和银联签署合作协议,目前有多款机型在做适配。
Apple Pay在中国的收益
苹果公司一向非常注重利润,由于在智能手机取得了巨大优势和苹果公司一向的强势。苹果公司在谈判上拥有很大的话语权。你以为推出Apple Pay就是简单的给用户支付吗,显示不是。
Apple Pay入华将通过两部分获取收益,一是以Apple Pay绑定用户银行卡数量获取银行付费;二是作为消费支付通道获取银行分成(这才是苹果的牛逼之处,注意是可以和银行分成)。后续跟进的国产手机厂商的受益方面将主要是前者,在支付分成上将明显弱于苹果,甚至没有。(这简直让一部分国产手机商哭死,智能手机的利润一大半都让苹果公司拿去了,还可以从支付渠道拿到分成)。
Apple Pay开发
Apple Pay 开发链接:
http://www.cocoachina.com/ios/20150126/11019.html
http://www.cocoachina.com/ios/20160219/15345.html
http://blog.csdn.net/qq_29284809/article/details/50764620
关于Apple Pay具体继承步骤也可参考http://www.cocoachina.com/ios/20141023/10026.html
配置支付环境创建支付请求授权支付支付处理Part 1
ApplePay是一种移动支付技术,它能够让用户以一种便捷安全的方式为现实世界中购买的商品和服务付款。
在Xcode和苹果开发者会员中心中配置Apple Pay
使用ApplePay的APP需要一项特殊的权限,该权限可以在开发者会员中心和Xcode中开启。你同样需要注册一个商业标示,并设置密钥;在给服务器发送支付信息时,这些密匙可以确保数据的安全传输。
相关章节:配置支付环境(ConfiguringYour Environment,后面会提到)
用户授权支付请求
支付请求就是描述当前进行的购买操作,包括支付金额。你把支付请求发送给一个授权支付的视图控制器;该试图控制器呈现相关请求内容,并提示用户需要输入的信息,例如配送地址或者账单地址。接着,当用户与视图控制器交互,并提供新的支付信息时,APP会调用支付请求的委托,继续执行支付流程。
相关章节:创建支付请求(Creatinga Payment Request),授权支付(Authorizinga Payment)(后面会提到)
服务器处理支付请求
ApplePay会对支付信息进行加密处理,以防止未获授权的第三方获取用户的支付信息。你可以在自己的服务器上完成整个支付流程,也可以在自己的服务器上使用第三方支付平台来解码支付信息,并完成支付处理。
关于支持Apple Pay的支付平台信息,请参考developer.apple.com/apple-pay/
相关章节:处理支付请求(Processinga Payment)
Part 2
一个商用ID标识可以帮助ApplePay识别你,让你能够接受付款。在支付信息加密的过程中,把公匙和证书与ID标示关联起来进行加密是必不可少的一步。在APP使用ApplePay之前,你首先得注册一个商用ID,并配置它的相关证书。
注册商用ID标示
- 在开发者会员中心,选择“Certificates,Identifiers&Profiles”
- 在Identifiers下,选择Merchant IDs
- 在右上角点击"+"按钮
- 在Description栏、ID栏输入相应信息,点击"Continue"
- 浏览下配置参数,点击"Register"
- 点击"Done"
为你的ID标示配置一个证书
- 在开发者会员中心,选择"Certificates,Identifiers&Profiles"
- 在Identifiers下,选择Merchant IDs
- 选择列表中的ID标示,点击Edit
- 点击"CreateCertificate",按照指示获取或生成签名证书请求(CSR),点击"Continue"
- 点击"Choose File",选择你的CSR,点击"Generate"
- 点击"Download"下载证书,点击"Done"
如果KeyChainAccess中显示了警示信息,表示未知授权签发证书或者无效证书发行人,那么要确保你已经在钥匙链中安装了WWDR中级证书-G2和AppleRoot CA-G2。你可以在这个地方下载这些东西:apple.com/certificateauthority.
为了在Xcode中启用Apple Pay,打开APP工程文件的Capabilities面板。在ApplePay这行将开关按钮设置为"ON",接着选择APP需要使用的ID标示。
注意:在APP排错时,偶尔手动启用Apple Pay很管用。请按照以下步骤手动启用ApplePay:
- 在会员中心,选择Certificates,Identifiers&Profiles
- 在Identifiers下,选择App IDs
- 选择列表中的app ID,点击"Edit"
- 选择 Apple Pay ,点击"Edit"
- 选择你需要使用的ID标示,点击"Continue"
- 浏览配置参数,点击"Assign"
- 点击"Done"
Part 3 创建支付请求
创建支付请求
支付请求是PKPaymentRequest类的实例,它的组成部分包括一个用来表示将要购买的项目的摘要,一个可用的配送方式列表,一个表示用户需要提供的配送信息的描述,以及一些商家和支付平台的信息。
判定用户是否能够支付
在创建支付请求之前,要首先通过调用PKPaymentAuthorizationVi
如果用户不能进行支付,那就不要显示支付按钮,相应的应该退回到其它支付方式。
支付请求包含货币和地区信息
所有的汇总金额应该使用同一种货币,货币的信息可使用PKPaymentRequest类的currencyCode属性进行指定。像"USD"这样,使用3个字符格式的ISO货币编码。
一个支付请求里的国家代码表示了这次购买发生的国家或者将要在这个国家处理这次支付。像"US"这样,使用2个字符格式的ISO国家编码。
在支付请求里指定的商用ID必须匹配应用中指定的商用ID列表之一。
1
2
3
request.currencyCode
request.countryCode
request.merchantIdentifier
支付请求包含一个支付摘要项目的列表
支付摘要项目,属于PKPaymentSummaryItem类,描述了支付请求的不同部分。在一个支付请求里不要使用太多的摘要项目---典型的项目像比如小计金额、折扣信息、配送信息、含税信息以及总计金额等。如果你想要提供更详细的支付项目列表,可以在你应用的其它地方提供。
每一个摘要项目会有一个标签和数额,就像在代码列表3-1中显示的那样。标签文本是一个用户可阅读的摘要项目描述信息,数额是相对应的支付数额。在一个支付请求中所有的数额都要使用在这个请求中指定的货币。对于折扣或优惠券,则需要把数额设成负数。
Listing 3-1创建支付项目
1
2
3
4
5
6
7
//
NSDecimalNumber
self.subtotal
//
NSDecimalNumber
self.discount
注意
这里使用NSDecimalNumber类来存储摘要项目的数额,它是一个以10为底数的数值。可以使用指定尾数和指数的方式(像代码中那样)来创建这个类的实例,也可以通过指定字符串和locale来实例化,字符串指定了相应的数值。这里总是使用以10为底数的数值来做财务计算--例如当需要计算5%折扣掉的金额时。
尽管有时使用其它的计数方法更方便,但是像float或者Double这样的IEEE浮点数类型是不适合作财务计算的,这些数据类型使用的是以2为底数的数值表示方法,这就表示有一些十进制数值不能准确得被表示--例如0.42必须以0.41999这样的循环小数来近似表示,而这种近似表示常常会造成财务计算的错误结果。
在这个摘要项目列表中的最后一个是总计金额。这个金额是通过把所有其它金额相加而得到。总计的显示方法和其它的摘要项目不同:应该使用你公司的名称做为其标签,使用所有其它项目的金额总和做为金额。使用paymentSummaryItems
1
2
3
4
5
6
7
//
NSDecimalNumber
totalAmount
totalAmount
self.total
self.summaryItems
request.paymentSummaryItems
配送方式是一种特殊的摘要项目
对于每一种可用的配送方式创建一个PKShippingMethod的实例。就像其它支付摘要项目一样,配送方式包含用户易于辨别的标签,比如"标准配送"或者"第二天配送",还有一个金额来表示配送费用。与其它摘要项目不同的是,配送方式还有一个detail属性--像"7月29日到达"或者"24小时之内配送"等--可以用来解释各个配送方式之间的区别。
使用identifier属性来在代理方法中区分不同的配送方式,这个属性只会在你的应用内使用--框架看不到这个属性,并且它也不会出现在UI中。在创建配送方式时为其分配一个独一无二的标识符。为了方便调试,可使用文本缩写,比如"discount","standard", 或者 "next-day".
有一些配送方式在某些地区可能不适用,或者有不同的价格,你可以在用户选择配送地址或配送方式的代理方法时更新这些信息,就像YourDelegate Updates Shipping Methods andCosts描述的一样。
指定你支持的支付方式
通过在supportedNetworks属性中填入字符串常量数组来指定你支持的支付网络。通过指定merchantCapabilities属性来指定你支持的支付处理标准,3DS支付方式是必须支持的,EMV方式是可选的。
商家支持的支付处理标准使用标识位来进行组合,像下面这样:
1
2
3
4
5
request.supportedNetworks
//
request.merchantCapabilities
//
request.merchantCapabilities
指示所需配送信息和账单信息
通过填充
1
2
request.requiredBillingAddressFi
request.requiredBillingAddressFi
如果你已经有了用户的账单和配送信息,可以直接在支付请求中使用它们。但是尽管ApplePay默认使用了这些信息,用户仍然可以在授权支付的过程中修改这些信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ABRecordRef
CFErrorRef
BOOL
success
if
success
if
ABMultiValueRef
NSDictionary
(NSString
(NSString
(NSString
(NSString
};
ABMultiValueAddValueAndL
(__bridge
kABOtherLabel,
nil);
success
if
request.shippingAddress
CFRelease(shippingAddress);
CFRelease(record);
存储额外信息
使用applicationData属性来存储一些在你的应用中关于这次支付请求的唯一标识信息,比如一个购物车的标识符。在用户授权支付之后,这个属性的哈希值会出现在这次支付的token中。
part 4 授权支付
支付授权过程是由支付授权view controller和它的代理协作完成的。支付授权viewcontroller做了两件事情:它让用户选择支付请求所必需的账单和配送信息,还有让用户最终授权同意这次支付。当用户和viewcontroller交互时,代理方法就会被调用,这样你的应用就可以不断地更新显示的信息--例如在配送地址更改后更新配送费用。用户最终授权支付请求之后代理方法同样也会被调用。
注意:在实现这些方法时注意,这些方法可能会被多次调用,而它们被调用的顺序取决于用户的行为的顺序。
在所有这个授权过程中被调用的代理方法中,都会有一个completionblock被做为参数之一传入,支付授权viewcontroller会在一个代理方法执行完毕(通过调用completion块)后再调用另一个代理方法。唯一的例外是paymentAuthorizationView
这个completionblock有一个传入参数,基于现有的可用信息,你可以通过这个参数并指定这次交易的状态。如果这次交易没有任何问题,传入PKPaymentAuthorizationSt
通过在PKPaymentAuthorizationVi
1
2
3
4
PKPaymentAuthorizationVi
if
viewController.delegate
[self
当用户与这个视图控制器进行交互时,它的代理方法会被调用。
通过代理更新配送方式和费用
当用户提供配送信息之后,授权view controller 会调用paymentAuthorizationView
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-
{
}
-
{
}
当支付被授权后,支付token会被创建
当用户最终授权了一个支付请求,框架会通过与苹果服务器和嵌入在设备中的一个安全模块进行通信,生成一个支付token。然后你在paymentAuthorizationView
- 框架发送支付请求给安全模块,只有安全模块可以访问存储在设备上的标记化的卡信息。
- 安全模块把特定的卡和商家等支付数据加密,以保证只有苹果可以读取,然后发送给框架。框架会将这些数据发送给苹果。
- 苹果服务器再次加密这些支付数据,以保证只有商家可以读取。然后服务器对它进行签名,生成支付token,然后发送给设备。
- 框架调用相应的代理方法并传入这个token,然后你的代理方法传送token给你的服务器。
至于你的服务器采取的行为要取决于你是自己处理这次支付或者你是和其它支付平台合作来进行支付处理。不管怎样,你的服务器处理这个订单然后传送一个状态信息给设备,代理方法会把这个状态信息传送给completion块,像在“Processinga Payment”中讨论过的。
1
2
3
4
5
6
7
8
9
10
11
12
-
didAuthorizePayment:(PKPayment
completion:(void
{
NSError
ABMultiValueRef
NSDictionary
NSData
//
PKPaymentAuthorizationSt
completion(status);
}
在代理方法中释放授权View Controller
在框架显示交易状态之后,授权View Controller会调用代理paymentAuthorizationView
1
2
3
4
-
{
[controller
}
Part 5
处理一个支付请求涉及以下几个步骤:
- 把支付信息,以及支付流程+所需的其他信息,一起发送给你的服务器。
- 验证支付数据的哈希表和签名
- 为加密过的支付数据解码
- 向支付处理系统提交支付数据
- 向订单追踪系统提交订单
处理支付请求时,你有两个选择;你既可以利用支付平台处理支付请求,也可以自己实现支付请求处理流程。一个常用的支付平台可以完成上述大部分操作。
读取,验证,以及处理支付信息需要有一定的相关密码知识,例如计算SHA-1哈希表,读取和验证PKCS#7签名,执行EllipticCurveDiffie-Hellman密匙交换。如果没有一定的密码学背景,你可以考虑使用第三方支付平台来完成这些操作。
关于支持Apple Pay支付平台的更多信息,请参考developer.apple.com/apple-pay/
处理支付请求所用的信息拥有一种嵌套式的数据结构,如下图。支付令牌是PKPaymentToken类的实例。其paymentData属性值是一个JSON词典,它的头文件信息可以用来验证和加密支付数据。加密过的数据信息包括支付金额、持卡人姓名,以及一些其他指定的支付处理协议。
- Apple Pay
- Apple Pay
- Apple Pay
- apple Pay
- Apple pay
- apple pay
- Apple Pay
- apple pay
- Apple pay
- Apple Pay 究竟是什么
- Apple Pay的使用
- 苹果支付 apple Pay
- 浅谈Apple Pay开发
- Apple Pay初探
- Apple pay 论述
- Apple Pay开发详解
- Apple Pay支付分享
- iOS--Apple Pay
- Linux 控制台重定向至Console口
- Mark一下:成为CSDN博客专家
- Xamarin
- DataIntegration windows7 64 安装
- Cef应用资源布局
- Apple Pay
- structs2
- Android中Video的三种播放方式的实现
- android studio下“HAX is not working...”问题的解决
- C语言二分查找法
- Android常用布局及属性--LinearLayout
- IntentService简介
- Java内部类详解
- mysql新建表和修改字段例子