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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:45:02