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
相关产品推荐
相关产品推荐

