2016年2月18日,ApplePay终于登陆中国了~
这对果粉尤其是苹果系开发者来说,无疑是一件好事,然而让开发者苦恼的是,我们应该如何接入ApplePay?开发指南只是讲解了如何获取token,但是如何通过token处理支付并没有相关说明,只是推荐大家通过第三方平台来处理支付流程:
In most cases, your app passes the encrypted payment token to a third-party payment platform to decrypt and process the payment. However, if your team has an existing payment infrastructure, you can decrypt and process the payment on your own server.
在苹果开发者中心可以看到,有如下几家第三方支付平台可以接入ApplePay:
- CUP(中国银联)
- LianlianPay (连连支付)
- PayEase (首信易支付)
- YeePay (易宝)
- UMS(银联商务)
详见:https://developer.apple.com/apple-pay/
嗯,接入渠道还是有的,只是没有广泛宣传而已,在这里我们就讲一下如何通过银联接入ApplePay。
在银联申请ApplePay
步骤一、成为银联手机支付入网商户
参照《全渠道业务运营服务指引》,签署业务 Apple Pay 线上支付合作协议,申请银联商户代码,准备接入的相关参数。
步骤二、登录银联商户服务平台,通过商户服务平台申请 CSR
1、 成为银联商户服务平台用户。
在申请银联 Apple Pay 接入时,银联的联系人会分配商户服务平台的登录权限及 CSR 的申请权限。存量商户应确认是否开通了 Apple Pay 接入权限。
2、 通过银联商户服务平台申请 CSR
银联在商户服务平台 https://merchant.unionpay.com/中提供 Apple Pay 的 CSR 下载
功能。登录商户服务平台,进入安全管理-CSR 文件下载,点击“生成 CSR”按钮,并将 获取的 CSR 保存。CSR 文件与商户代码一一对应,是交易安全保护的重要环节,请勿将 CSR 透漏给无关人员。
3、 商户服务平台 CSR 生成页面示意
重置 CSR 后,原 CSR 即刻失效,应重新向苹果公司的网站提交新的 CSR 文件。
在开发者中心开通ApplePay
步骤一、申请 MerchantID
登陆MemberCenter,选择Certificates, Identifiers & Profiles;
在Identifiers下选择Merchant IDs,点击右上角添加按钮添加Merchant ID;
输入描述信息和标识符(格式为merchant.com.company.productid),继续至完成即可。
步骤二、请求证书
进入MemberCenter,根据之前步骤找到前面申请的Merchant ID;
在这里可以编辑该项,上传之前生成的CSR文件并生成cer证书文件;
下载证书文件即可。
到这里,我们的ApplePay权限已经开通完毕,接下来就可以在项目中接入了。
需要注意的是,之前ApplePay没有入华前,证书申请需要苹果工作人员开通白名单,不知入华后是否还需要这一步。
在项目中接入ApplePay
步骤一、工程设置
在应用内集成Apple Pay,需要引用依赖库PassKit.framework,并且在Capability中启用Apple Pay权限(在这里需要配置merchantId)。
步骤二、接入银联ApplePaySDK
支付流程如下:
1-2、 商户生成订单,通过商户 SERVER 端将订单信息发送给银联支付网关; 3-4、银联支付网关记录订单信息,返回用来标识订单的 TN 号,经由商户 SERVER 返回至给 商户 APP;
5、 商户 APP 调用银联 SDK,将 TN 号传递给银联 SDK
6、 银联 SDK 向苹果公司的 PASSKIT FRAMEWORK 发起支付请求;
7、 接口返回加密的支付 Token 信息;
8-9、银联 SDK 将支付 Token 传递给银联支付网关,完成交易认证;
10-12、银联将支付结果返回给商户 APP,商户 SERVER,商户 APP 负责提示用户交易结果。
相信曾经接入过银联支付SDK的同学对这张图会比较熟悉,是的,这里的支付流程和之前几乎一模一样,只是多了银联SDK和PassKit交互的部分,之前的卡PIN输入变成了token获取。
银联也是提供了专为ApplePay封装的SDK,与Passkit之间的交互完全由银联来代理。
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">UPAPayPlugin</span> : <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">NSObject</span></span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//调起支付接口,比原先只多了APMechantID一个参数</span>
+ (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)startPay:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span>*)tn mode:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span>*)mode viewController:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">UIViewController</span>*)viewController delegate:(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">id</span><UPAPayPluginDelegate>)delegate andAPMechantID:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span>* )mID;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//回调委托协议</span>
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@protocol</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">UPAPayPluginDelegate</span> <<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">NSObject</span>></span>
-(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>) UPAPayPluginResult:(UPPayResult *) payResult;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>
以上,就是应用内通过银联接入ApplePay的大体流程。
控件包在此,包括接入文档、SDK及DEMO,大家可自行获取~资源地址