2016-08-17 65 views
2

我已經設置了一個沙盒用戶,併成功將他們訂閱到我的iPhone設備上的一個月自動續訂訂閱。如何檢測用戶的訂閱是否已結束?檢查自動更新訂閱是否到期

我有以下代碼:

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 

它最終將調用此方法與邏輯:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    for (SKPaymentTransaction *transaction in queue.transactions) { 
     if (transaction.transactionState == SKPaymentTransactionStateRestored) { 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
      [self setSubscriptionActive]; // <-- Probably not the right way to restore subscriptions? 
      return; // Return because we have successfully set the subscribed state of the app. 
     } 
    } 
    [self purchase:self.validProduct]; // No valid transactions, so ask them to purchase. 
} 

我的問題是,鑑於我目前的邏輯,其在兩小時從現在到本次測試用戶總是得到代碼行[self setSubscriptionActive];,因此我在他的測試帳戶下完成的唯一付款總是返回SKPaymentTransactionStateRestored。我希望它現在到期according to the documentation from Table 3-1 (Subscription durations for testing) ...所以現在我想知道,我做錯了什麼,和/或是否有人知道什麼是正確的方法來驗證這一個月/及時訂閱是否已過期?

我甚至嘗試過JSON查詢蘋果沙箱服務器上的收據,他們的收據驗證文章後面。仔細看看這個數據,看看自己這一切是如何被打破:

"original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT"; 
"original_purchase_date_ms" = 1375340400000; 
"original_purchase_date_pst" = "2013-08-01 00:00:00 America/Los_Angeles"; 
"receipt_creation_date" = "2016-08-18 01:05:09 Etc/GMT"; 
"receipt_creation_date_ms" = 1471482309000; 
"receipt_creation_date_pst" = "2016-08-17 18:05:09 America/Los_Angeles"; 
"receipt_type" = ProductionSandbox; 
"request_date" = "2016-08-18 01:05:09 Etc/GMT"; 
"request_date_ms" = 1471482309971; 
"request_date_pst" = "2016-08-17 18:05:09 America/Los_Angeles"; 

有兩個問題,我看到:

  1. 這是第一次購買,但尚未就說明2013-08-01 07:00:00 Etc/GMT一個original_purchase_date。我今天購買了它。這次不是在8月17日附近。這是非常不正確的。

  2. receipt_creation_date2016-08-18 01:05:09 Etc/GMTrequest_date2016-08-18 01:05:09 Etc/GMT ...我不得不讓網絡請求創建收據的秒鐘。我假設從request_date(像這個垃圾API的大部分)沒有記錄其有效的互聯網時間,所以你可以用它來比較(而不是當地時間)它與receipt_creation_date之間的增量時間。上帝這是一場噩夢......爲什麼有人會讓任何人制造出如此複雜,荒謬的後端系統?這絕對是可怕的。它的這種恥辱,因爲蘋果的其他API一般都很好。

回答

1

我找到了一個解決方案,因爲我知道我的訂閱是好了一個月,這樣我可以一個月遞增transaction.transactionDate,並將其與UTC時間(順便說一下,這裏是一個好主意是讓UTC時間進行處理,使您不必情況下用戶通過設置回自己的系統時鐘規避其訂閱):

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    // Check all transactions for any that might be restoration candidates. 
    for (SKPaymentTransaction *transaction in queue.transactions) { 
     if (transaction.transactionState == SKPaymentTransactionStateRestored) { 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
      NSCalendar *calendar = [NSCalendar currentCalendar]; 
      NSDate *expiration = [calendar dateByAddingUnit:NSCalendarUnitMonth value:1 toDate:transaction.originalTransaction.transactionDate options:0]; 
      if ([expiration earlierDate:self.currentUTCTime] == self.currentUTCTime) { 
       [self setSubscriptionInterfaceActive:true]; 
       return; 
      } 
     } 
    } 
    // There are no valid restorations, so we ask the user to subscribe here (this may obviously differ in your application as I am using a Purchase or Restore Subscription button in my app). 
    [self setSubscriptionInterfaceActive:false]; 
    [self purchase:self.validProduct]; 
} 
1

不要手工計算日期。根據Apple's Validate App Store Receipt,您應該使用expires_date

此密鑰僅適用於自動續訂訂閱收據。使用此值來標識訂閱將更新或過期的日期,以確定客戶是否應有權訪問內容或服務。驗證最新收據後,如果最近續約交易的訂購到期日期是過期日期,那麼假設訂購已過期是安全的。