react-native-iap调用getSubscriptions返回空数组(Android端问题)
问题描述
使用react-native-iap实现内购功能,iOS端运行正常,但Android端调用getSubscriptions始终返回空数组,该问题已持续2周,多种尝试后仍未解决。
已尝试方案
- 已添加账单权限:
<uses-permission android:name="com.android.vending.BILLING" /> - Google Play控制台已正确添加订阅且状态为活跃
- 应用已发布至Google Play
- 添加授权测试用户无效,普通用户也无法正常获取订阅列表
- 已在真实Android设备上测试,未使用模拟器
- 代码中优先执行
await initConnection();且该步骤运行正常 - 调用
await getSubscriptions({ skus });返回空数组 - 经Android Studio调试,确认代码执行了
queryProductDetailsAsync()但仍返回空数组
环境版本
- react-native-iap:10.0.6(也测试过11.0.0、10.0.1版本)
- react-native:0.68.2
- expo:~45.0.0
预期与实际行为
- 预期:
getSubscriptions返回有效的订阅产品数组 - 实际:Android端返回空数组
可能的解决步骤
严格核对SKU格式
Android对SKU的大小写、特殊字符完全敏感,确保代码中传入的skus数组每个值,和Google Play控制台订阅产品的产品ID完全一致,包括大小写、下划线、连字符等细节。确认应用签名匹配
Google Play内购要求应用签名证书与控制台配置一致。如果测试发布版本,必须用发布签名打包APK;内部测试轨道也要核对签名指纹。可在Google Play控制台「应用签名」页面查看证书信息,和本地签名文件对比。检查订阅产品的发布状态
即使订阅显示「活跃」,也要确认已发布到对应测试/正式轨道。新创建的订阅可能需要等待1-2小时才能被API获取到。同时检查产品的定价、地区可用性配置,确保没有限制测试地区或遗漏关键设置。匹配Billing Library版本
react-native-iap不同版本依赖的Google Billing Library版本不同:- v10.x对应Billing Library 4.x
- v11.x对应Billing Library 5.x
在android/build.gradle中手动指定版本,避免冲突:
dependencies { implementation 'com.android.billingclient:billing:4.0.0' // 适配react-native-iap 10.x // 或 implementation 'com.android.billingclient:billing:5.0.0' 适配react-native-iap 11.x }排查Expo环境配置
使用Expo 45时,不能用Expo Go测试内购,必须使用自定义开发客户端或构建正式APK。同时检查app.json中是否添加了内购相关权限配置,确保Expo插件正确集成。查看详细错误日志
在Android Studio的Logcat中过滤「BillingClient」关键词,查看是否有SKU_NOT_FOUND、SERVICE_DISCONNECTED等错误提示。也可以给getSubscriptions添加错误捕获,打印完整错误信息:try { const subscriptions = await getSubscriptions({ skus }); console.log(subscriptions); } catch (error) { console.error('获取订阅失败:', error); }更新Google Play服务
确保测试设备上的Google Play服务是最新版本,旧版本可能导致Billing API调用异常。在设备「设置-应用-Google Play服务」中检查并更新。
内容的提问来源于stack exchange,提问作者Eric

