zoukankan      html  css  js  c++  java
  • 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这个是多选的,应该是可以针对不同的支付对象吧

    注意事项和点项总结:

    唤起苹果支付必须使用苹果提供的按钮样式否者奔溃:

     1 //    Type : 类型
     2 
     3 //    PKPaymentButtonTypePlain
     4 
     5 //    PKPaymentButtonTypeBuy
     6 
     7 //    PKPaymentButtonTypeSetUp
     8 
     9     
    10 
    11 //    style : 样式
    12 
    13 //    PKPaymentButtonStyleWhite
    14 
    15 //    PKPaymentButtonStyleWhiteOutline
    16 
    17 //    PKPaymentButtonStyleBlack
    18 
    19 
    20 
    21     PKPaymentButton * payButton = [PKPaymentButton buttonWithType:PKPaymentButtonTypePlain style:PKPaymentButtonStyleWhiteOutline];
    22 
    23     payButton.center = self.view.center;
    24 
    25     [payButton addTarget:self action:@selector(payAction:) forControlEvents:UIControlEventTouchUpInside];
    26 
    27     [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];
    }
    
  • 相关阅读:
    block 专题--基础
    iOS开发之沙盒机制
    App上架流程(2016最新)
    团队项目个人总结
    结对开发训练(续)(郭林林&胡潇丹)
    结对开发训练(郭林林&胡潇丹)
    计算一篇英语文章出现频率最高的十个单词
    TLB和大叶
    韩顺平的java入门到精通中serversql笔记(包括emp表和dept表,linux的mysql版)
    IPv6
  • 原文地址:https://www.cnblogs.com/yuxiaoyiyou/p/7126479.html
Copyright © 2011-2022 走看看