Как использовать Google Play Платежи в Trusted Web Activity

Это руководство предназначено для веб-приложений, упакованных как Trusted Web Activity. Для приложений Android, написанных на Kotlin или Java, ознакомьтесь с документацией по Google Play Платежам.

Приложения в Google Play, в которых продаются цифровые товары или подписки, должны использовать Google Play Платежи. В Trusted Web Activity интеграция выполняется с помощью следующих веб-API, доступных в Chrome 101 и более поздних версиях на Android и ChromeOS:

  • Digital Goods API позволяет получать информацию о товарах и покупках пользователя.
  • Payment Request API запускает процесс покупки.

Требования

Чтобы настроить Google Play Платежи, вам потребуется:

Не взимайте плату за скачивание приложения из Google Play. Ваше PWA-приложение по-прежнему доступно в интернете, поэтому платное скачивание не ограничивает доступ. Вместо этого продавайте функции или контент через покупки в приложении или подписки.

Как включить Google Play Платежи в проекте для Android

Если вы создаете приложение с помощью Bubblewrap, включите функцию playBilling в файле twa-manifest.json в корневом каталоге проекта:

"features": {
  "playBilling": {
    "enabled": true
  }
}

Затем выполните команду bubblewrap update, а после нее – bubblewrap build и загрузите новый пакет Android в Google Play.

Если вы создаете приложение в Android Studio, добавьте библиотеку Android Browser Helper Play Billing. Необходимые изменения в DelegationService и AndroidManifest.xml показаны в демоверсии twa-play-billing.

Проверьте, поддерживаются ли Google Play Платежи

Вызовите getDigitalGoodsService() с идентификатором Google Play https://play.google.com/billing. Если метод отсутствует или вызов не удался, используйте другой способ оплаты:

if ('getDigitalGoodsService' in window) {
  try {
    const service =
        await window.getDigitalGoodsService('https://play.google.com/billing');
    // Google Play Billing is available.
  } catch (error) {
    // Google Play Billing isn't available. Use another payment flow.
  }
}

Показать информацию о товаре

Чтобы получить название, описание и цену для идентификаторов товаров, используйте getDetails(). Так вы сможете показывать цены, которые соответствуют указанным в Google Play.

const details = await service.getDetails(['shiny_sword', 'gem']);
for (const item of details) {
  const localizedPrice = new Intl.NumberFormat(
      navigator.language,
      {style: 'currency', currency: item.price.currency}
  ).format(item.price.value);

  renderProductDetails(
      item.itemId, item.title, localizedPrice, item.description);
}

API цифровых товаров не может получить список идентификаторов товаров. Чтобы запросить их из серверной части, используйте Google Play Developer API.

Как оплатить покупку

Создайте PaymentRequest, указав https://play.google.com/billing в качестве способа оплаты и sku в качестве идентификатора товара в data. Google Play Платежи используют цену из Play Console, поэтому параметр total обязателен, но игнорируется.

После того как show() разрешит покупку, отправьте токен покупки на свой сервер, чтобы подтвердить и обработать покупку. Если вы не подтвердите покупку в течение трех дней, Google Play вернет пользователю средства и отменит покупку.

async function makePurchase(service, sku) {
  const paymentMethods = [{
    supportedMethods: 'https://play.google.com/billing',
    data: {sku},
  }];
  // Required by the Payment Request API, but ignored by Google Play Billing.
  const paymentDetails = {
    total: {label: 'Total', amount: {currency: 'USD', value: '0'}},
  };

  const request = new PaymentRequest(paymentMethods, paymentDetails);
  try {
    const response = await request.show();
    const {purchaseToken} = response.details;

    if (await acknowledgePurchaseOnBackend(purchaseToken, sku)) {
      // Optional: consume the purchase so the user can buy the item again.
      await service.consume(purchaseToken);
      await response.complete('success');
    } else {
      await response.complete('fail');
    }
  } catch (error) {
    // An AbortError usually means the user canceled the purchase.
  }
}

Как проверить покупки пользователя

Используйте listPurchases(), чтобы найти объекты, которыми владеет пользователь, например активные подписки, неиспользованные покупки или активированные промокоды. Проверьте каждую покупку на сервере и подтвердите те, которые ещё не подтверждены.

const purchases = await service.listPurchases();
for (const p of purchases) {
  await verifyOrAcknowledgePurchaseOnBackend(p.purchaseToken, p.itemId);
  // Update the UI with items the user is entitled to.
}

Тестирование интеграции

Чтобы протестировать приложение на устройстве Android перед публикацией в Google Play, выполните следующие действия:

  1. У вас устройство Android 9 или более поздней версии с включенным режимом разработчика.
  2. В Chrome перейдите на страницу chrome://flags и включите параметр #enable-debug-for-store-billing.
  3. Используйте протокол HTTPS. Digital Goods API недоступен по протоколу HTTP.

Если приложение установлено из Google Play, этот флаг не нужен. Чтобы выполнить проверку с помощью тестовых аккаунтов и продуктов, ознакомьтесь со статьей Как протестировать интеграцию библиотеки Google Play Платежей.

Дальнейшие действия