内购

      经历过二周的奋斗 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;

        }

    }

原文地址:https://www.cnblogs.com/106dapeng/p/5351396.html