Это руководство предназначено для веб-приложений, упакованных как 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 и аккаунт продавца Google Payments, связанные друг с другом.
- Страница приложения в Google Play с выпуском в общедоступной версии, канале закрытого или внутреннего тестирования.
- Контент и подписки, настроенные в Play Console.
- Проект Trusted Web Activity с работающей конфигурацией Digital Asset Links.
Не взимайте плату за скачивание приложения из 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, выполните следующие действия:
- У вас устройство Android 9 или более поздней версии с включенным режимом разработчика.
- В Chrome перейдите на страницу
chrome://flagsи включите параметр#enable-debug-for-store-billing. - Используйте протокол HTTPS. Digital Goods API недоступен по протоколу HTTP.
Если приложение установлено из Google Play, этот флаг не нужен. Чтобы выполнить проверку с помощью тестовых аккаунтов и продуктов, ознакомьтесь со статьей Как протестировать интеграцию библиотеки Google Play Платежей.
Дальнейшие действия
- Проверяйте покупки на сервере с помощью клиентской библиотеки Google Play Developer API.
- Подробнее о том, как продавать подписки…
- Настройте уведомления для разработчиков в режиме реального времени, чтобы отслеживать изменения в подписках.