扑。如何检查自动续订订阅是否仍然有效

Tim*_*mur 3 subscription in-app-purchase flutter

我的应用程序有 1 个月的自动续订订阅。当用户单击“购买订阅”按钮时,我将购买日期保存到共享首选项中。然后,1 个月后,我需要检查此订阅是否仍然有效。那么我该如何实施呢?

awa*_*aik 9

==== 2020 年 3 月 11 日更新

嗨,我可以看到这篇文章仍在被那些正在寻找如何在 Flutter 中使用订阅的方法的人阅读。在 2019 年期间,我制作了两个拥有数千次安装的应用程序,用户可以在这两个平台上购买可续订的订阅。直到 2020 年 2 月,我才使用 Flutter 团队https://pub.dev/packages/in_app_purchase 的这个包,但是 - 无法获取有关用户在 iOS 中取消订阅的信息。这不是插件问题,而是该过程的 iOS 方法。出于安全原因,我们应该实现自己的后端(顺便说一下,Google 也建议这样做,但仍然保留了直接从应用程序检查状态的方法)。

因此,经过一些研究,我发现制作后端和插件的人是免费的,直到您当月的收入低于 10 000 美元。 https://www.revenuecat.com/ https://pub.dev/packages/purchases_flutter

我已经在我的应用程序中实现了这个插件,它就像一个魅力。有一些很好的方法可以让您在应用程序的任何时候获取订阅状态。我要做一个例子和文章,但不确定时间。

====

2019 年 7 月 15 日更新。只是为了节省时间。下面的答案是针对过时的付款插件给出的。在 Flutter 团队制作插件 https://pub.dev/packages/in_app_purchase 之后 ,我推荐使用它。

======

最好的方法是使用安全的后端服务器来接收实时开发人员通知。但是,可以直接在应用程序中检查状态。因此,当用户尝试访问某些付费功能时,您可以检查他的订阅是否有效。下面是示例:

使用类在某处创建文件

import 'dart:io' show Platform;
import 'package:flutter/services.dart';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';
import 'dart:async';

class SubcsriptionStatus {
static Future<bool> subscriptionStatus(
  String sku,
  [Duration duration = const Duration(days: 30),
  Duration grace = const Duration(days: 0)]) async {
    if (Platform.isIOS) {
      var history = await FlutterInappPurchase.getPurchaseHistory();

      for (var purchase in history) {
        Duration difference =
        DateTime.now().difference(purchase.transactionDate);
        if (difference.inMinutes <= (duration + grace).inMinutes &&
            purchase.productId == sku) return true;
      }
      return false;
    } else if (Platform.isAndroid) {
      var purchases = await FlutterInappPurchase.getAvailablePurchases();

      for (var purchase in purchases) {
        if (purchase.productId == sku) return true;
      }
      return false;
    }
    throw PlatformException(
        code: Platform.operatingSystem, message: "platform not supported");
  }
}
Run Code Online (Sandbox Code Playgroud)

在需要检查订阅状态的地方导入它并在构造函数中使用。例如:

class _SubscriptionState extends State<Subscription> {
  bool userSubscribed;
  _SubscriptionState() {
  SubcsriptionStatus.subscriptionStatus(iapId, const Duration(days: 30), const 
  Duration(days: 0)).then((val) => setState(() {
  userSubscribed = val;
   }));
   }
}
Run Code Online (Sandbox Code Playgroud)

变量 userSubscribed 将是状态 - 真或假。(请注意,您必须将flutter_inapp_purchase添加到您的项目中)。