Apple Pay

项目中要添加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的了解,我会继续了解,会把继续了解到的知识写在这里面;

 

posted on 2016-08-05 16:47  刘志武  阅读(393)  评论(0编辑  收藏  举报

导航