Flutter Android端使用官方in_app_purchase包实现订阅时购买报错
Flutter Android端使用官方in_app_purchase包实现订阅时购买报错
我之前也碰到过几乎一模一样的问题,折腾了好一阵才捋清楚问题所在,给你梳理几个绝对值得排查的方向:
1. 最核心的错误:用错了购买API!
订阅类型的商品绝对不能用buyNonConsumable方法!这个方法是给非消耗型商品(比如永久解锁功能)用的,订阅商品有专门对应的buySubscriptions方法。
你现在的代码是:
return _iap.buyNonConsumable(purchaseParam: param);
赶紧改成:
return _iap.buySubscriptions(purchaseParam: param);
iOS可能对这个API的兼容性比较宽松,但Android端对商品类型和API的匹配要求很严格,这大概率是你报错的主要原因。
2. 检查Google Play后台的商品配置
- 商品必须已发布到测试轨道:草稿状态的订阅商品是无法被测试购买的,你得把商品推到内部测试、封闭测试或开放测试轨道,并且将你的测试Google账号添加到对应的测试用户列表里。
- 商品ID完全匹配(包括大小写):Android对商品ID的大小写是敏感的,iOS则不敏感。比如你后台的ID是
pro_subscription_weekly,代码里写成了Pro_Subscription_Weekly,iOS能找到商品,但Android就会直接报“找不到”。 - 优惠活动关联正确:确认你的7天免费试用优惠已经正确关联到对应的基础计划,并且优惠的状态是已发布(不是草稿)。
3. 测试设备与账号的配置
- 必须使用测试账号:测试购买只能用添加到Play后台测试列表的账号,而且这个账号不能是你的开发者账号本身(除非你特意把开发者账号加入测试用户)。正式账号会触发真实扣费,且无法购买测试商品。
- 确保Google Play是最新版本:旧版本的Play商店可能存在兼容性问题,导致无法正确识别订阅商品,先把设备上的Play商店更到最新版再测试。
- 用真实设备测试:你说的没错,模拟器确实没法测试内购,必须用装有Google Play服务的真实Android设备。
4. 代码里的小细节检查
在调用购买方法前,加个日志打印一下要购买的商品ID:
print('准备购买的商品ID:${product.id}');
然后和Google Play后台的商品ID逐字符对比,确保没有多打、少打字符,或者拼写错误——这种低级错误很容易犯,而且iOS可能会“容错”,Android却不会。
你可以先从“换正确的购买API”开始排查,这个是我当初踩的坑,改完之后就解决了大部分问题。
内容来源于stack exchange




