文章将描述如何在iOS App中开发支持中国用户的Apple Pay,包括前后端的一些处理逻辑如支付信息解密。
关于Apple Pay的一些基本认识和相应API,具体可以参照Apple Pay官方文档,这里不多说。

Apple Pay近期才引入中国,并针对中国增加了一些接口,如使用银联卡。这些接口在iOS9.2系统中,因此要开发此功能请先准备Xcode7.2或以上、iPhone真机iOS9.2或以上。可以看一下效果:

面直接进入正题。
首先,配置环境。可以参考这篇文章http://www.open-open.com/lib/view/open1422324034345.html
配置环境。其中需要注意的是创建merchantID的时候,会有一个选项表明创建的商户ID是中国还是美国,当然这里选择中国。
接下来创建支付请求。先说一下Apple Pay支付流程:用户验证完指纹或者密码->手机里的安全元件把支付卡信息、支付金额、配送地址等信息加密为token1,并上传至苹果服务器->苹果服务器用生成商户ID对应的公钥加密token1,得到token2并进行签名->苹果将token2通过代理方法回传给客户端->用对应的私钥解密token2得到支付信息。对应的支付信息格式以及说明可以参考Payment Token Format。
创建支付请求涉及的主要类如PKPaymentAuthorizationViewController和PKPaymentRequest等,其中可以添加联系电话、送货地址及配送费(本文不赘述,可参考官方文档)等,具体使用可以参考这里。

*是否能使用Apple Pay的API

+ (BOOL)canMakePayments;
+ (BOOL)canMakePaymentsUsingNetworks:(NSArray*)supportedNetworks capabilities:(PKMerchantCapability)capabilties;
+ (BOOL)canMakePaymentsUsingNetworks:(NSArray*)supportedNetworks; //该方法除设备、网络不支持等情况下会返回NO,用户未在Wallet中绑卡的情况下也会返回NO

创建支付信息:

PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
PKPaymentSummaryItem *total = [PKPaymentSummaryItemsummaryItemWithLabel:@"收款商户" amount:[NSDecimalNumber decimalNumberWithString:@"1"]];   // 金额request.paymentSummaryItems = @[total];
request.countryCode = @"CN";    // process支付的中国
request.currencyCode = @"CNY"; // 金额展示为人民币格式
request.supportedNetworks = @[PKPaymentNetworkChinaUnionPay];  // 中国银联
request.merchantIdentifier = @"merchant.com.company.test";
request.merchantCapabilities = PKMerchantCapabilityEMV | PKMerchantCapability3DS;PKPaymentAuthorizationViewController *paymentSheet = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
if (paymentSheet) {
[self presentViewController:paymentSheet animated:YES completion:nil];
paymentSheet.delegate = self;
}

代理方法

- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus))completion{
NSData *data = payment.token.paymentData;
NSDictionary *dicFormatToken = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves|NSJSONReadingAllowFragments|NSJSONReadingMutableContainers error:nil];// 将dicFormatToken异步解密,并支付
// ...// 将支付结果回调给苹果
if (/*payment is complete*/) {
completion(PKPaymentAuthorizationStatusSuccess);
}
}- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{
[controller dismissViewControllerAnimated:YES completion:nil];
}

解密Token得到支付信息。

苹果回调的token格式如下:

{
"data" : "....",
"header" :    {
"publicKeyHash" : "....",
"transactionId" : "......",
"wrappedKey" : "......"
},
"signature" : ".....";
"version" : "RSA_v1"
}
*解密前需要对signature验签,验证此次支付的正确和安全性。苹果官方的验签步骤如下:
1. Get Apple G3 root CA certificate from this URL: https://www.apple.com/certificateauthority/ and load the certificate into a key store
2. Build a certificate path from certificate chain in PKCS 7 signature
3. Verify the certificate path is valid using the key store built on step 1.
4. the signature was computed on input: Base64.decode(wrappedKey)+Base64.decode(encryptedData)+Hex.decode(transactionID).  It is a PKCS7 signaure.  Signature's algorithm, Apple's In-App payment server's signing key certificate and it's sub-ca certificate are included in the signature tag in JSON.
*待签名成功之后,就可以解密token了。用商户私钥解密wrappedKey得到对称秘钥,用对称秘钥解密data就得到支付信息了。解密得到的支付信息中包含卡号(可卡bin的虚拟卡号)、支付金额、银行卡密码等信息。这个时候就可以利用这些信息开始发起支付并扣款了。
得到支付结果后,利用代理方法中的complete块回调给苹果,苹果根据相应的支付状态展示给用户。目前苹果对于支付状态的处理只有支付成功、失败、无效账单地址、无效邮寄地址、无效联系方式、以及iOS9.2开始支持的银行卡密码错误、密码锁定、未输入密码。

iOS App集成Apple Pay 编程指南(中国版)相关推荐

  1. iOS App集成Apple Pay教程(附示例代码)

    苹果在本周一发布了iOS 8.1版本,并正式开放了Apple Pay支付系统.Apple Pay是一个基于NFC的支付系统,不久将被数以万计的线下零售商店予以支持.即便这项科技并不是彻底的突破性进展, ...

  2. Apple Pay编程指南(1) - 简介

    目录 前言 Apple Pay说明 如何测试Apple Pay交易? Apple Pay 系列文章是苹果官方文档的中文翻译,这将是最详尽最规范的说明. 原文链接: 苹果开发文档 Apple Pay编程 ...

  3. iOS学习笔记64-Apple Pay编程指南

    本文由CocoaChina译者xiaoying.tr培子翻译自苹果官方文档:Apple Pay Programming Guide 目录 关于Apple Pay 配置支付环境 创建支付请求 授权支付 ...

  4. Spark编程指南——Python版

    摘要:对于1个年仅5岁的开源项目来说,其远谈不上尽善尽美,就比如文档相关.本文翻译自Spark Programming Guide,选取了其中使用Python的部分. 自开源之日至今,Spark已经5 ...

  5. Spark编程指南(Python版)

    Spark编程指南 译者说在前面:最近在学习Spark相关的知识,在网上没有找到比较详细的中文教程,只找到了官网的教程.出于自己学习同时也造福其他初学者的目的,把这篇指南翻译成了中文,笔者水平有限,文 ...

  6. uni-app开发App上架Apple Store流程(简略版)

    环境准备: MacBook(安装HBuilderX.XCode.Developer.TestFlight.Transporter),苹果开发者账号 详细版地址:http://t.csdn.cn/mTM ...

  7. Spark SQL编程指南-收费版

    Spark SQL 编程指南 Spark SQL是用于结构化数据处理的一个模块.同Spark RDD 不同地方在于Spark SQL的API可以给Spark计算引擎提供更多地 信息,例如:数据结构.计 ...

  8. iOS App被Apple拒绝的原因

    1.程序有重大bug,程序不能启动,或者有crash. 2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币. 3.游戏里有实物奖励的话,一定要说清楚,奖励由本公司负责,和苹果没有关系. 4.用到 ...

  9. iOS App 安装包瘦身指南

    以下列出了安装包瘦身的无脑执行流程,其中"奇技淫巧"部分为选做题 资源优化 删除无用图片 使用LSUnusedResources查找无用图片 删除重复资源 压缩图片资源 使用Ima ...

最新文章

  1. epoll 或者 kqueue 的原理是什么?
  2. 无法定位软件包_使用Degraph管理软件包依赖关系
  3. 你那么追捧的springboot,到底替你做了什么?
  4. PHP输出表格的方法
  5. Oracle数据库实用脚本
  6. 玩转oracle 11g(21):修改为静态监听
  7. 七牛云图片--Java文档
  8. oracle 12 if,Oracle 12.1 RAC 系列 – 配置第二个网络和相应的SCAN2
  9. Tomcat 5 5 JNDI Resource 配置
  10. 6-SqlMapConfig.xml配置文件
  11. python跟excel_Python与Excel 不得不说的事情
  12. 杭电2002(我们没有什么不同)
  13. jquery.hotkeys监听键盘按下事件keydown
  14. 解决steam无法启动gta5报错msvcp140.dll丢失
  15. 着眼产业合作、情报分享 网易云易盾加入云清联盟
  16. 优知学院创始人陈睿:怎样做好一个创业公司CTO?
  17. 在idear中基于ssm框架做一个项目需要考虑的基本步骤
  18. 七剑下天山?七步搞定DB2查询优化!
  19. 关于win11 碍眼的主文件夹的有效删除办法
  20. 双线性插值算法的详细总结

热门文章

  1. 猿创征文|Google Earth Engine(GEE)实现土地利用数据栅格转矢量
  2. js 省市级练。js 省市
  3. 洛谷 P5266 【深基17.例6】学籍管理
  4. 如何实现上传图片并显示图片?
  5. 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra
  6. Eclipse+Maven+Nexus+Tomcat远程搭建CentOS web server
  7. Cocos 引擎助力游戏开发者突围
  8. wustl计算机科学世界排名,2020年圣路易斯华盛顿大学排名TFE Times美国最佳计算机科学硕士专业排名第49...
  9. java properties 遍历_如何遍历properties文件的键值对并放置到application作用域里
  10. 部署hexo遇到报错ERROR Deployer not found: git的解决办法