跳转到内容

Digital Goods API(TWA 中的 Play Billing)

发布于 更新于

Digital Goods API 让 Web 应用查询 SKU 详情,并检查来自商店的购买记录或权益, 与 Payment Request API 配合使用。根据 Chrome for Developers 的说明, window.getDigitalGoodsService 目前仅在 PWA 运行于 Trusted Web Activity(TWA)中 时由 Chrome 支持。

根据 Chrome 指南的说明,当 PWA 运行于 Chrome 的 TWA 中、且后端为 Google Play Billing 服务商时,该 API 可用。该 explainer 将此方法描述为一个通用的、与 服务商无关的提案——getDigitalGoodsService() 可以接受任意服务商 URL——本页记录的 是 Chrome 指南所覆盖的 Chrome-TWA 配合 Play Billing 这一集成方案。

const service = await window.getDigitalGoodsService('https://play.google.com/billing');
const itemDetails = await service.getDetails(['premium_upgrade']);
const purchases = await service.listPurchases();

根据该 explainer 的说明,listPurchases()“允许客户端获取用户当前拥有或已购买的 物品列表”。它返回的物品 ID 与购买令牌“应当在授予权益之前,通过与服务商之间的直接 API 进行验证”。

在调用之前先检测 getDigitalGoodsService 是否存在,并在其不可用或所请求的服务商 无法访问时回退到网页结账:

async function getStoreService() {
if (!('getDigitalGoodsService' in window)) {
// 未运行在支持 Play Billing 的 TWA 中——改为提供网页结账。
return null;
}
try {
return await window.getDigitalGoodsService('https://play.google.com/billing');
} catch {
// 根据该 explainer 的说明,当所请求的服务商不可用时该 promise 会被拒绝——
// 回退到网页结账。
return null;
}
}
  • 根据 Chrome 指南的说明,window.getDigitalGoodsService 目前仅在 PWA 运行于 TWA 中时受支持——调用前请先用 'getDigitalGoodsService' in window 进行特性检测。
  • 根据该 explainer 的说明,当“不存在与所给服务商对应的 Digital Goods Service”时该 promise 会被拒绝——根据 Chrome 指南的说明,这也包括 Google Play Billing 本身不可用的情况,而不仅限于未运行在 TWA 中,因此应把拒绝视为需要 回退的信号,而不是证明具体原因的证据。
  • 根据 Chrome 指南的说明,作为 Bubblewrap 项目基础的一部分,需要正确配置 Digital Asset Links;而 Play Billing 本身则是通过在 twa-manifest.json 中单独开启 Bubblewrap 的 playBilling 与 alphaDependencies 设置来启用的。
  • 根据该 explainer 与 Chrome 指南的说明,应通过与服务商之间的直接 API 验证 listPurchases() 返回的购买令牌,并在后端确认(acknowledge)购买——根据 Chrome 指南的说明,如果购买未被确认,“三天后用户将获得退款,且 Google Play 会撤销该 购买”。