使用Flutters应用程序内购买插件检查订阅有效性?

1qczuiv0  于 2022-11-17  发布在  Flutter
关注(0)|答案(3)|浏览(213)

我正在尝试使用the official Flutter In-App-Purchase plugin实现应用内购买。我已经做好了工作,只是我不知道如何判断用户的订阅是否仍然有效。即使在我取消了测试订阅后,我在连接并执行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+订阅期?这甚至可以在自动续订之间工作吗?如果用户将他的手机上的日期更改为一年前呢?似乎应该有一些值,要么给予我到期时间,要么至少一个布尔值true/false来指示订阅是否仍然有效?

x6h2sr28

x6h2sr281#

官方的应用内购买插件处理 * 购买 *,但不提供所有的后端基础设施,你需要专门处理自动续订订阅。
您的问题的简短答案是将此购买信息发送到your server并在那里管理订阅状态。或者,您也可以查看purchases_flutter之类的托管解决方案:https://pub.dev/packages/purchases_flutter/

jk9hmnmh

jk9hmnmh2#

我用过“purchases_flutter”,这个过程很简单。你可以通过调用插件自带的方法来检查订阅的状态。看看这篇文章,其中包括一个https://medium.com/flutter-community/in-app-purchases-with-flutter-a-comprehensive-step-by-step-tutorial-b96065d79a21的例子

vyswwuz2

vyswwuz23#

对于任何仍有问题的人,有一个简单的解决方案来验证iOS上的收据
下面是一个简单的js代码片段,您可以使用它从Apple获取实际的收据,并使用它来验证订阅

注意您需要使用Apple Developer帐户为应用生成应用特定密码
进一步帮助

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);
        }
    });

相关问题