如何使用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
相关产品推荐
相关产品推荐

