使用 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 商店中配置您的目录,并将 Play 商店作为付款方式关联到您的 PWA。

您可以在 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');
  }
}