2017-04-03 65 views
0

我做了IAP的演示,在我已經註冊了我的演示應用程序在蘋果賬戶,我還增加了產品信息,描述,APP-ID,標題,priceTier,沙盒帳戶進行測試付款流程如演示中所述。我現在正在面臨兩個問題: -應用程式內購買不完整的付款

一)喜歡的第一次的彈出窗口將要求蘋果ID /密碼,我提供兩個值。它會顯示我是否要確認我的付款,並在該彈出窗口中顯示產品的名稱和價格。點擊確定後,我甚至沒有收到任何來自蘋果的郵件,所以我如何證明我是否已經完成了付款。

b)我也想在購買產品時更改我的登錄ID。但每次默認情況下,都會輸入我以前的身份證並只顯示密碼框以輸入密碼。我怎樣才能重置這個設置?就像我已經嘗試重新設置模擬器並在iTunes中的蘋果a/c中再次添加新產品一樣。所以如果有人有任何想法,請隨時提供幫助。分享我的代碼如下: -

-(void)fetchAvailableProducts{ 
     if ([SKPaymentQueue canMakePayments]) 
     { 
      SKProductsRequest *request = [[SKProductsRequest alloc] 
              initWithProductIdentifiers: 
              [NSSet setWithObject:kTutorialPointProductID]]; 
      request.delegate = self; 

      [request start]; 
     } 
     else 

      NSLog(@"Please enable In App Purchase in Settings") ; 
    } 

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

     NSArray *products = response.products; 
      if (products.count != 0) 
     { 
      _product = products[0]; 
      NSLog(@"procudt info is %@",_product.localizedTitle); 

    //  _buyButton.enabled = YES; 
    //  _productTitle.text = _product.localizedTitle; 
    //  _productDescription.text = _product.localizedDescription; 
      [self purchaseProducts]; 
     } else { 
      //_productTitle.text = @"Product not found"; 
     } 

     products = response.invalidProductIdentifiers; 

     for (SKProduct *product in products) 
     { 
      NSLog(@"Product not found: %@", product); 
     } 
    } 
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    for (SKPaymentTransaction *transaction in transactions) 
    { 
     switch (transaction.transactionState) { 
      case SKPaymentTransactionStatePurchased: 
       [[SKPaymentQueue defaultQueue] 
       finishTransaction:transaction]; 
       NSLog(@"Transaction complete"); 
       break; 

      case SKPaymentTransactionStateFailed: 
       NSLog(@"Transaction Failed"); 
       [[SKPaymentQueue defaultQueue] 
       finishTransaction:transaction]; 
       break; 

      default: 
       break; 
     } 
    } 
} 

首先我用我的產品ID只取我的產品和我得到的委託方法,如果計數> 0,則「purchaseProducts」法響應會被調用。但問題是我的委託方法沒有被調用,在點擊「確定」購買產品後沒有發生任何事情。請分享你的想法。

回答

1

嗨按照給定的步驟,希望工程─

首先檢查用戶是否可以進行支付或不可─

-(void)checkForPayement{ 

//First check if user can make payments 
if (![SKPaymentQueue canMakePayments]) { 
    // Show the error that user can't make payments. 
}else{ 
    // Make the product request on App Store 
    SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:IAP_PRODUCT_ID]]; // IAP_PRODUCT_ID is the product id which you got when you register the in-app-purchase 
    productRequest.delegate = self; 
    [productRequest start]; 
    } 
} 

如果產品是可用的,你會得到下面的方法響應 -

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{ 
if (response.products.count > 0) { 
    SKProduct *validProduct = [response.products objectAtIndex:0]; 
    [self purchase:validProduct]; 
} else { 
    // Product is not available so please cross check about the IAP_PRODUCT_ID 
    } 
} 

如果請求失敗,你會得到回調在以下方法 -

-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{ 
    // Check here for the error 
} 

開始購買

- (void)purchase:(SKProduct *)product{ 
SKPayment *payment = [SKPayment paymentWithProduct:product]; 
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

}

您將在給定的方法獲得的回調,你可以檢查交易 -

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{ 
for (SKPaymentTransaction *transaction in transactions) { 
    switch (transaction.transactionState) { 
     case SKPaymentTransactionStatePurchasing: 
      DDLogVerbose(@"Purchasing"); 
      break; 

     case SKPaymentTransactionStateFailed: 
      if (transaction.error.code == SKErrorPaymentCancelled) { 
       // User has cancelled the transaction 
      } 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
      break; 

     case SKPaymentTransactionStateRestored: 

      DDLogVerbose(@"Restored"); 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
      break; 

     case SKPaymentTransactionStatePurchased: 
     { 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
      // Payment has been done and you should provide the purchased content or you may verify the receipt also 
      DDLogVerbose(@"Purchased"); 

     } 
      break; 

     default: 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
      break; 
    } 
} 
} 

的狀態如果您想了解更多的安全性,然後你也可以Verify receipt from app store

解決你的問題

一個。在沙箱環境中測試應用程序內購買時,您將不會收到任何確認付款的郵件,您可以使用Storekit updatedTransactions委託方法檢查付款狀態。在沙箱環境中不會扣除餘額。輸入沙箱帳戶詳細信息後,還可以檢查iTunes帳戶是否可以登錄?如果沒有,你的ID可能沒有驗證,所以驗證你的ID。

b。在嘗試購買應用程序之前,只需從設置 - > iTunes & App Store註銷Apple ID。點擊蘋果ID並點擊註銷。並且,當您啓動應用內購買時,請輸入沙箱帳戶憑據,並且不要在實際生產環境中登錄沙箱帳戶,因爲它可能會使您的沙盒帳戶無效。

+0

感謝非常好的解釋,因此我接受了你的答案。實際上,在此之前,我在另一個支付網關和沙箱Env上工作,在付款後我收到了一封測試郵件。支付網關的名稱是Telr支付網關。 Pooja岩石。 – Prakash