代码之家  ›  专栏  ›  技术社区  ›  Asad Amodi

如何读取iOS应用内购买收据

  •  2
  • Asad Amodi  · 技术社区  · 8 年前

    我能够阅读应用程序内购买的收据(在沙盒中)。我想验证它们是否适用于自动续费订阅。但问题是,当我读到收据时,我得到了相同的日期 购买\u日期 expires\u日期 。以下是我得到的回复:

    {
        "expires_date" = "2018-03-26 09:34:11 Etc/GMT";
        "expires_date_ms" = 1522056851000;
        "expires_date_pst" = "2018-03-26 02:34:11 America/Los_Angeles";
        "is_in_intro_offer_period" = false;
        "is_trial_period" = false;
        "original_purchase_date" = "2018-03-26 09:29:15 Etc/GMT";
        "original_purchase_date_ms" = 1522056555000;
        "original_purchase_date_pst" = "2018-03-26 02:29:15 America/Los_Angeles";
        "original_transaction_id" = 1000000385357059343435656;
        "product_id" = <product id>;
        "purchase_date" = "2018-03-26 09:29:11 Etc/GMT";
        "purchase_date_ms" = 1522056551000;
        "purchase_date_pst" = "2018-03-26 02:29:11 America/Los_Angeles";
        quantity = 1;
        "transaction_id" = 1000000385357059343435656;
        "web_order_line_item_id" = 1000000385357059343435656;
    }
    

    如果我做错了什么,请告诉我。非常感谢您的帮助。

    附言:订阅期为一个月,我是今天(即18年3月26日)购买的。所以我想 expires\u日期 应为2018年4月22日。

    2 回复  |  直到 8 年前
        1
  •  2
  •   kambala    8 年前

    一切都是正确的:沙盒中的持续时间是不同的,所以你会得到5分钟,而不是1个月。详见官方文件: https://help.apple.com/itunes-connect/developer/#/dev7e89e149d

    此外,正如@jaba odishelashvili指出的,您应该使用不同的URL来验证沙箱/生产收据。

        2
  •  1
  •   Jabson    8 年前

    使用 https://sandbox.itunes.apple.com/verifyReceipt 验证收据的url。

    以下是您可以使用的示例代码:

    NSString *appStoreReceiptPath = NSBundle.mainBundle.appStoreReceiptURL.path;
    if(appStoreReceiptPath) {
        NSData *receiptData = [NSData dataWithContentsOfFile:appStoreReceiptPath];
        if(receiptData == nil) return;
        NSDictionary *receiptDictionary = @{@"receipt-data": [receiptData base64Encoding],
                                            @"password": SharedSecret};
    
        NSData *requestData = [NSJSONSerialization dataWithJSONObject:receiptDictionary options:0 error:nil];
        // ReceiptURL is - @"https://sandbox.itunes.apple.com/verifyReceipt"
        NSURL *storeURL = [NSURL URLWithString:ReceiptURL];
        NSMutableURLRequest *storeRequest = [[NSMutableURLRequest alloc] initWithURL:storeURL];
        storeRequest.HTTPMethod = @"POST";
        storeRequest.HTTPBody = requestData;
    
        NSURLSession *session = [NSURLSession sessionWithConfiguration:NSURLSessionConfiguration.defaultSessionConfiguration];
        [[session dataTaskWithRequest:storeRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            if(!error) {
                NSError *jsonError = nil;
                NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError];
    
                if(!jsonError) {
                    for(NSDictionary *in_app in dictionary[@"receipt"][@"in_app"]) {
                        NSString *purchaseDateString = in_app[@"purchase_date"];
                        NSString *expiresDateString = in_app[@"expires_date"];
    
                        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss VV"];
    
                        NSString *productId = in_app[@"product_id"];
                        NSString *purchaseDate = [dateFormatter dateFromString:purchaseDateString];
                        NSString *expiresDate = [dateFormatter dateFromString:expiresDateString];
    
    
                    }
                }
            }
        }] resume];
    }
    

    并使用此方法检测订阅是否处于活动状态。

    - (BOOL) isActiveSubscriptionBought:(NSDate *) purchaseDate expires:(NSDate*) expiresDate  {
        if(self.expiresDate == nil) return false;
    
        NSDate *date = [NSDate date];
        return (([date compare:purchaseDate] != NSOrderedAscending) &&
                ([date compare:expiresDate] != NSOrderedDescending));
    }
    
    推荐文章