一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何在HTML5中通过DigitalGoodsAPI处理PWA应用的内购买与订阅

时间:2026-06-14 09:50:03 编辑:袖梨 来源:一聚教程网

Digital Goods API是专为PWA设计的轻量级接口,用于安全查询和验证已配置的数字商品,不处理支付;仅支持Android上Chrome/Edge 117+等Chromium浏览器,需PWA已安装、HTTPS环境且manifest含"display":"standalone";须检测navigator.digitalGoods可用性;通过getDetails()查SKU详情,用acknowledgePurchase()验证purchaseToken(幂等但仅限未确认token),后端仍需调用Google Play Developer API最终校验。

Digital Goods API(DGA)是专为渐进式 Web 应用(PWA)设计的轻量级接口,用于安全地查询和验证已在应用商店(如 Google Play)中配置的数字商品(包括一次性购买与订阅)。它不处理支付流程本身,而是作为客户端与应用商店后端之间的“凭证校验桥梁”——真正扣款、订阅管理、续订、退款等均由平台(如 Play Billing Library)在原生层完成。

前提条件:PWA 必须运行在受支持环境

Digital Goods API 目前仅在 Android 上的 Chrome(117+)、Edge(117+)等基于 Chromium 的浏览器中可用,且要求 PWA 已通过 web-app-manifest 安装为“已添加到主屏幕”的应用,并启用 digitalGoods 权限(无需显式申请,但需满足安装状态与 HTTPS 环境)。

  • 确保你的 PWA 使用了有效的 manifest.json,包含 "display": "standalone""minimal-ui"
  • 服务必须通过 HTTPS 提供(本地 localhost 也允许调试)
  • 用户需已将应用“添加到主屏幕”,否则 navigator.digitalGoodsundefined

初始化并检查 API 可用性

使用前必须检测 navigator.digitalGoods 是否存在,避免在不支持环境中报错:

if ('digitalGoods' in navigator) {  try {    const dg = await navigator.digitalGoods.getDigitalGoodsService('play');    // ✅ 可用,继续查询商品  } catch (err) {    console.error('Digital Goods 初始化失败:', err.message);  }} else {  console.warn('Digital Goods API 不可用,请检查是否为已安装的 PWA');}

查询商品信息(一次性购买 & 订阅)

调用 getDetails() 获取预设商品的本地化标题、描述、价格等——这些信息来自 Google Play 控制台中配置的 SKU:

立即学习“前端免费学习笔记(深入)”;

  • SKU 名称需与 Play 控制台完全一致(如 premium_monthlyone_time_upgrade
  • 返回结果包含 price(格式化字符串)、priceCurrencytitledescriptiontype"inapp""subs"
  • 一次最多可查 100 个 SKU;建议按需批量请求,而非全量拉取

示例:

const skus = ['premium_monthly', 'premium_yearly', 'remove_ads'];const details = await dg.getDetails(skus);details.forEach(item => {  console.log(`${item.sku}: ${item.title} — ${item.price} (${item.type})`);});

处理购买与订阅确认(关键:验证 purchaseToken)

Digital Goods API 本身不发起购买。实际购买需跳转至 Play 商店(通过 getBuyIntent() 或更推荐的方式:调用原生 Android 的 PlayBillingClient),或由 PWA 嵌入的 Capacitor / Cordova 插件触发。购买完成后,你会收到一个 purchaseToken(通常通过 deep link、intent 回传或 service worker 拦截)。

此时用 DGA 验证该 token 是否真实有效:

try {  const ack = await dg.acknowledgePurchase({    purchaseToken: 'abc123...xyz',    isSubscription: true // 若为订阅,设为 true;一次性购买设 false  });  if (ack.acknowledged) {    // ✅ 服务器可放心授予权益(如开通会员、解锁功能)  }} catch (err) {  console.error('确认失败:', err.name); // 如 'InvalidPurchaseTokenError'}

注意:acknowledgePurchase 是幂等操作,但仅对未确认的 token 有效;重复确认会抛出错误。生产中应由后端完成最终验证(通过 Google Play Developer API),DGA 仅作前端快速反馈。

热门栏目