Apple Pay的实现
首先是搜到的大神写的全套知识点:http://www.jianshu.com/p/8d7b86f1d142
http://www.cnblogs.com/dashunzi/archive/2016/02/23/ApplePay.html
银联和Apple Pay的关系
http://www.voidcn.com/blog/l964968324/article/p-5737385.html
创建AppID
给APP添加Apple Pay的权限
申请创建MerchantID
编辑Merchant ID设置支持的支付的国家地区(即是否支持国外支付,上传一个自己生成的CRS文件加密时使用)
创建描述文件,项目设定中开启支付功能,选择自己创建的Merchant ID这个是多选的,应该是可以针对不同的支付对象吧
注意事项和点项总结:
唤起苹果支付必须使用苹果提供的按钮样式否者奔溃:
// Type : 类型
// PKPaymentButtonTypePlain
// PKPaymentButtonTypeBuy
// PKPaymentButtonTypeSetUp
// style : 样式
// PKPaymentButtonStyleWhite
// PKPaymentButtonStyleWhiteOutline
// PKPaymentButtonStyleBlack
PKPaymentButton * payButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypePlain style:PKPaymentButtonStyleWhiteOutline];
payButton.center = self.view.center;
[payButton addTarget:self action:@selector(payAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:payButton];
唤起支付控件,苹果支付只是达到个信息传递功能,至于支付的完成还有成功还是失败的状态判定,需要通过后台和银行之间的接口调用来实现(银行和后台之间交互实现支付功能,后台和前端交互获取支付结果)
-(void)payAction:(PKPaymentButton *)button
{
//系统提供了API来判断当前设备是否支持Apple Pay支付的功能。
if([PKPaymentAuthorizationViewController canMakePayments]){
//设备支持支付
//PKPayment类来创建支付请求
PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
//国家 //HK 香港 CN : 中国大陆
request.countryCode = @"CN";
//人民币 // HKD 港币 CNY : 人民币 USD : 美元
request.currencyCode = @"CNY";// 其他国家以及币种的缩写自行百度
///由商家支持的支付网络 所支持的卡类型
//此属性限制支付卡,可以支付。
// PKPaymentNetworkAmex : 美国运通
// PKPaymentNetworkChinaUnionPay : 中国银联
// PKPaymentNetworkVisa : Visa卡
// PKPaymentNetworkMasterCard : 万事达信用卡 // PKPaymentNetworkDiscover
// PKPaymentNetworkInterac
// PKPaymentNetworkPrivateLabel
// PKEncryptionSchemeECC_V2
request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkChinaUnionPay, PKPaymentNetworkDiscover, PKPaymentNetworkInterac, PKPaymentNetworkMasterCard, PKPaymentNetworkPrivateLabel, PKPaymentNetworkVisa, PKEncryptionSchemeECC_V2]; // PKMerchantCapability3DS // 美国的一个卡 必须支持
// PKMerchantCapabilityEMV // 欧洲的卡
// PKMerchantCapabilityCredit //信用卡
// PKMerchantCapabilityDebit //借记卡 //商家的支付处理能力
//PKMerchantCapabilityEMV : 他的旗下有三大银行 : 中国银联 Visa卡 万事达信用卡
//也就是说merchantCapabilities指的支付的银行卡的范围。
request.merchantCapabilities = PKMerchantCapabilityDebit | PKMerchantCapabilityCredit | PKMerchantCapabilityEMV; //merchantIdentifier 要和你在开发者中心生成的id保持一致
request.merchantIdentifier = @"merchant.com.ruizhihulian.applePay"; //需要的配送信息和账单信息
request.requiredBillingAddressFields = PKAddressFieldAll;
//(配送信息非必须)
request.requiredShippingAddressFields = PKAddressFieldAll; //运输方式(没有配送也就没有配送方式)
NSDecimalNumber * shippingPrice = [NSDecimalNumber decimalNumberWithString:@"0.01"];
PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@"快递公司" amount:shippingPrice];
method.detail = @"24小时送到!";
method.identifier = @"kuaidi";
request.shippingMethods = @[method];
request.shippingType = PKShippingTypeServicePickup; // 2.9 存储额外信息
// 使用applicationData属性来存储一些在你的应用中关于这次支付请求的唯一标识信息,比如一个购物车的标识符。在用户授权支付之后,这个属性的哈希值会出现在这次支付的token中。
request.applicationData = [@"商品ID:123456" dataUsingEncoding:NSUTF8StringEncoding]; //添加物品到支付页
//创建物品并显示,这个对象描述了一个物品和它的价格,数组最后的对象必须是总价格。
//使用PKPaymentSummaryItem来创建商品信息 PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem summaryItemWithLabel:@"商品一" amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]]; PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem summaryItemWithLabel:@"商品二" amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]]; PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"收款方名称" amount:[NSDecimalNumber decimalNumberWithString:@"0.02"]]; request.paymentSummaryItems = @[widget1, widget2, total];
// request.paymentSummaryItems = @[widget1]; //显示认证视图
PKPaymentAuthorizationViewController * paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
paymentPane.delegate = self; [self presentViewController:paymentPane animated:TRUE completion:nil]; }else{
//设备不支持支付
NSLog(@"设备不支持支付");
}
}
必须实现两个回调函数,否者会出现找不到方法而程序出错
#pragma mark -PKPaymentAuthorizationViewControllerDelegate
//这个代理方法指的是支付过程中会进行调用
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion
{
//payment:代表的是一个支付对象, 支付相关的所有信息都在他的身上:1.token. 2.address //completion : 是一个回调的block ,block回调的参数,直接影响到界面结果的展示。 /*PKPaymentAuthorizationStatus 交易状态 PKPaymentAuthorizationStatusSuccess, // 成功交易
PKPaymentAuthorizationStatusFailure // 没有授权交易
PKPaymentAuthorizationStatusInvalidBillingPostalAddress // 拒绝账单地址
PKPaymentAuthorizationStatusInvalidShippingPostalAddress, // 拒绝收货地址
PKPaymentAuthorizationStatusInvalidShippingContact //提供的信息不够
PKPaymentAuthorizationStatusPINRequired // 交易需要指纹输入
PKPaymentAuthorizationStatusPINIncorrect // 输入不正确,重新输入.
PKPaymentAuthorizationStatusPINLockout// 输入次数超出
*/ PKPaymentToken * token = payment.token;
NSLog(@"获取token---%@", token);
//获取订单地址
NSString * address = payment.billingContact.postalAddress.city;
NSLog(@"获取到地址: %@", address);
NSLog(@"验证通过后, 需要开发者继续完成交易");
// 在这个位置, 我们开发人员需要把token值和商品的其他信息如:地址 id 这些 , 上传到自己公司的服务器。然后公司的服务器和银行的商家接口进行接口的调用,并将接口调用返回的支付结果信息返回到这里。
//根据不同的支付结果状态,让block调用不同的交易状态;
//比如说:服务器调用支付结果是成功的, 就让 completion(PKPaymentAuthorizationStatusSuccess); 如果失败 调用 completion(PKPaymentAuthorizationStatusFailure);
//如:
BOOL isSuccess = YES;
if (isSuccess) {
completion(PKPaymentAuthorizationStatusSuccess);
}else
{
completion(PKPaymentAuthorizationStatusFailure);
}
}
// 当授权成功之后或者取消授权之后会调用这个代理方法
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
NSLog(@"取消或者交易完成");
[self dismissViewControllerAnimated:YES completion:nil];
}
Apple Pay的实现的更多相关文章
- Apple Pay 初探
Apple Pay 一.概述 1.支付方式:Touch ID/ Passcode 2.设备要求:iPhone6以上(iphone:线上/线下 ipad:线上 watch:线下) 3.系统要求:iOS8 ...
- 【转】iOS开发 -- Apple Pay
技术博客原地址:http://www.cnblogs.com/dashunzi/p/ApplePay.html#top 原技术博客中有源码和视频,有感兴趣的朋友可以研究一下! 一.什么是Apple P ...
- Apple Pay的快速实现
一.在Apple开发者中心配置 AppleID 和 Merchant IDs 二.配置好证书后在Xcode中开启Apple Pay 三.代码实现 3.1 判断是否支持Apple Pay,如果支持又将支 ...
- 开发apple pay碰到的问题总结
本来想简单总结一下Apple Pay 开发过程中的几个问题, 结果被下面这篇文章全碰上了, 干脆全文转载, 作者对相关资源整理得比较详细, 比较有参考价值 总的来说, 我们做过 APNs 推送的话, ...
- iOS Apple Pay
iOS 苹果支付 需要证书支持支付功能 targets 打开支付功能按钮 //ApplePay#import <PassKit/PassKit.h> ...
- Apple Pay
Apple Pay运行环境:iPhone6以上设备,操作系统最低iOS9.0以上,部分信息设置需要iOS9.2以上.目前还不支持企业证书添加. 环境搭建好后可以在模拟器上面运行,xcode7.2.1+ ...
- iOS开发 Apple Pay
一.什么是Apple Pay? 1. 概念 Apple Pay,简单来说, 就是一种移动支付方式.通过Touch ID/ Passcode,用户可使用存储在iPhone 6, 6p等设备上的信用卡和借 ...
- Apple Pay(转)
Apple Pay 是在 iOS 8 中第一次被介绍,它可以为你的应用中的实体商品和服务,提供简单.安全.私密的支付方式.它使得用户支付起来非常简便,只需按一下指纹就可以授权进行交易. Apple P ...
- 集成 Apple Pay
作者感言 在中秋过后终于把国内的三大支付平台SDK集成都搞定了, 现在我们终于可以来研究Apple自家的支付Apple Pay最后:如果你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会参考 ...
- Apple Pay强势来袭,开发者应做的事情
"iOS8.1就已经有这个功能了,只是木有现在这么的火,现在的趋势是要火的节奏,因此很多电商平台B2B,P2P,C2C,X2X都有可能需要这个屌丝的付款功能了,在此简单的研究一下." ...
随机推荐
- flexbox父盒子justify-content属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [ZZ]c++ cout 格式化输出浮点数、整数及格式化方法
C语言里可以用printf(),%f来实现浮点数的格式化输出,用cout呢...?下面的方法是在网上找到的,如果各位有别的办法谢谢留下... iomanip.h是I/O流控制头文件,就像C里面的格式化 ...
- 系统头文件cmath,cstdlib报错
>C:\Program Files (x86)\Microsoft Visual Studio\\Community\VC\Tools\MSVC\\include\cstdlib(): erro ...
- STL——仿函数(函数对象)
一.仿函数(也叫函数对象)概观 仿函数的作用主要在哪里?从第6章可以看出,STL所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算,第二个版本则表现出最泛化的演算流程,允 ...
- Struts2(二)工作原理
一.概述 1.struts框架本身分为三个部分:核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 2.struts2工作的基本流程: 客户端初始化一个指 ...
- spring mvc 篇
[1]spring mvc 实现多文件上传 http://blog.csdn.net/a1314517love/article/details/24183273 http://bbs.csdn.net ...
- PHP 简易导出excel 类解决Excel 打开乱码
<?php class exportCsv{ //列名 protected $_column = array(); protected $_reg = array(); public $ret ...
- 开机出现checking file system on C怎么办
开机出现checking file system on C怎么办 | 浏览:16126 | 更新:2018-02-04 13:51 | 标签:开机 百度经验:jingyan.baidu.com 开机出 ...
- 【Linux】 解决报错: ImportError: libSM.so.6: cannot open shared object file: No such file or directory
centos7 + python3.6.4 我使用 pip3 install opencv-python 安装了opencv-python 之后,在使用 import cv2 报错如下 报错原因 ...
- c++ malloc与free
今天看STL内存配置器的时候,第一级配置器就是直接用malloc.free来管理内存. 而free和malloc都只需要传入或传出一个指针就能分配和释放内存了. 编译器是如何知道,这个指针指向的空间的 ...