项目中要添加Apple Pay,然后我就收了一下资料,下面我们就来了解一下Apple Pay!!!
Apple Pay 是在 iOS 8 中第一次被介绍,它可以为你的应用中的实体商品和服务,提供简单、安全、私密的支付方式。它使得用户支付起来非常简便,只需按一下指纹就可以授权进行交易。
Apple Pay 只能在特定的设备上使用,目前为止,这些设备包括 iPhone 6, iPhone 6+, iPad Air 2, iPad mini 3. 这是因为 Apple Pay 需要特定的硬件芯片来支持,这个硬件叫做 Secure Element (简称SE,安全元件),他可以用来存储和加解密信息。
Apple Pay实际上是2016年2月份来到大陆的,首批支持 Apple Pay的银行有:中国农业银行、中国银行、上海银行、中国建设银行、中信银行、招商银行、民生银行、广发银行、中国工商银行、兴业银行、中国邮政储蓄银行、上海浦东发展银行。
开发流程:需要我们创建创建证书,这里就不累赘了,关键是创建商业ID,还有证书别忘勾选支持Apple Pay;(网上收索,一大堆流程);
接下来说下代码部分:
我们需要添加一个按钮,进行支付代码的实现。我们要添加的按钮是一个 PKPaymentButton, 这个在 iOS 8.3 时引入。这个按钮是本地化的,能够提供标准的样式。因此,我们强力推荐使用这个按钮来启动 Apple Pay 的支付页面。
样式和类型:
Type : 类型
PKPaymentButtonTypePlain
PKPaymentButtonTypeBuy
PKPaymentButtonTypeSetUp
style : 样式
PKPaymentButtonStyleWhite
PKPaymentButtonStyleWhiteOutline
PKPaymentButtonStyleBlack
也就是说,系统给我们提供了一个按钮,专门用来处理ApplePay的操作,其实这个按钮可不是随便都可以使用,这个按钮,我们只能用来做支付,别的事情不能做。并且这个按钮在我们的storyboard和Xib中是没有的。必须要代码实现。
那就看一下代码实现吧:
先导入系统的框架:
#import <PassKit/PassKit.h>
并实现框架中的协议:
PKPaymentAuthorizationViewControllerDelegate;
//创建支付按钮
PKPaymentButton * payButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline];
payButton.center = self.view.center;
[payButton addTarget:self action:@selector(payAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:payButton];
#pragma mark -- 支付按钮实现方法 -(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, PKPaymentNetworkDiscover, PKPaymentNetworkMasterCard, PKPaymentNetworkPrivateLabel, PKPaymentNetworkVisa, PKEncryptionSchemeECC_V2]; // PKMerchantCapability3DS // 美国的一个卡 必须支持 // PKMerchantCapabilityEMV // 欧洲的卡 // PKMerchantCapabilityCredit //信用卡 // PKMerchantCapabilityDebit //借记卡 //商家的支付处理能力 //PKMerchantCapabilityEMV : 他的旗下有三大银行 : 中国银联 Visa卡 万事达信用卡 //也就是说merchantCapabilities指的支付的银行卡的范围。 request.merchantCapabilities = PKMerchantCapabilityDebit | PKMerchantCapabilityCredit | PKMerchantCapabilityEMV; //merchantIdentifier 要和你在开发者中心生成的id保持一致 request.merchantIdentifier = @""; //需要的配送信息和账单信息 request.requiredBillingAddressFields = PKAddressFieldAll; request.requiredShippingAddressFields = PKAddressFieldAll; //运输方式 NSDecimalNumber * shippingPrice = [NSDecimalNumber decimalNumberWithString:@"11.0"]; 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:@"10.0"]]; PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem summaryItemWithLabel:@"名羊天下" amount:[NSDecimalNumber decimalNumberWithString:@"63.0"]]; PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"小事小食堂+名羊天下" amount:[NSDecimalNumber decimalNumberWithString:@"73.0"]]; 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一些安全的问题:
上面已经提到了,他是将信息放在(Secure Element)硬件芯片中的,相对是安全的.
如果手机不慎丢失了,你就给银行打一个电话注销就可以了,或者远程操控都是可以的,
Apple Pay可以支持多张银行卡.
在说一下关于支付授权流程:
1.框架发送支付请求给安全模块;
2.安全模块对卡和商家信息进行加密,确保只有apple可以读取到信息,然后将这些信息返回给我们框架,然后在吧信息发送到苹果的服务器,苹果在对信息进行加密,确保只有商家可以读取到信息,然后服务器对他进行签名,生成支付的Token返回给设备,
3.框架收到Token,用代理方法传送token给我们自己的服务器,也就是说apple Pay只做了支付信息的传递;
上面是我现在对ApplePay的了解,我会继续了解,会把继续了解到的知识写在这里面;