zoukankan      html  css  js  c++  java
  • 内购

          经历过二周的奋斗 APP植入内购终于 完成了 。在这里和大家分享一下,其实内购和咱们平时购物时一样的。首先,你要选择商品从苹果服务器拉回商品

     if ([SKPaymentQueue canMakePayments]) {

      NSArray *product = [[NSArray alloc] initWithObjects:type, nil];

                    NSSet *nsset = [NSSet setWithArray:product];

                    self.request  = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];

                    self.request.delegate = self;

                    [self.request start];

      }

    type是在iTunesConnect中注册的 产品ID ,这一步是向苹果发出请求 获取相应的产品。然后回掉一个 代理

    SKProductsRequestDelegate 的方法,

    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{

        // NSLog(@"产品反馈信息");

        NSArray *product = response.products;

        if ([product count] == 0) {

            [self removeActive];

             [YXTool showTips:@"苹果服务器忙" duration:1.5];

            return;

        }

        SKProduct *p = nil;

        for (SKProduct *pro  in product) {

            NSLog(@"%@", [pro description]);

            NSLog(@"%@", [pro localizedTitle]);

            NSLog(@"%@", [pro localizedDescription]);

            NSLog(@"%@", [pro price]);

            NSLog(@"%@", [pro productIdentifier]);

            

            if([pro.productIdentifier isEqualToString:self.productID]){

                p = pro;

            }

        }

    //确认产品是否存在

        if (p) {

            // NSLog(@"发送购买请求");

            if (self.orderid) {

                SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:p];

                

                payment.applicationUsername = self.orderid;

                

                [[SKPaymentQueue defaultQueue] addPayment:payment];

            }else{

         NSLog(@"苹果服务器忙");}

        }}

    // 获取产品信息的回掉

    - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{

      NSLog(@"苹果服务器忙");

    }

     - (void)requestDidFinish:(SKRequest *)request{

        NSLog(@"------------反馈信息结束-----------------");

    }

    这一步走完 产品我们 已经找到 并且已经 向商家 发出购买 要求 

    //监听购买结果 

    SKPaymentTransactionObserver

      //内购 观察者  时刻观察 我们购买的结果

       [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{

        for(SKPaymentTransaction *tran in transaction){

            switch (tran.transactionState) {

                case SKPaymentTransactionStatePurchased:{

                    [self completeTransaction:tran];

                }

                    break;

                case SKPaymentTransactionStatePurchasing:{

                    NSLog(@"商品购买中,请稍后");

                }

                      break;

                case SKPaymentTransactionStateRestored:{

                    //我们不会出现 这种购买方式 但留着也没事

                    [self restoreTransaction:tran];

                }

                    break;

                case SKPaymentTransactionStateFailed:{

                    [self failedTransaction:tran];

                }

                    break;

                default:

                    break;

            }

        }

    }

    - (void)completeTransaction:(SKPaymentTransaction *)transaction

    {

        NSString * productIdentifier = transaction.payment.productIdentifier;

        NSString *uerName = transaction.payment.applicationUsername;

        NSURLRequest*appstoreRequest = [NSURLRequest requestWithURL:[[NSBundle mainBundle]appStoreReceiptURL]];

        NSError *error = nil;

         NSData * receiptData = [NSURLConnection sendSynchronousRequest:appstoreRequest returningResponse:nil error:&error];

          NSString  *transactionReceiptStering = [receiptData base64EncodedStringWithOptions:0];

        NSLog(@"%@",productIdentifier);

        NSLog(@"%@",transactionReceiptStering);

        NSLog(@"%@",uerName);

       //购买成功 获得 苹果 下发的 相应的订单 获得订单后 需要把结果 传給服务器 去苹果验证是否购买成功 如果验证为成功购买 需要把本地购买队列的订单清除 

       [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

      //如果验证失败 我们是不做 订单 清除 这样 就可以 防止 漏单 

        }

    }

    //购买失败 与我们 无关 

     - (void)failedTransaction:(SKPaymentTransaction *)transaction {

        if(transaction.error.code != SKErrorPaymentCancelled) {

            [YXTool showTips:@"交易失败,请重新购买" duration:1.0];

        } else {

            [YXTool showTips:@"您已取消交易" duration:1.0];

        }

         [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

    }

    - (void)restoreTransaction:(SKPaymentTransaction *)transaction {

    }

     这里 内购 已经完成了  剩下的就是 和服务器 调试了 

    但是还有一个 重要的 一步  漏掉了 就是 苹果购买成功  服务器出问题 怎们 处理 ,所以 我们 在购买之前 要判断 是否 有 已经购买的 订单,产品已经下发 但是 服务器没有给我们 

     NSArray* transactions = [SKPaymentQueue defaultQueue].transactions;

        if (transactions.count > 0) {

            //检测是否有未完成的交易

            SKPaymentTransaction* transaction = [transactions firstObject];

            if (transaction.transactionState == SKPaymentTransactionStatePurchased) {

                [YXTool showTips:@"上一个订单正在处理" duration:2.0];

                [self complete:transaction];

                //[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

                return;

            }

        }

  • 相关阅读:
    win7 下如何安装 Microsoft Web Application Stress Tool
    [译文]casperjs的API-mouse模块
    【性能测试】jmeter的坑(1)——如何在多网卡情况下正确连接
    [性能分析]端口限制
    [性能分析]linux文件描述符
    python 对mongodb进行压力测试
    常用jar包信息
    Basic Grammer
    Maven 知识汇总
    【Linux】Linux常用命令
  • 原文地址:https://www.cnblogs.com/106dapeng/p/5351396.html
Copyright © 2011-2022 走看看