内购

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

 if ([SKPaymentQueue canMakePayments]) {app

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

                NSSet *nsset = [NSSet setWithArray:product];调试

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

                self.request.delegate = self;code

                [self.request start];server

  }队列

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

SKProductsRequestDelegate 的方法,rem

- (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;

        }

    }

相关文章
相关标签/搜索