iOS App集成Apple Pay 编程指南(中国版)
文章将描述如何在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"
}
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.
得到支付结果后,利用代理方法中的complete块回调给苹果,苹果根据相应的支付状态展示给用户。目前苹果对于支付状态的处理只有支付成功、失败、无效账单地址、无效邮寄地址、无效联系方式、以及iOS9.2开始支持的银行卡密码错误、密码锁定、未输入密码。
iOS App集成Apple Pay 编程指南(中国版)相关推荐
- iOS App集成Apple Pay教程(附示例代码)
苹果在本周一发布了iOS 8.1版本,并正式开放了Apple Pay支付系统.Apple Pay是一个基于NFC的支付系统,不久将被数以万计的线下零售商店予以支持.即便这项科技并不是彻底的突破性进展, ...
- Apple Pay编程指南(1) - 简介
目录 前言 Apple Pay说明 如何测试Apple Pay交易? Apple Pay 系列文章是苹果官方文档的中文翻译,这将是最详尽最规范的说明. 原文链接: 苹果开发文档 Apple Pay编程 ...
- iOS学习笔记64-Apple Pay编程指南
本文由CocoaChina译者xiaoying.tr培子翻译自苹果官方文档:Apple Pay Programming Guide 目录 关于Apple Pay 配置支付环境 创建支付请求 授权支付 ...
- Spark编程指南——Python版
摘要:对于1个年仅5岁的开源项目来说,其远谈不上尽善尽美,就比如文档相关.本文翻译自Spark Programming Guide,选取了其中使用Python的部分. 自开源之日至今,Spark已经5 ...
- Spark编程指南(Python版)
Spark编程指南 译者说在前面:最近在学习Spark相关的知识,在网上没有找到比较详细的中文教程,只找到了官网的教程.出于自己学习同时也造福其他初学者的目的,把这篇指南翻译成了中文,笔者水平有限,文 ...
- uni-app开发App上架Apple Store流程(简略版)
环境准备: MacBook(安装HBuilderX.XCode.Developer.TestFlight.Transporter),苹果开发者账号 详细版地址:http://t.csdn.cn/mTM ...
- Spark SQL编程指南-收费版
Spark SQL 编程指南 Spark SQL是用于结构化数据处理的一个模块.同Spark RDD 不同地方在于Spark SQL的API可以给Spark计算引擎提供更多地 信息,例如:数据结构.计 ...
- iOS App被Apple拒绝的原因
1.程序有重大bug,程序不能启动,或者有crash. 2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币. 3.游戏里有实物奖励的话,一定要说清楚,奖励由本公司负责,和苹果没有关系. 4.用到 ...
- iOS App 安装包瘦身指南
以下列出了安装包瘦身的无脑执行流程,其中"奇技淫巧"部分为选做题 资源优化 删除无用图片 使用LSUnusedResources查找无用图片 删除重复资源 压缩图片资源 使用Ima ...
最新文章
- epoll 或者 kqueue 的原理是什么?
- 无法定位软件包_使用Degraph管理软件包依赖关系
- 你那么追捧的springboot,到底替你做了什么?
- PHP输出表格的方法
- Oracle数据库实用脚本
- 玩转oracle 11g(21):修改为静态监听
- 七牛云图片--Java文档
- oracle 12 if,Oracle 12.1 RAC 系列 – 配置第二个网络和相应的SCAN2
- Tomcat 5 5 JNDI Resource 配置
- 6-SqlMapConfig.xml配置文件
- python跟excel_Python与Excel 不得不说的事情
- 杭电2002(我们没有什么不同)
- jquery.hotkeys监听键盘按下事件keydown
- 解决steam无法启动gta5报错msvcp140.dll丢失
- 着眼产业合作、情报分享 网易云易盾加入云清联盟
- 优知学院创始人陈睿:怎样做好一个创业公司CTO?
- 在idear中基于ssm框架做一个项目需要考虑的基本步骤
- 七剑下天山?七步搞定DB2查询优化!
- 关于win11 碍眼的主文件夹的有效删除办法
- 双线性插值算法的详细总结
热门文章
- 猿创征文|Google Earth Engine(GEE)实现土地利用数据栅格转矢量
- js 省市级练。js 省市
- 洛谷 P5266 【深基17.例6】学籍管理
- 如何实现上传图片并显示图片?
- 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra
- Eclipse+Maven+Nexus+Tomcat远程搭建CentOS web server
- Cocos 引擎助力游戏开发者突围
- wustl计算机科学世界排名,2020年圣路易斯华盛顿大学排名TFE Times美国最佳计算机科学硕士专业排名第49...
- java properties 遍历_如何遍历properties文件的键值对并放置到application作用域里
- 部署hexo遇到报错ERROR Deployer not found: git的解决办法