2016-08-17 85 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

此密钥仅适用于自动续订订阅收据。使用此值来标识订阅将更新或过期的日期,以确定客户是否应有权访问内容或服务。验证最新收据后,如果最近续约交易的订购到期日期是过期日期,那么假设订购已过期是安全的。

相关问题