使用 Google Play 帳款服務

發布日期:2020 年 12 月 2 日

除了讓應用程式在 Play 商店銷售數位商品和訂閱項目,Google Play 帳款服務還提供工具來管理目錄、價格和訂閱項目、實用的報表,以及使用者熟悉的 Play 商店結帳流程。這是 Play 商店中販售數位商品的應用程式必須具備的條件。

Google Play 帳款服務 API 有其專屬的術語,並包含用戶端和後端元件。本節僅涵蓋 API 的一部分,僅適用於使用 Digital Goods API 和 Trusted Web Activity。請務必先閱讀 Google Play 帳款服務說明文件並瞭解相關概念,再將其整合至正式版應用程式。

基本流程

如要透過 Play 商店提供數位商品,請在 Play 商店中設定目錄,並將 Play 商店連結至 PWA 的付款方式。

您可以透過 Play 商店介面進行這項操作,步驟如下:

  1. 按一下 Play 管理中心選單中的「產品」。查看現有的應用程式內產品和訂閱項目。 步驟 1:找到「產品」部分。
  2. 按一下「建立產品」新增產品。 步驟 2:前往「產品」介面新增產品。
  3. 新增產品 ID、名稱、說明和價格。請建立有意義且易於記憶的產品 ID,因為您稍後會用到這些 ID。建立 ID 後,就無法變更。每項產品都有許多空白欄位。
  4. 如果您要建立訂閱項目,也必須指定帳單週期。您可以列出訂閱福利,並新增免費試用、新用戶優惠、寬限期和重新訂閱選項等功能。
  5. 按一下「啟用」即可提供產品。

如有需要,您也可以使用 Play Developers API 新增產品。

設定目錄後,下一步就是從 PWA 設定結帳流程。請同時使用 Digital Goods APIPayment Request API

使用 Digital Goods API 擷取產品價格

使用 Google Play 帳款服務時,請務必確保向使用者顯示的價格與商店資訊中的價格一致。手動保持這些價格同步是不可能的,因此 Digital Goods API 提供了一種方法,讓網路應用程式可以查詢基礎付款供應商的價格:

// 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 結帳 ID 做為參數,呼叫 window.getDigitalGoodsService()。這會傳回 Google Play 結帳服務例項,其他供應商可以實作 Digital Goods API 支援功能,並使用不同的 ID。

最後,請在 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 不會知道使用者的身分。因此,您必須在後端將購買交易與使用者建立關聯,並確保他們可以存取購買的項目。將購買交易與使用者建立關聯時,請記得儲存購買權杖,因為您可能需要這項資訊來驗證購買交易是否已取消或退款,或是訂閱項目是否仍有效。請查看 即時開發人員通知 APIGoogle Play Developer API,因為這兩者提供的端點可用於處理後端中的這些情況。

檢查現有授權

使用者可能已兌換促銷代碼,或已訂閱您的產品。為驗證使用者是否具備適當的授權,您可以在數位商品服務上呼叫 listPurchases() 指令。這會傳回客戶在應用程式中進行的所有購買交易。您也可以在這裡確認任何未確認的購買交易,確保使用者能正確兌換其授權。

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