使用Flutter的应用内购买插件如何检查订阅有效性?

15

我正在尝试使用官方Flutter In-App-Purchase插件来实现应用内购买。虽然已经让事情成功运行起来,但我无法弄清楚如何确定用户的订阅是否仍在有效期内或者是否已过期。即使在我取消了测试订阅后,连接并执行queryPastPurchases()后获取到的值与订阅仍处于激活状态时一样:

productId: test_subscription_1   
transactiondate: 1565682346568   
status: null

verificationData
    source: IAPSource.GooglePlay   
    localVerificationData: {
        "orderId":"GPA.1234-1234-1234-12345",
        "packageName":"com.example.myapp",
        "productId":"test_subscription_1",
        "purchaseTime":1565682346568,
        "purchaseState":0,
        "purchaseToken":"<long string>",
        "autoRenewing":false
    }   
    serverVerificationData: "<long string>"

我应该只是硬编码我的订阅周期并将当前时间与purchaseTime + 订阅周期进行比较吗? 这在自动续订方面甚至有效吗? 如果用户将手机日期改为一年前会怎样?似乎应该有某个值,可以给我到期时间或至少一个布尔值来指示订阅是否仍然有效?

3个回答

2
这段话的意思是:官方应用内购买插件可以处理购买,但并不提供处理自动续订订阅所需的全部后端基础设施。简单回答您的问题是,将此购买信息发送到您的服务器并在那里管理订阅状态。或者,您可以考虑使用类似purchases_flutter的托管解决方案:https://pub.dev/packages/purchases_flutter/

14
“购买订阅” -> “检查用户是否有有效订阅”这个应用场景肯定是IAP插件中最基本的应用场景之一吧?如果插件只能处理购买而不能实际使用,那就没有意义了,这就像一个带有点火锁但没有连接电线的汽车。” - Magnus
所有的IAP基础设施都是在应用商店支持订阅之前设计的。因此,再加上客户端代码的安全问题,使得一些看似简单的事情变得非常复杂。 - enc_life
我也遇到了同样的问题,但我找到了一种方法,我认为可以解决这个问题,请纠正我如果我错了。在检查过去的购买时,我使用(purchase.billingClientPurchase.isAutoRenewing)来查看是否正在续订,而在测试订阅中,当处于活动状态时为true,取消时为false。所以我想知道是否向用户收费就足够了。你觉得呢? - Jorge Vieira
4
Revenue Cat 似乎有些问题,人们总是链接到它们或编辑帖子使用它们。 - GILO
1
那里有些问题。 - GILO
显示剩余2条评论

0

0

对于仍然遇到问题的人,有一个简单的解决方案可以在iOS上验证收据

这里有一个简单的js片段,您可以使用它来从Apple获取实际收据并用它来验证订阅

注意 您需要从苹果开发者帐户中为应用程序生成特定于应用程序的密码

进一步帮助

https://developer.apple.com/documentation/appstorereceipts/expiration_intent

const axios = require('axios');
const iosValidateReceipt = async (transactionReceipt, isTest = true) => 
    new Promise(async (resolve, reject) => {
        const url = isTest ? 'https://sandbox.itunes.apple.com/verifyReceipt' : 'https://buy.itunes.apple.com/verifyReceipt';
        const data = {
            'receipt-data': transactionReceipt,
            password: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        };
        console.log('iosValidateReceipt - input - ', { url, data });
        try {
            const response = await axios.post(url, data);
            console.log('iosValidateReceipt - success - ', JSON.stringify(response.data, null, 2));
            resolve(response.data);
        } catch (err) {
            console.log('iosValidateReceipt - error -', err);
            reject(err);
        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接