Как читать iOS в квитанции о покупке приложения

Я могу читать квитанции для покупки в приложении (в песочнице). Я хочу подтвердить их для подписки с автоматическим продлением. Но проблема в том, что когда я читаю квитанцию, я получаю одинаковую дату для purchase_date и expires_date. Ниже приведен ответ, который я получил:

{
    "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;
}

Пожалуйста, дайте мне знать, если я делаю что-то не так. Любая помощь приветствуется.

PS: подписка на один месяц, и я купил это сегодня (т.е.26 марта 18). Поэтому я думаю, что expires_date должно быть 22 апреля2018.

2 ответа

Решение

Все правильно: в Песочнице длительности разные, поэтому вместо 1 месяца вы получаете 5 минут. Для получения подробной информации см. Официальные документы: https://help.apple.com/itunes-connect/developer/.

Кроме того, как указал @jaba-odishelashvili, вы должны использовать разные URL-адреса для проверки квитанции Sandbox/Production.

Используйте 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));
}
Другие вопросы по тегам