內購

      經歷過二週的奮鬥 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;

        }

    }

相關文章
相關標籤/搜索