React Native使用react-native-iap确认内购时遇非空参数错误
解决react-native-iap调用acknowledgePurchaseAndroid时的非空参数错误
你遇到的错误是因为Android端Kotlin代码要求token参数非空,但实际传入的值不符合要求——即便你做了空判断,也可能存在隐形空值或参数格式不匹配的问题。以下是具体排查和解决步骤:
1. 确认purchaseToken的真实值
在判断逻辑中加入日志,明确输出purchaseToken的实际内容和类型,排除看似有值但实际为空字符串、undefined或其他无效值的情况:
const purchase = { "purchaseToken": "fjjijcpgpadpaafpihlmlbpf.AO-J1OzNNbilg8roTwAQs-GNqMiEHWx8bcloXZs5md9u_sSekWfvhWY24DKy4yI1UegLVyEA6NmljaClMYqU2iJSDEFYMFV5og" }; const token = purchase?.purchaseToken; console.log('当前token值:', token, '类型:', typeof token); if(token && token.trim() !== ''){ RNIap.acknowledgePurchaseAndroid(token); }else{ console.log("Invalid Purchase Object or Purchase Token"); }
2. 适配react-native-iap版本的参数格式
不同版本的react-native-iap对acknowledgePurchaseAndroid的参数要求不同:
- 较新版本可能要求传入包含purchaseToken的对象,而非直接传字符串:
if(token && token.trim() !== ''){ RNIap.acknowledgePurchaseAndroid({ purchaseToken: token }); } - 旧版本支持直接传字符串,可根据自身使用的库版本调整。
3. 避免异步场景下的变量被修改
如果purchase对象是异步获取(比如从API或内购回调中获取),可能存在判断后、调用方法前变量被清空的情况。提前将token缓存到独立变量中,避免依赖原对象的引用:
// 假设purchase是异步获取的 const fetchPurchase = async () => { const purchase = await getPurchaseData(); // 你的异步获取逻辑 const token = purchase?.purchaseToken; if(token && token.trim() !== ''){ await RNIap.acknowledgePurchaseAndroid(token); } else { console.log("Invalid Purchase Object or Purchase Token"); } }
4. 确保token是有效的Google Play购买令牌
如果日志显示token确实是有效值,但仍然报错,可能是令牌本身无效(比如已被使用、过期),需要确认该令牌是Google Play返回的有效未确认购买令牌。
内容的提问来源于stack exchange,提问作者Mohit Jain
相关产品推荐
相关产品推荐

