Опубликовано: 2 декабря 2020 г.
Помимо возможности продавать цифровые товары и подписки в Play Store, Google Play Billing предлагает инструменты для управления каталогом, ценами и подписками, полезными отчетами и процессом оформления заказа на базе Play Store, который уже знаком вашим пользователям. Это требование для приложений, опубликованных в Play Store, которые продают цифровые товары.
API Google Play Billing имеет собственную терминологию и включает клиентские и бэкэнд-компоненты. В этом разделе рассматривается лишь небольшая часть API, которая относится к использованию API Digital Goods и Trusted Web Activity. Обязательно прочтите документацию по Google Play Billing и разберитесь в ее концепциях, прежде чем интегрировать ее в производственное приложение.
Основной поток
Чтобы предоставлять цифровые товары через Play Store, настройте свой каталог в Play Store и подключите Play Store в качестве способа оплаты из вашего PWA.
Это можно сделать в интерфейсе Play Store следующим образом:
-  Нажмите «Продукты» в меню Play Console. Просмотрите ваши существующие продукты и подписки в приложении.  
-  Нажмите «Создать продукт» , чтобы добавить новый продукт.  
-  Добавьте идентификатор продукта, название, описание и цену. Создавайте осмысленные и легко запоминающиеся идентификаторы продуктов, так как они вам понадобятся позже. После создания идентификаторы нельзя изменить.  
- При создании подписки вам также необходимо указать расчетный период. Вы можете перечислить преимущества подписки и добавить функции, такие как бесплатные пробные версии, ознакомительные цены, льготный период и возможность повторной подписки.
- Нажмите «Активировать» , чтобы сделать продукт доступным.
При желании вы можете добавлять свои продукты с помощью API разработчиков Play .
После настройки каталога следующим шагом будет настройка процесса оформления заказа из PWA. Используйте комбинацию API цифровых товаров и API запроса платежа .
Получите цену товара с помощью API цифровых товаров
При использовании Google Play Billing убедитесь, что цена, отображаемая пользователям, соответствует цене из листинга магазина. Синхронизация этих цен вручную невозможна, поэтому 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;
}
 Поддержку API цифровых товаров можно обнаружить, проверив, доступен ли getDigitalGoodsService() для объекта window .
 Затем вызовите window.getDigitalGoodsService() с идентификатором Google Play Billing в качестве параметра. Это возвращает экземпляр службы для Google Play Billing, а другие поставщики могут реализовать поддержку API Digital Goods и иметь другие идентификаторы.
 Наконец, вызовите getDetails() для ссылки на объект Google Play Billing, передавая SKU для элемента в качестве параметра. Метод возвращает объект Detail, содержащий как цену, так и валюту для элемента, которые могут быть отображены пользователю.
Начать процесс покупки
API запроса оплаты позволяет осуществлять покупки в Интернете, а также используется для интеграции Google Play Billing. Ознакомьтесь с этим Как работает API запроса оплаты, чтобы узнать больше, если вы новичок в API запроса оплаты.
 Чтобы использовать API с Google Play Billing, вам необходимо добавить платежный инструмент, который имеет поддерживаемый метод под названием 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);
Подтвердите покупку
 После завершения транзакции используйте 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');
API цифровых товаров и API запроса платежа не имеют сведений о личности пользователя. В результате вам нужно связать покупку с пользователем в вашем бэкэнде и убедиться, что у него есть доступ к купленным товарам. Привязывая покупку к пользователю, не забудьте сохранить токен покупки, так как он может вам понадобиться для проверки того, была ли покупка отменена или возвращена, или подписка все еще активна. Ознакомьтесь с API уведомлений разработчиков в реальном времени и API разработчика Google Play, поскольку они предоставляют конечные точки для обработки этих случаев в вашем бэкэнде.
Проверьте существующие права
 Пользователь мог использовать промокод или иметь существующую подписку на ваш продукт. Чтобы проверить, что у пользователя есть соответствующие права, вы можете вызвать команду listPurchases() в службе цифровых товаров. Это вернет все покупки, которые ваш клиент сделал в вашем приложении. Это также будет местом подтверждения любых неподтвержденных покупок, чтобы гарантировать, что пользователь правильно использует свои права.
const purchases = await itemService.listPurchases();
for (p of purchases) {
  if (!p.acknowledged) {
    await itemService.acknowledge(p.purchaseToken, 'onetime');
  }
}
 
 
        
        