首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何签入App购买自动续费订阅是否有效

如何签入App购买自动续费订阅是否有效
EN

Stack Overflow用户
提问于 2011-02-26 00:58:09
回答 4查看 31K关注 0票数 35

我希望实现新的自动可更新订阅在应用程序购买中使用,但我不确定如何或何时检查用户是否当前订阅。我的理解是,当用户最初订阅时,应用程序可以使用购买日期和订阅日期来计算他们的订阅将持续多长时间。此日期过后会发生什么?如何查看用户是否已自动续费或已取消?

如果我使用restoreCompletedTransactions获取每次续订的交易和收据,系统将提示用户输入其iTunes密码。这是否意味着,如果他们购买了7天的订阅,当应用程序检查订阅是否仍然有效时,他们必须每7天输入一次密码?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-20 03:05:22

如果你想从网络服务器上查看它,你可以ping他们的API,它会返回自动续订的状态和关于最后一次付款的信息。link

如果你使用的是这台设备,那么你可能需要调用restoreCompletedTransactions,我猜它会要求你提供密码。

我看不到任何其他的方法。我想你可以从设备上通过联系服务器端使用的相同的web服务来验证订阅?我不知道这样做的利弊。

票数 10
EN

Stack Overflow用户

发布于 2016-09-16 18:11:39

今天,我遇到了这个问题。

在这里关注Apple doc,我用这种方式来检查订阅是否过期。我的想法:用户APPLE REST API响应:(请求时间+过期时间)检查是否过期

代码语言:javascript
复制
+ (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;
    }
}

希望这能有所帮助。

票数 19
EN

Stack Overflow用户

发布于 2017-01-24 12:19:37

在调用Apple API之前,最好在本地验证收据。每次应用程序运行时,验证本地收据是一个很好的做法,如果你需要检查用户是否有任何活跃的订阅,你可以从本地收据中检索所有购买,并查看是否有仍然活跃的购买。

我已经实现了一个用Swift编写的小型库,以简化在本地使用应用内回执。您可以轻松地获取表示收据的对象(InAppReceipt)并检索活动购买/所有购买。

请随意使用。Github link

下面是一个解决问题的示例:

代码语言:javascript
复制
import TPInAppReceipt

do {
    let receipt = try InAppReceiptManager.shared.receipt()
    
    //retrive active auto renewable subscription for a specific product and date
    let purchase = receipt.activeAutoRenewableSubscriptionPurchases(ofProductIdentifier: "ProductName", forDate: Date())
    
    //retrive all auto renewable subscription purchases for a specific product
    let allAutoRenewableSubscriptionPurchases = receipt.purchases(ofProductIdentifier: "productName").filter({ return $0.isRenewableSubscription })
} catch {
    print(error)
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5120177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档