4.0 KiB
4.0 KiB
谷歌支付「系统无法找到您要购买的商品」排查
应用内购时提示「系统无法找到您要购买的商品」,而 Play 后台已配置商品,常见原因如下。
1. 商品 ID 不一致(最常见)
- 来源:客户端请求的商品 ID 来自接口 getGooglePayActivities 返回的 helm(产品代码),即
ActivityItem.code。 - 要求:该 ID 必须与 Google Play Console 里「创收」→「应用内商品」中配置的 产品 ID 完全一致(区分大小写、无多余空格)。
- 排查:
- 看日志:
[GooglePlayPurchase] 谷歌支付请求商品 ID(helm): "xxx"和notFoundIDs=xxx。 - 在 Play Console 打开对应应用 → 创收 → 应用内商品,对照「产品 ID」是否与日志里的
productId一字不差。
- 看日志:
- 处理:要么改后台/接口返回的 helm 与 Play 产品 ID 一致,要么在 Play 后台新建/修改产品,使产品 ID 与 helm 一致。
2. 应用未上架到任意版本轨道
- 应用必须至少发布到 内部测试 / 封闭测试 / 开放测试 / 生产 中的一条轨道,应用内商品才会对设备可见。
- 排查:Play Console → 发布 → 查看是否有版本在任一轨道上。
- 处理:上传 AAB 并发布到至少「内部测试」轨道;用于测试的账号需加入该轨道的测试人员名单。
3. 应用签名与 Play 不一致
- 设备上的应用必须用与 Play 登记一致的签名(或已加入「应用签名」的上传密钥)签名,否则 Play 不会返回该应用的商品。
- 排查:
- 正式包:是否用 Play 后台「应用签名」里显示的签名(或已登记的上传密钥)签名。
- 调试包:若用 debug 签名测试,需在 Play Console 把 SHA-1(或 SHA-256) 加入该应用的「许可证测试」或使用同一签名。
- 处理:使用与 Play 一致的 keystore 打 release 包;调试时确保测试设备上的签名已被 Play 接受(或使用内部测试并加入测试账号)。
4. 商品未激活或未保存
- Play 后台新建的应用内商品需 激活 并 保存,否则不会出现在查询结果中。
- 排查:创收 → 应用内商品 → 对应商品状态是否为「已激活」。
- 处理:保存并激活商品,等待一段时间(通常几分钟到几小时)再试。
5. 地区 / 账号
- 商品可能仅在某些国家/地区提供;设备上的 Google 账号所在地区可能不在支持范围内。
- 测试账号需有权限:内部测试等需将账号加入测试人员列表。
- 排查:设备 Google 账号地区、是否在测试名单内。
- 处理:在 Play Console 为商品勾选对应国家/地区;用已加入测试的账号登录设备。
6. 后端返回的 helm 与 Play 产品 ID 的映射
- 若后端 getGooglePayActivities 返回的 helm 是内部编码(例如活动 ID),而不是 Play 的「产品 ID」,就会导致查不到商品。
- 处理:确保 helm 字段就是该商品在 Play Console 里配置的「产品 ID」;如有映射表,需在服务端把活动/内部 ID 映射成真实的 Play 产品 ID 再填入 helm。
快速核对清单
| 检查项 | 说明 |
|---|---|
| 产品 ID 一致 | 日志中的 productId 与 Play「应用内商品」→「产品 ID」完全一致 |
| 应用已发布 | 至少一条轨道(如内部测试)有版本 |
| 签名一致 | 安装包签名与 Play 应用签名/上传密钥一致 |
| 商品已激活 | 应用内商品已保存并激活 |
| 测试账号 | 使用已加入测试的 Google 账号、账号地区在商品支持范围内 |
本应用中的日志
- 发起购买时会打日志:
[GooglePlayPurchase] 谷歌支付请求商品 ID(helm): "xxx"。 - 若商品未找到会打:
商品未找到: 请求的 productId="xxx", notFoundIDs=[xxx]。 - 根据上述 productId 与 notFoundIDs 到 Play 后台逐项对照「产品 ID」即可定位是否 ID 不一致。