最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何在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.digitalGoods为undefined
初始化并检查 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_monthly、one_time_upgrade) - 返回结果包含
price(格式化字符串)、priceCurrency、title、description和type("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 仅作前端快速反馈。
相关文章
- 阶跃星辰开发者提示词模板怎么优化?3种场景式模板对比 06-14
- 浮空秘境秘纹组合搭配方案详情一览 06-14
- Minimax开发者进阶技巧:如何避免5个常见配置错误? 06-14
- Minimax开发者编程使用方法:5步完成API接入与调试 06-14
- 归家异途2攻略(深入解析技能加点策略,助你在归家异途2中取得优势) 06-14
- Minimax开发者速度慢怎么办?3种常见原因与排查步骤 06-14