• 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的了解,我会继续了解,会把继续了解到的知识写在这里面;

  • 相关阅读:
    .Net中获取打印机的相关信息
    如何在windows server 2008上配置NLB群集
    jvm分析内存泄露
    JVM调优
    线程池工作队列饱和策略
    线程池的处理流程:
    Java的Executor框架和线程池实现原理(转)
    线程池实现原理详解:
    futer.get()(如果任务没执行完将等待)
    sql注入
  • 原文地址:https://www.cnblogs.com/LzwBlog/p/5741990.html
Copyright © 2020-2023  润新知