React Native安卓消耗型内购订单自动取消问题求助
解决React Native IAP安卓端消耗型内购被自动取消的问题
针对你遇到的安卓端购买成功后收到谷歌Play取消订单邮件的问题,核心原因是消耗型内购未被正确确认(acknowledge),谷歌Play会在购买后一定时间内取消未确认的订单。以下是具体修复方案:
1. 修正finishTransaction的参数传递
你当前传入finishTransaction的purchase是整个数组(requestPurchase返回的是Purchase[]),但该方法需要单个Purchase对象。修改代码:
// 原代码 await finishTransaction({purchase: purchase, isConsumable: true, developerPayloadAndroid: ""}); // 修改后 await finishTransaction({ purchase: purchase[0], // 取第一个购买项 isConsumable: true, developerPayloadAndroid: "" });
2. 手动调用安卓专属的确认接口(兜底处理)
如果finishTransaction未正确触发确认,可单独调用acknowledgePurchaseAndroid确保谷歌收到确认信号:
// 在finishTransaction之后添加(或替换) if (Platform.OS === 'android') { await acknowledgePurchaseAndroid({ purchaseToken: purchase[0].purchaseToken }); }
3. 必须设置purchaseUpdatedListener监听购买回调
仅依赖requestPurchase的then回调可能遗漏部分场景(比如应用后台完成的购买),需全局监听购买状态:
componentDidMount() { this.initilizeIAPConnection(); // 添加购买监听 this.purchaseUpdateSubscription = purchaseUpdatedListener((purchase) => { const { purchaseToken, productId } = purchase; // 处理购买成功逻辑 if (purchase.transactionState === 'purchased') { // 确认订单 finishTransaction({ purchase: purchase, isConsumable: true }).then(() => { // 订单确认成功,发放商品 }).catch(err => { console.error('确认订单失败:', err); }); } }); } componentWillUnmount() { // 移除监听 if (this.purchaseUpdateSubscription) { this.purchaseUpdateSubscription.remove(); } endConnection(); }
4. 检查谷歌Play控制台配置
- 确认你创建的内购商品类型是消耗型(Consumable),而非非消耗型或订阅
- 确保测试账号已添加到谷歌Play控制台的许可测试列表中
5. 完善错误捕获
在确认订单的代码块中添加错误捕获,排查是否有网络或接口调用失败:
try { await finishTransaction({ purchase: purchase[0], isConsumable: true }); if (Platform.OS === 'android') { await acknowledgePurchaseAndroid({ purchaseToken: purchase[0].purchaseToken }); } } catch (ackErr) { console.error('确认订单出错:', ackErr.code, ackErr.message); // 可在这里添加重试逻辑 }
内容的提问来源于stack exchange,提问作者Mayur Prajapati - MeProgrammer
相关产品推荐
相关产品推荐

