# 谷歌支付「系统无法找到您要购买的商品」排查 应用内购时提示「系统无法找到您要购买的商品」,而 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 不一致。