How to check In App Purchase Auto Renewable Subscription is valid

前端 未结 5 555
傲寒
傲寒 2020-12-13 00:15

I\'m looking to implement the new Auto Renewable subscriptions using In App purchase but I am unsure how or when to check if the user is currently subscribed. My understandi

5条回答
  •  佛祖请我去吃肉
    2020-12-13 01:11

    Today, I have trouble with this problem.

    Follow Apple doc here, I used this way to check subscription is expired or not. My idea: user APPLE REST API response: (request time + expired time) to check expired or not

    + (BOOL)checkInAppPurchaseStatus
    {
        // Load the receipt from the app bundle.
        NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
        NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
        if (receipt) {
            BOOL sandbox = [[receiptURL lastPathComponent] isEqualToString:@"sandboxReceipt"];
            // Create the JSON object that describes the request
            NSError *error;
            NSDictionary *requestContents = @{
                                              @"receipt-data": [receipt base64EncodedStringWithOptions:0],@"password":@"SHARE_SECRET_CODE"
                                              };
            NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
                                                                  options:0
                                                                    error:&error];
    
            if (requestData) {
                // Create a POST request with the receipt data.
                NSURL *storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"];
                if (sandbox) {
                    storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];
                }
                NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];
                [storeRequest setHTTPMethod:@"POST"];
                [storeRequest setHTTPBody:requestData];
    
                BOOL rs = NO;
                //Can use sendAsynchronousRequest to request to Apple API, here I use sendSynchronousRequest
                NSError *error;
                NSURLResponse *response;
                NSData *resData = [NSURLConnection sendSynchronousRequest:storeRequest returningResponse:&response error:&error];
                if (error) {
                    rs = NO;
                }
                else
                {
                    NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:resData options:0 error:&error];
                    if (!jsonResponse) {
                        rs = NO;
                    }
                    else
                    {
                        NSLog(@"jsonResponse:%@", jsonResponse);
    
                        NSDictionary *dictLatestReceiptsInfo = jsonResponse[@"latest_receipt_info"];
                        long long int expirationDateMs = [[dictLatestReceiptsInfo valueForKeyPath:@"@max.expires_date_ms"] longLongValue];
                        long long requestDateMs = [jsonResponse[@"receipt"][@"request_date_ms"] longLongValue];
                        NSLog(@"%lld--%lld", expirationDateMs, requestDateMs);
                        rs = [[jsonResponse objectForKey:@"status"] integerValue] == 0 && (expirationDateMs > requestDateMs);
                    }
                }
                return rs;
            }
            else
            {
                return NO;
            }
        }
        else
        {
            return NO;
        }
    }
    

    Hope this help.

提交回复
热议问题