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 understanding is that when the user initially subscribes the app can use the purchase date along with the subscription date to calculate how long their subscription would last. What happens after this date has passed? How do we check if the user has auto renewed or cancelled?
If I use restoreCompletedTransactions
to get a transaction and receipt for each renewal the user will be prompted to enter their iTunes password. Does this mean that if they have bought a 7 day subscription they will have to enter their password every 7 days when the app checks if the subscription is still valid?
They automatically renew at the end of their duration until the user chooses to cancel. Subscriptions are available on iOS, iPadOS, macOS, watchOS, and tvOS.
Once you have logged into a sandbox account using this method, you can then go to the Settings app, tap “iTunes & App Store”, then scroll to the bottom to the Sandbox Account section. Here you can log in and out of different sandbox accounts for testing.
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.
IF you want to check on it from a web server, you ping their API and it returns the status of the auto-renewable subscription and info about the last payment. link
If you are on the device then you probably have to call restoreCompletedTransactions which I guess asks for the password.
I don't see any other method. I suppose from the device you could verify the subscription by contacting the same web service used on the server side? I don't know how the pros and cons of that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With