前言
ApplePay是苹果公司推出的一种线上/线下的便捷支付方式,根据TouchId来验证支付卡持卡人身份,ApplePay并不参与资金流动,最终还是让银行完成扣款处理,目前据Apple介绍只配备在iphone6以上和新款的ipad Air2和ipad mini3上,中国地区最低系统要求为iOS9.2.
注意
:Apple Pay功能支持的是iPhone6以上,iOS9.2以上. 且目前企业级证书是不支持的,只有个人开发者证书才支持.
一、 Apple Pay 支付流程介绍
1、买家在手机应用中购买商品或服务,在订单页面中展示 Apple Pay 按钮
2、通过银联控件,掉起 Apple Pay 支付页面
3、用户通过支付页面验证 Touch ID,输入银行卡密码 ,是否需要输入银行卡密码取决于交易限额和银行支持情况
4、支付成功,商户应用内展示成功页面
(1)支付成功页面应参照 UI 示例,展示“银联”标识,“云闪付”标识。
(2)银联 SDK 控件支持折扣功能。在折扣活动期间,商户应用内应参照实例 UI 进行原金额、折扣金额的展示
二、银联支付控件 SDK 模式 Apple Pay 支付的实现方式
- 获取订单信息tn编号
1-2、 商户生成订单,通过商户 SERVER 端将订单信息发送给银联支付网关;
3-4、银联支付网关记录订单信息,返回用来标识订单的 TN 号,经由商户 SERVER 返回至给 商户 APP;
- 调用银联SDK方法发起支付请求
5、 商户 APP 调用银联 SDK,将 TN 号传递给银联 SDK
6、 银联 SDK 向 Apple 公司的 PASSKIT FRAMEWORK 发起支付请求;
- 支付验证
7、 接口返回加密的支付 Token 信息;
8-9、银联 SDK 将支付 Token 传递给银联支付网关,完成交易认证;
- 返回支付结果
10-12、银联将支付结果返回给商户 APP,商户 SERVER,商户 APP 负责提示用户交易结果。
三、银联 SDK 模式下商户接入银联 Apple Pay 在线支付流程
步骤一、成为银联手机支付入网商户
(1)注册银联开放平台账号(https://open.unionpay.com/ajweb/index)
(2)填写商户信息并申请成为入网商户
步骤二、登录银联商户服务平台,通过商户服务平台申请 CSR文件
- 关于商户 CSR
接入银联 Apple Pay 在线支付的商户,须生成 Apple Pay 专用的 CSR 文件并提交至 Apple 开发者网站进行签名,以签署证书,取得 Apple Pay 的访问权限。
在银联 SDK 模式中,银联代为商户生成 CSR 文件,商户可直接登录银联商户服务平台获取。
- 商户 CSR 申请方式:
a、 成为银联商户服务平台用户。
在申请银联 Apple Pay 接入时,银联的联系人会分配商户服务平台的登录权限及 CSR 的申请权限。存量商户应确认是否开通了 Apple Pay 接入权限。
b、 通过银联商户服务平台申请 CSR
银联在商户服务平台 (https://merchant.unionpay.com/) 中提供 Apple Pay 的CSR文件下载
功能。
登录商户服务平台,进入安全管理-CSR 文件下载,点击“生成 CSR”按钮,并将 获取的 CSR 保存。
CSR 文件与商户代码一一对应,是交易安全保护的重要环节,请勿将 CSR 透漏给无关人员。
步骤三、将 CSR 提交至 Apple,生成 Merchant ID 和 描述文件
- 1、创建AppID
登录开发者中心,创建App ID,填写描述及Bundle ID。
- 2、在App Services里勾选 Apple Pay Payment Processing 以开启该功能
点击Continue后,会发现概览该App ID时,Apple Pay服务是等待配置状态的,接下来点击Register继续
- 3、创建 Merchant ID,并绑定到相关App ID
-
4、由于加密需要证书,所以还要对刚创建的Merchant ID添加证书(加密根据证书来的),Merchant ID点Edit
点击 Create Certificate, 这里询问是否支持中国以外的地区处理支付,这里要根据实际需求选择
Continue后,需要上传一个CSR文件(银联在商户服务平台下载的那个CSR文件)
把生成的cer文件下载到本地,双击安装
此时查看钥匙串发现该证书显示 “此证书是由未知颁发机构签名的”
解决办法:重新下载系统证书 Worldwide Developer Relations - G2 Certificate 并双击安装
(http://www.apple.com/certificateauthority/)
- 5、配置 App ID中Apple Pay服务
由于刚才创建的App ID中Apple Pay服务仍处于待配置状态,在App IDs列表中找到刚才创建的App ID展开,点击Edit对其进行编辑。
在弹出的界面中勾选对应的Merchant ID,Continue
然后Assign,此时就完成了为App ID添加 Merchant ID。可以点开该App ID进行确认,可看到Apple Pay服务已可用
- 6、生成开发和发布描述文件并下载添加到Xcode
步骤四、创建Xcode工程并为其开启Apple Pay
-
1、使用Xcode创建工程,设置相关Bundle ID:
2、开启Apple Pay功能:
到Xcode的Capabilities中,找到Apple Pay开关,打开
- 3、添加银联SDK 并加入依赖的库文件
a、添加 Apple Pay 版本静态库文件
包含文件:
UPAPayPlugin.h
UPAPayPluginDelegate.h
libUPAPayPlugin.a
b、添加 CFNetwork.framework 、 libUPAPayPlugin.a 、 PassKit.framework 、 SystemConfiguration.framework 到商户 App 工程中
c、http 请求设置,设置NSAllowsArbitraryLoads 属性值为 YES
注意:
如果工程的 compile source as 选项的值不是 Objective–C++,则引用此头文件的文件类型都要 改为.mm
- 4、接口调用
a、商户 App 从商户服务器获取 tn,当 tn 不为空时,调用支付接口。
//当获得的tn不为空时,调用支付接口
if (tn != nil && tn.length > 0) {
if([PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkChinaUnionPay]] )
{
//调用银联支付控件
[UPAPayPlugin startPay:tn mode:self.testMode viewController:self delegate:self andAPMechantID:kAppleMechantID]; }
}
b、处理支付结果
银联手机支付控件结果回调函数有四个支付状态返回值,在 UPPayResult 类中有关于 UPPaymentResultStatus 的详细说明。
商户 App 通过在工程中添加头文件 “UPAPayPluginDelegate.h”,然后在处理交易结果界面中根据该头文件中定义的回调函数:-(void)UPAPayPluginResult:(UPPayResult *)result 来实现回调方法,从而根据支付结果的不同进行相应的处理。
结果回调函数示例代码:
-(void)UPAPayPluginResult:(UPPayResult *)result
{
if(result.paymentResultStatus == UPPaymentResultStatusSuccess) {
NSString *otherInfo = result.otherInfo?result.otherInfo:@"";
NSString *successInfo = [NSString stringWithFormat:@"支付成功\n%@",otherInfo];
[self showAlertMessage:successInfo];
}
else if(result.paymentResultStatus == UPPaymentResultStatusCancel){
[self showAlertMessage:@"支付取消"];
}
else if (result.paymentResultStatus == UPPaymentResultStatusFailure) {
NSString *errorInfo = [NSString stringWithFormat:@"%@",result.errorDescription];
[self showAlertMessage:errorInfo];
}
else if (result.paymentResultStatus == UPPaymentResultStatusUnknownCancel) {
//TODO UPPAymentResultStatusUnknowCancel表示发起支付以后用户取消,导致支付状态不确认,需要查询商户后台确认真实的支付结果
NSString *errorInfo = [NSString stringWithFormat:@"支付过程中用户取消了,请查询后台确认订单"];
[self showAlertMessage:errorInfo];
}
}