目前的接入方式有两种,一是使用第三方提供商的SDK接入,另一种是让PassKit Framework直接与银联的接口对接,当然网络上还有一些自己使用PassKit PaymentRequest自己生成订单组织信息,直接与Apple对接的Demo,因为我们不可能每家银行跑去签约,大陆的银行也不会给我们开放特许,因此这种方式仅仅能用于测试ApplePay的功能和API尝鲜,并不适用于生产中。

ApplePay官网上有列出中国目前支持并提供SDK的第三方提供商

使用第三方SDK接入的优点是开发成本比较低,并且各自都应该有高度定制的Payment Sheet(因订单信息完整度的不同),可供定制更详细的商品信息展示,缺点就是要钱。

若我们选择后者,相对开发成本会高,移动端不仅需要对支持性进行验证,协商银联接口数据对Payment Sheet的展示关闭进行控制,对各种异常进行捕抓和处理,同时后台需要自己实现对银联接口的认证交互,对交易数据的标准封装,订单状态的处理,支付信息的解密等。

我们选择使用银联SDK接入这种折中的方式,免费,工作量可以接受。

使用银联SDK接入的实现方式如图所示,主要工作是商户后台利用现成的API与银联的交互:

申请MerchantID并更新你的证书:

向苹果申请我们独有的商户ID,这里我借用Yasin朋友在简书上分享的详细步骤,真的很详细易懂。

获得MerchantId后,更新你的证书,并且于项目->targets->Capabilities中打开ApplePay权限,选择正确的MerchantID,让三个steps成为tick状态完全权限的配置。

ok开始与银联碰头,于银联商家技术服务中心找到ApplePay入口,然后在”技术文档”选项卡中可以找到相应的SDK和后台文档。

这里我使用PHP后台,在下载的SDK压缩包里找到了PHP Version SDK,忽略掉这个外壳,我们需要将子文件夹upacp_demo_app部署到我们的服务器中。

这里我将upacp_demo_app部署到我mac的PHP环境中,打开upacp_demo_app/demo/api_05_app可以看见各种对订单处理的接口。

订单的创建,取消,查询,退款等,现在我们测试下创建订单接口

订单参数

下图是创建订单的请求参数,目前银联创建ApplePay订单仅支持图中所示的参数字段,基本满足使用但可定制性比较低,最基本的订单参数merId商户号,orderId订单号,txnTime订单发送时间,txnAmt订单金额,目前测试阶段我们可以通过直接调用此接口post传参,也可以直接写死在php文件中

  • 注意:这里的merId是银联商户号,而非苹果分配的MerchantID。

测试证书

了解到这里后还没有具备生成订单的条件,然后我们需要配置配置签名证书和验签证书的路径,这些证书在SDK下载包里面已经有附带,我们只需要在upacp_demo_app/sdk/SDKConfig.php文件中配置好他们的路径即可

这里需要配置主机的绝对路径,不能使用项目相对路径,完成SDK_SIGN_CERT_PATH,SDK_ENCRYPT_CERT_PATH,SDK_VERIFY_CERT_DIR路径的配置

成功获取tn

我们请求下Form_6_2_AppConsume.php接口,即可创建订单,并且返回对应的Trade Name,在App端我们就是拿这个Trade Name来对相应的订单进行付款。

拿到订单tn后,我们已经可以使用银联SDK调起支付,在这之前还要做的就是对设备和平台的支持性检测,通过,present出Payment Sheet即可。

工程配置:

  1. 添加SDK包:

将下载SDK解压包中找到applePaySDK文件夹,加入到需要接入ApplePay的项目中。

这里注意,项目内如果同时支持银联普通支付的话,因为两个库引用重复,最好的办法就是升级银联SDK至最新版本(3.3.3),当然可以使用添加Linker Flags的方式解决,或者可以自己剥离掉重复部分,我是懒人,我选择升级哈哈。

2.为工程引入必须的framework:

  • CFNetwork.framework

  • PassKit.framework

  • SystemConfiguration/framework

  • libUPAPayPlugin.a

  • libz.1.2.5.tbd

3.银联SDK使用http请求,在ios9以后需在工程plist文件中添加NSAppTransport

Security来支持Http继续使用。

—注意—

  • 因为银联SDK内部分代码是由C/C++组织,这里必须添加libz.1.2.5.tbd,并且将引用到UPAPayPlugin.h的源文件的后缀改为.mm

  • 同时检查Target->Build Settings->Search Paths->Library Search Paths中自定义库libUPAPayPlugin.a的路径是否正确

4.最后可以开始写代码了,在需要调起ApplePay支付控件的文件中引入头文件UPAPayPlugin.h(记得文件名后缀需要改成.mm),PassKit/PassKit.h

- (void)verifiesApplePayAbility {

if (![PKPaymentAuthorizationViewController class]) {

//检查系统版本支持性

PopMessage(@"当前系统版本不支持ApplePay,最低支持:iphone6, ios9.0以上");

return;

} else if (![PKPaymentAuthorizationViewController canMakePayments]) {

//检查设备支持性

PopMessage(@"当前设备不支持ApplePay,最低支持:iphone6, ios9.0以上");

return;

} else {

//检查卡片支持性

NSArray *supportedNetwork = @[PKPaymentNetworkVisa, PKPaymentNetworkMasterCard, PKPaymentNetworkChinaUnionPay, PKPaymentNetworkAmex, PKPaymentNetworkDiscover];

if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetwork]) {

PopMessage(@"没有绑定支持的卡片");

return;

}

}

//调起苹果支付控件

[self presentPaymentSheet];

}

- (void)presentPaymentSheet {

WaitingMessage(@"正在呼出ApplePay支付控件");

[UPAPayPlugin startPay:yourPayTn mode:self.applePayMode viewController:self delegate:self andAPMechantID:kAppleMechantId];

//-startPay 第一个参数是后台向银联请求创建订单获得的商品tn

//mode是字符串,00为正式环境,01为测试环境

//此处的MechantID传的是从苹果那获取的mechantId

}

如果需要对借记卡/信用卡作限制,在检查卡片支持性的步骤可以这样写:

//检查卡片支持性

NSArray *supportedNetwork = @[PKPaymentNetworkVisa, PKPaymentNetworkMasterCard, PKPaymentNetworkChinaUnionPay, PKPaymentNetworkAmex, PKPaymentNetworkDiscover];

PKMerchantCapability capabilities = PKMerchantCapabilityEMV | PKMerchantCapability3DS | PKMerchantCapabilityDebit;

if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetwork capabilities:capabilities]) {

PopMessage(@"没有绑定支持的卡片,本支付仅支持使用借记卡支付");

return;

}

最后是银联ApplePay的支付回调:

返回的UPPayResult对象中有各种支付状态,同时我们还应该检查他的otherInfo属性,里面包含银联的优惠活动信息,如果有则应该在支付成功页中告知客户。

//实现UPAPayPluginDelegate

- (void)UPAPayPluginResult:(UPPayResult *)payResult {

//do something

//检查是否有银联优惠信息,告知客户

}

otherInfo中包含优惠信息的格式为:

otherInfo = "currency=元

!!!目前不支持商户自定义优惠活动!!!

博主自己研究了php API很久后无果,咨询银联客服,然后彻底死心。。

展示

以下左图是通过银联SDK接入,因为可定制参数比较少,Payment Sheet比较简短,右图是使用苹果API直接生成的订单。

相信美团的ApplePay也是跟银联对接的,心血来潮买了个流量顺便作下对比

生产环境:

csr文件

若需要在生产环境中使用银联SDK接入ApplePay,首先需向银联申请开通ApplePay服务(联系下签约服务),并从银联商户服务平台生成ApplePay专用的CSR文件,重新去苹果开发者网站签署证书。

公钥,私钥

公钥在SDK下载包里面有,私钥在cfca入网通知邮件里面附带也可以自行下载,一个商户号唯一一份私钥和授权码,跟银联普通支付私钥是同一份。

配置

修改生产环境配置文件中的签名证书,密码,后台url地址

更换正式环境商户号(也可以是同一个)

app前端startPay方法的mode参数改为”00″

Apple Pay线上支付的流程和app应用内接入的方法相关推荐

  1. miui 9 android pay,小米9多功能NFC再升级,Mi Pay线上支付上线

    IT之家2月21日消息 2019年2月20日,小米全新旗舰产品小米9正式发布.发布会上雷军宣布小米公交京津冀互联互通卡城市支持数量增至160座,另外,Mi Pay也迎来全新功能升级.新增支持线上支付. ...

  2. 线上支付支付宝个人支付接入流程详解

    一直以为想做线上支付必须要有营业执照,害得我和很多个人开发者一样,绕了很多圈子.尝试过一些第三方的接入(不稳定,担心跑路). 原来支付宝是有个人支付接口的,利用支付宝的"当面付"接 ...

  3. 支付宝,微信,线上支付流程介绍

    这篇文章中我们介绍下目前中国市场线上支付主流的形式及流程 支付宝支付系统交互流程: 微信支付系统交互流程: 在我们写支付相关功能时,其实最主要的就是理解如上的两张图,我们可以把它们大致简化为: 商户服 ...

  4. 如何对接好线上支付?

    线上支付是很多独立的app以及网页,H5需要做的,那么到底应该如何接入线上支付呢? 首先,我们要确认,自己的支付场景是什么. 确认好支付场景,那么收单机构也要准备好,支付宝的收单只能是支付宝,微信也只 ...

  5. 在线支付线上支付是什么?其应用范围

    百里支付 在线支付线上支付是什么?其应用范围 1途径  在线支付是一种通过第三方提供的与银行之间的支付接口进行支付的方式,这种方式的好处在于可以直接把资金从用户的银行卡中转账到网站帐户中,汇款马上到帐 ...

  6. 第十五届全国大学生智能车竞赛 室外光电组线上选拔赛比赛流程

    第十五届全国大学生智能车竞赛 室外光电组线上选拔赛比赛流程 作者:卓晴博士,清华大学自动化系 更新时间:2020-07-30 Thursday 1.线上选拔赛将采取腾讯会议直播与电脑录屏结合的方式进行 ...

  7. apple pay php 文档,Apple Pay 终于可以支付 iTunes、App Store 中的内容了

    虽然苹果很早就推出了支付服务 Apple Pay,但它一直以来都只被用于面向第三方的支付场景,苹果的 iTunes.App Store 等利用 Apple ID 登录的平台则采用一套独立的支付体系.不 ...

  8. web电商、商城pc端、商城、购物车、订单、线上支付、web商城、pc商城、登录注册、人工客服、收货地址、现金券、优惠券、礼品卡、团购订单、评价晒单、消息通知、电子产品商城、手机商城、电脑商城

    web电商.商城pc端.商城.购物车.订单.线上支付.web商城.pc商城.登录注册.人工客服.收货地址.现金券.优惠券.礼品卡.团购订单.评价晒单.消息通知.电子产品商城.手机商城.电脑商城 Axu ...

  9. 第十七届智能视觉组线上赛比赛流程及相关补充说明

      线上赛规则及流程发布后陆续收到参赛同学和老师们的建议,一部分建议可以使得竞赛过程更完善,故增加此文档对智能视觉组的流程及相关细节进行补充说明. 一.场地准备   在"第十七届全国大学生智 ...

最新文章

  1. 计算机数学基础 课程定位图形,本科《计算机数学基础》(上)课程教学设计方案.doc...
  2. 使用freemarker生成xml模板
  3. virtualenv模块使用
  4. DCB(串口的DCB结构)
  5. 面向对象程序的设计模式
  6. 实分析royden第四版答案_实分析(原书第4版)_[美]H.L.罗伊登(H.L.Royden) P.M.菲茨帕特里克(P.M.Fitzpatrick)_9787111630845_...
  7. 激活函数(激励函数)理解总结
  8. 关于C语言中fseek函数的使用
  9. 复旦大学数学学院 18 级本科生对每周一题的评价
  10. 寒假集训大作业(一)
  11. LaTex 最狠的网站 嘎嘎狠
  12. linux下中文输入法的安装(解决菜单栏输入法图标消失问题)
  13. 浅谈BCrypt密码加解密的使用
  14. 大学计算机D(VB.NET)
  15. WEB安全性测试测试用例(基础).doc
  16. php高级程序员/php开发工程师/web技术员
  17. js 截取指定字符后面/前面的所有字符串
  18. 网站设计|10大创意教你设计网站主页
  19. NUC980开源项目37-RX8025t 时钟芯片
  20. PMP考试的一次通过率真实的是多少?

热门文章

  1. yolov1原文地址以及论文翻译
  2. 自然语言处理之hmm(隐马尔可夫模型)
  3. matlab能画五维吗,进化算法之粒子群算法和Matlab实现(多维)
  4. Python爬虫练习-查询lol隐藏分
  5. 【1】机器人手眼标定:固定向上相机
  6. 手动解除fail2ban的ip
  7. 清理异常值(MAD:绝对中位差)
  8. push()与pop()的使用
  9. 完整 Python中切片说明 arr [start: end: step] (arr [-1]、arr[:-1]、arr [::-1] 等的区别)
  10. 使用CollapsingToolbarLayout高仿稀土掘金个人中心页