Apple月份autorenew沙盒订阅不会在5分钟后到期,也不会在Apple收据中收到数据

时间:2018-06-13 12:28:14

标签: objective-c testing in-app-purchase itunesconnect storekit

我已在我的应用程序中实施了自动续订月度订阅应用内购买。我通过调用iTunes的沙盒URL获得苹果收据。 我的问题是我的自动续订订阅在5分钟后没有过期。

我没有在iPhone上自动更新它。请建议我如何在沙箱环境中测试应用内购买。

这是我的代码:

我们要求苹果收据。

    -(BOOL) getSubscriptionStatusFromAppleWithReceipt:(NSData *) receiptData
{
    NSError *error;
    NSMutableDictionary *requestContents = [NSMutableDictionary dictionaryWithObject:
                                            [receiptData base64EncodedStringWithOptions:0] forKey:@"receipt-data"];
    NSString *sharedSecret = @"efd594143c2840bdac89fc22eccd3a3d";
    if (sharedSecret) requestContents[@"password"] = sharedSecret;
    NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error];

    NSString *strUrl = @"";

    // set 1 in AppConstant.h for Live enviorment
    if (kPARSE_DEVELOPMENT_SERVER) {
        // Production
        strUrl = @"https://buy.itunes.apple.com/verifyReceipt";
    }
    else{
        // Sandbox
        strUrl = @"https://sandbox.itunes.apple.com/verifyReceipt";
    }

    //Chandni commented live server url
    // Live server
   // strUrl = @"https://buy.itunes.apple.com/verifyReceipt";

    // Devlopment server
    strUrl = @"https://sandbox.itunes.apple.com/verifyReceipt";


    NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:strUrl]];
    [storeRequest setHTTPMethod:@"POST"];
    [storeRequest setHTTPBody:requestData];

    queue = [NSOperationQueue mainQueue];

    //    NSError *error = nil; 
    NSHTTPURLResponse *response = nil;

    NSData *data = [NSURLConnection sendSynchronousRequest:storeRequest returningResponse:&response error:&error];

    if (!error)
    {
        NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//        NSLog(@"%@", newStr);
        NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        //        NSLog(@"%@", jsonResponse[@"latest_receipt_info"]);

        if ([jsonResponse[@"latest_receipt_info"] isKindOfClass:[NSArray class]])
        {

            NSArray *receiptInfo = (NSArray *) jsonResponse[@"latest_receipt_info"];
            return [self parseJsonFromAppleServer:receiptInfo];
        }
    }
    else
    {
        NSString *strTemp = @" \n Database getSuscriptionStatus error in api calling of apple   ";


        NSLog(@"%@", error.localizedDescription);
    }

    return false;   
}

-(BOOL) parseJsonFromAppleServer:(NSArray *) receiptInfo
{
    if (receiptInfo.count > 0)
    {
        id lastReceipt = [receiptInfo lastObject];
        if ([lastReceipt isKindOfClass:[NSDictionary class]])
        {
            NSDictionary *dictLastReceipt = (NSDictionary *) lastReceipt;
            NSString *lastPurchase = [dictLastReceipt valueForKey:@"product_id"];

            NSString *secondLastPurchase = @""; // In case if users last inapp is Removal of Advertisement
            if (receiptInfo.count > 1) {
                id secondLastReceipt = receiptInfo[receiptInfo.count - 2];
                if ([secondLastReceipt isKindOfClass:[NSDictionary class]])
                {
                    NSDictionary *dictSecondLastReceipt = (NSDictionary *) secondLastReceipt;
                    secondLastPurchase = [dictSecondLastReceipt valueForKey:@"product_id"];
                }
            }

            if ([lastPurchase isEqualToString:@"com.divorcecommunity.monthly"] ||  [secondLastPurchase isEqualToString:@"com.divorcecommunity.monthly"])
            {
                NSString *strExpirationDate = [dictLastReceipt valueForKey:@"expires_date_pst"];
                NSDate *expirationDate = [CommonUtilities getExpirationDateFromDateString:strExpirationDate];

                [[NSUserDefaults standardUserDefaults] setObject:expirationDate forKey:@"ExpirationDate"];

                NSDate *serverDate = [[AppDelegate sharedAppDelegate] serverDate];

                NSString *strExpirateDate = [CommonUtilities getStringDateFromDate:expirationDate];
                NSString *strServerDate = [CommonUtilities getStringDateFromDate:serverDate];

                NSDate *dateExpiration = [CommonUtilities getDateFromDateString:strExpirateDate havingDateFormat:@"yyyy-MM-dd"];
                NSDate *dateServer = [CommonUtilities getDateFromDateString:strServerDate havingDateFormat:@"yyyy-MM-dd"];

                //  CS  Save data in default for reciept
                [[NSUserDefaults standardUserDefaults] setObject:receiptInfo forKey:@"AppleReciept"];
                [[NSUserDefaults standardUserDefaults] setObject:serverDate forKey:@"ServerDate"];
                [[NSUserDefaults standardUserDefaults] setObject:expirationDate forKey:@"ExpirationDate"];

                [[NSUserDefaults standardUserDefaults] synchronize];



                NSInteger daysDifference = [CommonUtilities getDifferenceBetweenStartDate:dateServer andEndDate:dateExpiration];

                NSInteger daysRemainingInExpiration = [[CommonUtilities sharedManager] getMinDifferenceBetweenStartDate:serverDate andEndDate:expirationDate];


                NSLog(@"Subscription expires +ve or -ve %ld",(long)daysRemainingInExpiration);
                if (daysRemainingInExpiration >= 0)
                {

              [self saveNewInAppOfType:lastPurchase withExpirationDate:expirationDate];

                    return true;

                }
                else
                {
                    return false;
                }
            }
            else
            {
            return false;
            }
        }
    }

    return false;
}

是否有人有解决方案,请分享。

由于

1 个答案:

答案 0 :(得分:0)

在沙盒环境中测试一个月的苹果订阅时,收据似乎会自动更新大约六次(理论上)。有时我注意到收据在5分钟后过期,而其他时候则需要30分钟(自动续签6次)。