使用 Google Play 帳款服務

發布日期:2020 年 12 月 2 日

除了讓應用程式在 Play 商店銷售數位商品和訂閱項目,Google Play 帳款服務還提供各種工具,協助管理目錄、價格和訂閱項目、提供實用的報表,以及由 Play 商店提供的結帳流程,讓使用者可以輕鬆完成結帳程序。在 Play 商店中發布銷售數位商品的應用程式必須符合規定。

Google Play 帳款服務 API 有其專屬的術語,並包含用戶端和後端元件。本節僅涵蓋使用 Digital Goods API 和 Trusted Web Activity 時所需的 API 一小部分。請務必詳閱 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 沒有使用者的身分資訊。因此,您必須在後端將購買交易與使用者建立關聯,並確保他們可以存取購買的項目。將購買交易與使用者建立關聯時,請記得儲存購買憑證,因為您可能需要儲存購買憑證,以便確認購買交易是否已取消或退款,或訂閱項目是否仍有效。查看 Real Time Developer Notifications APIGoogle Play Developer API,瞭解 API 提供在後端處理這類情況的端點。

檢查現有授權

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

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