Flutter in_app_purchase 3.2.0:消耗品重复购买提示已拥有问题
解决in_app_purchase调试模式下消耗品重复购买限制问题
核心原因
Google Play测试环境对消耗品的购买有测试配额限制,默认情况下测试账号短时间内对同一消耗品的购买次数有限制,这就是你遇到前9次正常、后续提示"You already own this item"的原因,退款后配额会部分恢复但不会重置到初始状态。
调试环境下的解决办法
1. 强制手动消耗未完成订单
即便设置了autoConsume: true,测试环境的网络延迟或异常可能导致部分订单未被正确消耗。在初始化或发起购买前,主动查询并手动消耗未完成订单:
Future<void> _consumePendingPurchases() async { final QueryPurchaseDetailsResponse response = await _inAppPurchase.queryPastPurchases(); for (PurchaseDetails purchase in response.pastPurchases) { if (purchase.status == PurchaseStatus.purchased && !purchase.isConsumed) { await _inAppPurchase.consumePurchase(purchase); } } }
调用buyConsumable前先执行该方法,确保所有已购消耗品都被消耗。
2. 配置Google Play测试响应
在Google Play Console中给目标消耗品设置"立即批准并消耗"的测试响应:
- 进入Google Play Console > 你的应用 > 变现 > 应用内商品
- 选中目标消耗品,滚动到"测试响应"区域
- 选择"立即批准并消耗"并保存
设置后测试账号购买该商品时会自动完成消耗,不会触发"已拥有"提示,实现无限重复购买。
3. 更换测试账号或等待配额重置
每个测试账号的购买配额独立,可更换新测试账号继续测试;或等待24小时,Google Play测试环境的配额会自动重置。
4. 检查消耗逻辑完整性
确认_kAutoConsume变量为true,同时在purchaseUpdatedStream监听中,额外处理PurchaseStatus.purchased状态的订单,确保消耗逻辑覆盖所有场景:
StreamSubscription<List<PurchaseDetails>>? _subscription; void _listenToPurchaseUpdated() { _subscription = _inAppPurchase.purchaseUpdatedStream.listen((List<PurchaseDetails> purchaseDetailsList) { _handlePurchaseUpdates(purchaseDetailsList); }, onDone: () { _subscription?.cancel(); }, onError: (Object error) { // 处理错误 }); } void _handlePurchaseUpdates(List<PurchaseDetails> purchaseDetailsList) { for (var purchase in purchaseDetailsList) { if (purchase.status == PurchaseStatus.purchased) { if (!purchase.isConsumed) { _inAppPurchase.consumePurchase(purchase); } // 执行购买成功后的业务逻辑 } } }
注意事项
- 以上方法仅适用于调试/测试环境,正式发布无需修改逻辑,Google Play正式环境对消耗品重复购买无此类配额限制。
- 不要在正式版本中添加测试环境专属逻辑,避免影响正式用户体验。
内容的提问来源于stack exchange,提问作者Sarkheel Mughal
相关产品推荐
相关产品推荐

