Flutter应用内购重复购买提示"You Already Have This Item"问题咨询
问题解决方案
核心原因:Google Play 要求消耗型内购商品完成购买后必须走消耗流程,未消耗的商品会被标记为「已拥有」,无法发起二次购买。结合你提供的代码,需要按以下步骤调整:
步骤1:确认后台商品配置
首先检查Google Play Console后台的内购商品配置,确认buy_300_wecoin的商品类型为消耗型商品,如果配置为非消耗型/订阅类型,本身就不支持重复购买,需要先修改商品类型。
步骤2:调整代码消耗逻辑
你当前代码中buyConsumable方法的autoConsume参数设为了false,且购买验证完成后没有手动调用消耗接口,根据你的业务需求二选一调整即可:
方案A:开启自动消耗(适合无需服务端验证的场景)
直接修改buyProduct方法,将autoConsume参数改为true,SDK会在购买成功后自动完成消耗操作,无需额外处理:
void buyProduct(ProductDetails prod) { final PurchaseParam purchaseParam = PurchaseParam(productDetails: prod); // 改为autoConsume: true开启自动消耗 iap.buyConsumable(purchaseParam: purchaseParam, autoConsume: true); }
方案B:手动消耗(适合需要先做服务端收据验证的场景)
如果你的业务需要先校验购买收据合法性再给用户发权益,保留autoConsume: false的配置,在verifyPurchase验证购买有效后手动调用消耗接口:
bool verifyPurchase() { PurchaseDetails purchase = hasPurchased('buy_300_wecoin'); if (purchase != null && purchase.status == PurchaseStatus.purchased) { // 此处可插入你的业务逻辑:比如调用服务端验证购买收据、给用户加对应代币 setState(() { credits += 300; }); // 手动调用消耗接口 iap.consumePurchase(purchase); // 消耗完成后从本地purchases列表移除该记录,避免重复处理 purchases.remove(purchase); // 必须调用completePurchase完成交易,否则iOS端会重复回调交易信息 if (!purchase.billingClientPurchase.isAcknowledged) { iap.completePurchase(purchase); } return true; } return false; }
额外优化建议
你当前监听purchaseStream时直接使用purchases.addAll(data),会导致同一条购买记录被重复添加,建议每次处理完交易后清空或去重本地的purchases列表,避免逻辑异常。
内容的提问来源于stack exchange,提问作者user16893569
相关产品推荐
相关产品推荐

