HTML5 DigitalGoods API处理PWA内购买与订阅

作者:技术拾光

时间:2026-06-05

浏览:293

想在PWA里卖虚拟商品或搞订阅?Digital Goods API(DGA)是你必须掌握的工具。简单来说,它专为渐进式Web应用设计,核心任务只有一个:安全查询和验证已经在应用商店(如Google Play)里配置好的数字商品,无论是单次购买还是订阅。不过,有个关键点需提前明确——它本身不负责收钱。

文章目录

想在PWA里卖虚拟商品或搞订阅?Digital Goods API(DGA)是你必须掌握的工具。简单来说,它专为渐进式Web应用设计,核心任务只有一个:安全查询和验证已经在应用商店(如Google Play)里配置好的数字商品,无论是单次购买还是订阅。不过,有个关键点需提前明确——它本身不负责收钱。支付、订阅管理、续费、退款这些“重活”,实际都由平台的原生计费系统(比如Play Billing Library)在幕后完成。DGA扮演的角色更像是一个高效的“凭证校验员”,在客户端和商店后端之间架起一座安全桥。

HTML5 DigitalGoods API处理PWA内购买与订阅

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

想用上DGA,你的PWA得满足几个硬性条件。目前,它只在Android平台的特定浏览器上可用,具体是Chrome 117+、Edge 117+这些基于Chromium内核的版本。而且,PWA不能只是在浏览器标签页里随意打开,它必须已被用户“添加到主屏幕”,成为一个独立App。同时,服务必须通过HTTPS提供(本地调试用的localhost允许)。

  • 确保manifest.json文件配置正确,其中"display"字段必须是"standalone"或"minimal-ui"。
  • 用户必须已将应用“添加到主屏幕”,否则在代码里找不到na vigator.digitalGoods对象。

初始化并检查 API 可用性

动手写代码前,第一步永远是检查环境是否支持。这样能避免在不兼容的平台上直接报错,影响用户体验。

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

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

环境准备好后,就可以向商店查询商品详情了。通过调用getDetails()方法,你能拿到在Google Play控制台里预先配置好的商品信息,包括本地化的标题、描述、价格等。

  • 注意:传入的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)

到了最核心的环节——处理购买。这里需明确:DGA本身不发起购买流程。实际购买动作需要跳转到Google Play商店完成。这通常可以通过调用原生的PlayBillingClient,或者借助Capacitor、Cordova这类混合应用框架的插件来触发。

购买完成后,你的应用会收到一个关键凭证:purchaseToken。这个Token可能通过深度链接、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有效。如果你拿一个已经确认过的Token重复调用,它会直接抛错。所以,在实际生产环境中,更稳妥的做法是,前端用DGA做快速反馈(比如立即解锁本地功能),但最终的用户权益授予和订单校验,一定要由你的后端服务器调用官方的Google Play Developer API来完成。这样构成了一个前后端协同的双重验证机制,安全性更有保障。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章