使用 Google Play 结算服务

发布时间:2020 年 12 月 2 日

除了支持您的应用在 Play 商店中销售数字商品和订阅外,Google Play 结算服务还提供用于管理目录、价格和订阅的工具、实用报告以及由用户熟悉的 Play 商店提供支持的结账流程。在 Play 商店中发布的销售数字商品的应用必须满足此要求。

Google Play Billing API 有自己的术语,并包含客户端和后端组件。本部分仅介绍了与使用 Digital Goods API 和 Trusted Web Activity 相关的一小部分 API。在将 Google Play 结算服务集成到正式版应用之前,请务必阅读 Google Play 结算服务文档并了解相关概念。

基本流程

如需通过 Play 商店提供数字商品,请在 Play 商店中配置目录,并通过 PWA 将 Play 商店作为付款方式进行关联。

您可以按如下方式在 Play 商店界面中执行此操作:

  1. 点击 Play 管理中心菜单中的商品。查看您现有的应用内商品和订阅。第 1 步:找到“商品”部分。
  2. 点击创建商品以添加新商品。 第 2 步:访问“商品”界面以添加新商品。
  3. 添加商品 ID、名称、说明和价格。请创建有意义且易于记住的商品 ID,因为您稍后需要用到它们。ID 一经创建便无法更改。每个商品都有许多空白字段。
  4. 如果创建订阅,您还必须指定结算周期。您可以列出订阅权益并添加功能,例如免费试用、初次体验价、宽限期和重新订阅选项。
  5. 点击激活,使此产品变为可用状态。

您也可以使用 Play Developer API 添加商品。

配置目录后,下一步是通过 PWA 配置结账流程。结合使用 Digital Goods APIPayment Request API

使用 Digital Goods API 提取商品价格

使用 Google Play 结算服务时,请确保向用户显示的价格与商品详情中的价格一致。手动保持这些价格同步是不可能的,因此 Digital Goods API 提供了一种方法,供 Web 应用查询底层付款服务提供商的价格:

// The SKU for the product, as defined in the Play Store interface
async function populatePrice(sku) {
  try {
    // Check if the Digital Goods API is supported by the browser.
    if (window.getDigitalGoodsService) {
      // The Digital Goods API can be supported by other Payments provider.
      // In this case, we're retrieving the Google Play Billing provider.
      const service =
          await window.getDigitalGoodsService("https://play.google.com/billing");

      // Fetch product details using the `getDetails()` method.
      const details = await service.getDetails([sku]);

      if (details.length === 0) {
        console.log(`Could not get SKU: "${sku}".`);
        return false;
      }

      // The details contain both the price and the currenncy.
      item = details[0];
      const value = item.price.value;
      const currency = item.price.currency;

      const formattedPrice = new Intl.NumberFormat(navigator.language, {
        style: 'currency', currency: currency }).format(value);

      // Display the price to the user.
      document.getElementById("price").innerHTML = formattedPrice;
    } else {
      console.error("Could not get price for SKU \"" + sku + "\".");
    }
  } catch (error) {
    console.log(error);
  }
  return false;
}

您可以通过检查 window 对象上是否有 getDigitalGoodsService() 来检测对 Digital Goods API 的支持。

然后,使用 Google Play 结算标识符作为参数调用 window.getDigitalGoodsService()。这将返回一个 Google Play 结算服务的服务实例,其他供应商可以实现对 Digital Goods API 的支持并具有不同的标识符。

最后,对 Google Play 结算对象的引用调用 getDetails(),并将商品的 SKU 作为参数传递。该方法会返回一个详细对象,其中包含可向用户显示的商品的价格和币种。

启动购买流程

Payment Request API 可在网站上启用购买流程,还可用于 Google Play 结算集成。如果您刚开始接触 Payment Request API,请参阅 Payment Request API 的运作方式,了解详情。

如需将 API 与 Google Play 结算服务搭配使用,您需要添加付款方式,该付款方式具有一个名为 https://play.google.com/billing 的受支持方法。将 SKU 添加到仪器数据中:

const supportedInstruments = [{
  supportedMethods: "https://play.google.com/billing",
  data: {
    sku: sku
  }
}];

然后,照常构建 PaymentRequest 对象并照常使用 API

const request = new PaymentRequest(supportedInstruments, details);

确认购买交易

交易完成后,请使用 Digital Goods API 确认付款。来自 PaymentRequest 的响应对象包含可用于确认交易的令牌:

const response = await request.show();
const token = response.details.token;
const service = await window.getDigitalGoodsService("https://play.google.com/billing");
await service.acknowledge(token, 'onetime');

Digital Goods API 和 Payment Request API 不知道用户的身份。因此,您需要在后端将购买交易与用户相关联,并确保用户有权访问所购商品。将购买交易与用户相关联时,请务必保存购买交易令牌,因为您可能需要使用该令牌来验证购买交易是否已取消或退款,或者订阅是否仍有效。请查看 Real Time Developer Notifications APIGoogle Play Developer API,它们提供了用于在后端处理这些支持请求的端点。

检查现有使用权

用户可能已经兑换了促销代码,或者可能已经订阅了您的商品。为了验证用户是否拥有适当的使用权,您可以对数字商品服务调用 listPurchases() 命令。这会返回客户在您的应用中进行的所有购买交易。您还可以在此处确认所有未确认的购买交易,以确保用户正确兑换其权限。

const purchases = await itemService.listPurchases();
for (p of purchases) {
  if (!p.acknowledged) {
    await itemService.acknowledge(p.purchaseToken, 'onetime');
  }
}