You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用in_app_purchase查询订阅的活跃与失效状态?

使用in_app_purchase查询订阅状态的实现方案

核心思路

要准确判断订阅的活跃/失效状态,关键是通过in_app_purchase插件获取用户的订阅历史记录,再结合订阅的过期时间、自动续期状态等字段做判断。

具体实现步骤

1. 初始化插件

先确保已正确集成in_app_purchase包,在App启动时完成初始化:

import 'package:in_app_purchase/in_app_purchase.dart';

final InAppPurchase _inAppPurchase = InAppPurchase.instance;

void initPurchase() async {
  await _inAppPurchase.isAvailable();
}

2. 获取并解析订阅记录

调用queryPastPurchases获取用户过往订阅,筛选出目标订阅并判断状态:

Future<void> checkSubscriptionStatus() async {
  final QueryPurchaseDetailsResponse response = await _inAppPurchase.queryPastPurchases();
  
  if (response.error != null) {
    // 处理查询错误,比如网络异常
    return;
  }

  // 筛选出订阅类商品(替换成你的订阅ID前缀或具体ID)
  final List<PurchaseDetails> subscriptions = response.pastPurchases
      .where((purchase) => purchase.productID == '你的订阅商品ID')
      .toList();

  if (subscriptions.isEmpty) {
    print('订阅状态:失效(从未订阅)');
    return;
  }

  // 取最新的订阅记录(用户可能多次订阅)
  final PurchaseDetails latestSub = subscriptions.reduce((a, b) =>
      a.purchaseDate.isAfter(b.purchaseDate) ? a : b);

  bool isActive = false;
  // 处理已购买或已恢复的订阅
  if (latestSub.status == PurchaseStatus.purchased || latestSub.status == PurchaseStatus.restored) {
    final DateTime? expireDate = latestSub.expirationDate;
    if (expireDate != null && DateTime.now().isBefore(expireDate)) {
      isActive = true;
      // 自动续期订阅需额外确认续期状态
      if (!latestSub.isAutoRenewing) {
        // 自动续期已关闭,即使未到期也标记为即将失效
        print('订阅状态:即将失效(自动续期已关闭)');
        return;
      }
    }
  }

  print(isActive ? '订阅状态:活跃' : '订阅状态:失效');
}

3. 监听订阅状态实时变更

除主动查询外,可通过监听订阅流获取实时状态更新:

StreamSubscription<List<PurchaseDetails>>? _purchaseStream;

void startSubscriptionListener() {
  _purchaseStream = _inAppPurchase.purchaseStream.listen((purchases) {
    for (var purchase in purchases) {
      if (purchase.productID == '你的订阅商品ID') {
        // 状态变更时重新检查订阅状态
        checkSubscriptionStatus();
      }
    }
  });
}

// 页面销毁时取消监听
void disposeListener() {
  _purchaseStream?.cancel();
}

关键判断逻辑说明

  • 过期时间:expirationDate是核心判断字段,当前时间早于过期时间则视为活跃。
  • 自动续期状态:isAutoRenewing为false时,即使订阅未到期,到期后也会直接失效,需提前提示用户。
  • 购买状态:仅PurchaseStatus.purchased和PurchaseStatus.restored为有效状态,cancelled、pending等状态均视为失效。

注意事项

  • 需确保iOS/Android平台的订阅商品ID与代码中完全一致,且已在对应开发者后台配置完成。
  • iOS需在App Store Connect开启订阅状态通知,保证续期、取消等操作能及时同步到App。
  • 禁止仅依赖本地存储的订阅状态,必须每次查询服务器端数据,防止用户篡改本地信息。

内容的提问来源于stack exchange,提问作者Axel Carachure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:43:20