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

Flutter iOS内购取消场景下completePurchase调用问题咨询

Flutter In-App-Purchase 取消交易的正确处理方式

是的,必须对状态为PurchaseStatus.canceled的交易调用completePurchase(Purchase),这是正确的处理方式。

原因解释

StoreKit(iOS内购底层框架)会将所有发起过的交易(包括用户取消的)留在pending交易队列中,直到你主动调用completePurchase()告知系统该交易已处理完毕。如果不清理取消的交易,同一应用会话内再次购买同一商品时,系统会检测到存在未收尾的同名交易,从而抛出你遇到的storekit_duplicate_product_object错误。

标准处理逻辑示例

在处理购买状态更新时,无论交易成功、失败还是取消,都需要调用completePurchase()来清理队列:

void processPurchaseUpdates(List<PurchaseDetails> purchases) {
  for (final purchase in purchases) {
    switch (purchase.status) {
      case PurchaseStatus.purchased:
        // 执行商品交付逻辑(如解锁功能、发放道具)
        unlockPremiumFeature(purchase);
        // 完成交易
        InAppPurchase.instance.completePurchase(purchase);
        break;
      case PurchaseStatus.canceled:
        // 可选:提示用户取消了购买
        showToast("购买已取消");
        // 关键:清理取消的交易
        InAppPurchase.instance.completePurchase(purchase);
        break;
      case PurchaseStatus.error:
        // 处理购买错误(如网络问题、支付失败)
        handlePurchaseFailure(purchase.error!);
        // 同样需要清理错误交易
        InAppPurchase.instance.completePurchase(purchase);
        break;
      default:
        // 其他状态(如pending)暂不处理,等待状态更新
        break;
    }
  }
}

验证说明

你测试中调用completePurchase()后可正常再次购买的结果,完全符合官方的预期处理流程。忽略取消/失败的交易只会导致队列堆积,引发后续购买异常,因此务必确保所有进入终态的交易都被调用completePurchase()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:15:54