Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check In App Purchase Auto Renewable Subscription is valid

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?

like image 851
Adam Swinden Avatar asked Feb 25 '11 16:02

Adam Swinden


People also ask

Do Apple subscriptions automatically renew?

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.

How do I check my sandbox subscription?

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.


2 Answers

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.

like image 114
Clover03ti05 Avatar answered Oct 07 '22 22:10

Clover03ti05


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.

like image 30
Dobes Vandermeer Avatar answered Oct 07 '22 22:10

Dobes Vandermeer