# Digital Goods API（TWA 中的 Play Billing）

> Digital Goods API 让运行在 Trusted Web Activity 中的 PWA 通过 Google Play Billing 查询 SKU 与购买记录，并与 Payment Request API 配合使用。

**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 这一集成方案。

## 如何使用

```js
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` 是否存在，并在其不可用或所请求的服务商
无法访问时回退到网页结账：

```js
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 会撤销该
  购买”。

## 下一步

- [Payment Request API](/zh/reference/capabilities/payment-request/) —— Digital
  Goods API 所配合的浏览器中介结账流程。
- [Web Share API](/zh/reference/capabilities/web-share/)