PAYATHON 2026

Chrome packaged app in-app payment api 获取产品列表报错

支付阿杰

结论

这类 internal server error 通常与遍历产品列表的代码无关,更可能是支付服务器无法识别当前 Chrome App,或找不到与该应用关联的商品。

常见原因是,本地通过“加载已解压的扩展程序”运行时生成的应用 ID,与 Chrome Web Store 中配置应用内商品的应用 ID 不一致。需要先在 Chrome Web Store 中创建应用并配置商品,再把商店项目对应的公钥写入 manifest.json 的 key 字段,让本地开发版本使用相同的应用 ID。

原因说明

google.payments.inapp.getSkuDetails() 会根据当前应用 ID 查询 Chrome Web Store 后台的商品。出现以下任一情况,都可能导致查询失败:

  • 应用尚未上传到 Chrome Web Store。
  • 本地应用 ID 与商店项目 ID 不一致。
  • manifest.json 中没有配置商店项目对应的 key。
  • 后台尚未创建、启用或保存应用内商品。
  • 应用或商家支付账户尚未完成必要配置。
  • buy.js 未正确加载,或者加载的支付环境与商品所在环境不一致。

如果失败回调只返回笼统的 INTERNAL_SERVER_ERROR,应先检查应用身份和商店后台配置,而不是修改 onSkuDetails() 中解析产品的逻辑。

解决步骤

  1. 将 Chrome App 上传到 Chrome Web Store Developer Dashboard,创建对应的商店项目。
  2. 在该项目下创建并启用应用内商品。
  3. 获取该商店项目对应的公钥。
  4. 将公钥添加到本地应用的 manifest.json:
{
  "manifest_version": 2,
  "name": "Example App",
  "version": "1.0.0",
  "key": "这里填写 Chrome Web Store 项目对应的公钥"
}
  1. 重新加载应用。
  2. 在扩展程序管理页面确认本地应用 ID 与 Chrome Web Store 项目 ID 完全一致。
  3. 再次调用 getSkuDetails(),并完整记录失败响应,以便定位具体的配置问题。

代码示例

调用方式可以保留,但最好增加响应检查,避免服务器返回的数据结构不完整时引发新的 JavaScript 异常:

function getProductList() {
  console.log("google.payments.inapp.getSkuDetails");
  statusDiv.text("Retrieving list of available products...");

  google.payments.inapp.getSkuDetails({
    parameters: {
      env: "prod"
    },
    success: onSkuDetails,
    failure: onSkuDetailsFailed
  });
}

function onSkuDetails(response) {
  console.log("onSkuDetails", response);

  var details = response &&
                response.response &&
                response.response.details;

  var products = details && details.inAppProducts
    ? details.inAppProducts
    : [];

  for (var i = 0; i < products.length; i++) {
    addProductToUI(products[i]);
  }

  statusDiv.text("");
  getLicenses();
}

function onSkuDetailsFailed(response) {
  console.error("onSkuDetailsFailed", response);

  var errorType = response &&
                  response.response &&
                  response.response.errorType
    ? response.response.errorType
    : "UNKNOWN_ERROR";

  statusDiv.text(
    "Error retrieving product list. (" + errorType + ")"
  );
}

注意事项

  • env: "prod" 表示生产环境,对应的商品必须已经在生产后台配置完成。
  • 不要手工猜测 key,也不要复制其他应用的 key。公钥必须属于当前 Chrome Web Store 项目。
  • 添加 key 后,应以最终显示的应用 ID 为准,与商店项目进行核对。
  • 商品配置可能不会立即生效。如果刚创建或修改了商品,可以稍后重试,但不能把所有 INTERNAL_SERVER_ERROR 都归因于同步延迟。
  • Chrome Apps 和相关支付能力后来经历了停止支持和平台下线。如果是在当前环境中重新开发,而不是维护历史部署,应先确认目标平台是否仍支持 google.payments.inapp。如果服务端能力已经下线,只修改代码或 manifest.json 无法恢复功能,需要迁移到仍受支持的 Web 支付或第三方支付方案。

备注:内容仅供参考。