Опубликовано: 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');
}
}