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() 中解析产品的逻辑。
解决步骤
- 将 Chrome App 上传到 Chrome Web Store Developer Dashboard,创建对应的商店项目。
- 在该项目下创建并启用应用内商品。
- 获取该商店项目对应的公钥。
- 将公钥添加到本地应用的
manifest.json:
{
"manifest_version": 2,
"name": "Example App",
"version": "1.0.0",
"key": "这里填写 Chrome Web Store 项目对应的公钥"
}
- 重新加载应用。
- 在扩展程序管理页面确认本地应用 ID 与 Chrome Web Store 项目 ID 完全一致。
- 再次调用
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 支付或第三方支付方案。
备注:内容仅供参考。
