Jeśli Twoja aplikacja jest rozpowszechniana przez Google Play i chcesz sprzedawać produkty cyfrowe lub oferować subskrypcje, musisz korzystać z Płatności w Google Play. Płatności w Google Play zapewniają narzędzia do zarządzania katalogiem, cenami i subskrypcjami, przydatne raporty i proces płatności znane ze Sklepu Play.
W przypadku aplikacji utworzonych przy użyciu zaufanych aktywności w internecie i dostarczanych za pomocą Sklepu Google Play możesz teraz używać interfejsów Payment Request API i Digital Goods API do integracji z Płatnościami w Google Play. Jest dostępna w Chrome 101 i nowszych wersjach na Androida i ChromeOS.
Z tego przewodnika dowiesz się, jak dodać obsługę Płatności w Google Play do swojej aplikacji PWA i spakować ją do dystrybucji w Sklepie Google Play dla systemu ChromeOS i Sklepu Play.
Aby dodać do swojej aplikacji PWA obsługę Płatności w Play, użyjesz 2 interfejsów API platform internetowych. Interfejs Digital Goods API służy do zbierania informacji o kodach SKU i sprawdzania zakupów i uprawnień w Sklepie Play. Payment Request API służy do konfigurowania Sklepu Google Play jako formy płatności i do sfinalizowania procesu zakupu.
Jak zarabiać na aplikacjach w Sklepie Play
Korzystając z Płatności w Sklepie Play, możesz zarabiać na swojej aplikacji na 2 sposoby:
- Zakupy w aplikacji umożliwiają sprzedaż trwałych i użytkowych towarów wirtualnych, takich jak dodatkowe funkcje czy usuwanie reklam.
- Subskrypcje: oferują użytkownikom stały dostęp do treści lub usług, takich jak subskrypcje wiadomości czy subskrypcje, za cykliczną opłatę.
Wymagania
Aby skonfigurować Płatności w Google Play, potrzebujesz:
- konto dewelopera w Google Play i konto sprzedawcy w Google Payments, które są ze sobą połączone;
- Informacje o aplikacji w Sklepie Play z wersją publiczną, ścieżką testów zamkniętych lub testów wewnętrznych.
- Do tworzenia i konfigurowania subskrypcji i produktów w Sklepie Play.
- Projekt wygenerowany w formie dymków z działającą konfiguracją Digital Asset Links.
Aktualizowanie projektu Bubblewrap
Jeśli nie masz zainstalowanej folii bąbelkowej, musisz ją zainstalować. Szczegółowe informacje o tym, jak zacząć, znajdziesz w krótkim przewodniku. Jeśli masz już Bubblewrap, zaktualizuj go do wersji 1.8.2 lub nowszej.
Ta funkcja jest również dostępna za pomocą flagi. Aby go włączyć, zmodyfikuj konfigurację projektu w pliku twa-manifest.json
w katalogu głównym projektu i włącz funkcje alphaDependencies
oraz playBilling
:
...,
"enableNotifications": true,
"features": {
"playBilling": {
"enabled": true
}
},
"alphaDependencies": {
"enabled": true
},
...
Po zaktualizowaniu pliku konfiguracji uruchom polecenie bubblewrap update
, aby zastosować konfigurację w projekcie, a następnie polecenie bubblewrap build
, aby wygenerować nowy pakiet na Androida i przesłać go do Sklepu Play.
Funkcja wykrywania dostępności interfejsu Digital Goods API i Płatności w Google Play
Chrome obsługuje obecnie interfejs Digital Goods API tylko wtedy, gdy aplikacja PWA jest wykonywana w ramach zaufanej aktywności w internecie. Można to sprawdzić, sprawdzając, czy w obiekcie window
występuje getDigitalGoodsService
.
if ('getDigitalGoodsService' in window) {
// Digital Goods API is supported!
}
Interfejs Digital Goods API może być dostępny w dowolnej przeglądarce i obsługuje różne sklepy. Aby sprawdzić, czy dany backend sklepu jest obsługiwany, musisz wywołać getDigitalGoodsService()
, przekazując jako parametr identyfikator sklepu. Sklep Google Play jest identyfikowany przez ciąg https://play.google.com/billing
:
if ('getDigitalGoodsService' in window) {
// Digital Goods API is supported!
try {
const service =
await window.getDigitalGoodsService('https://play.google.com/billing');
// Google Play Billing is supported!
} catch (error) {
// Google Play Billing is not available. Use another payment flow.
return;
}
}
Pobieranie szczegółów kodu SKU
Interfejs Digital Goods API udostępnia interfejs getDetails()
, który umożliwia pobieranie z backendu płatności takich informacji jak nazwa produktu, opis i – co najważniejsze – cena.
Następnie możesz wykorzystać te informacje w swoim interfejsie, by przekazać użytkownikowi więcej informacji:
const skuDetails = await service.getDetails(['shiny_sword', 'gem']);
for (item of skuDetails) {
// Format the price according to the user locale.
const localizedPrice = new Intl.NumberFormat(
navigator.language,
{style: 'currency', currency: item.price.currency}
).format(item.price.value);
// Render the price to the UI.
renderProductDetails(
item.itemId, item.title, localizedPrice, item.description);
}
Tworzenie procesu zakupu
Konstruktor PaymentRequest przyjmuje 2 parametry: listę form płatności i listę szczegółów płatności.
W zaufanej aktywności w internecie musisz użyć formy płatności w Google Play, ustawiając https://play.google.com/billing
jako identyfikator i dodając kod SKU produktu jako członka danych:
async function makePurchase(service, sku) {
// Define the preferred payment method and item ID
const paymentMethods = [{
supportedMethods: "https://play.google.com/billing",
data: {
sku: sku,
}
}];
...
}
Mimo że dane do płatności są wymagane, Płatności w Play zignorują je i użyją wartości ustawionych podczas tworzenia kodu SKU w Konsoli Play, więc mogą zostać wypełnione fałszywymi wartościami:
const paymentDetails = {
total: {
label: `Total`,
amount: {currency: `USD`, value: `0`}
}
};
const request = new PaymentRequest(paymentMethods, paymentDetails);
Aby rozpocząć proces płatności, wywołaj show()
w obiekcie żądania płatności. Jeśli obietnica się powiedzie,
możemy zrealizować płatność. Jeśli płatność nie powiodła się, użytkownik prawdopodobnie przerwał płatność.
Jeśli obietnica się powiedzie, musisz potwierdzić i potwierdzić zakup. Aby chronić Cię przed oszustwami, musisz wdrożyć ten krok za pomocą backendu. Informacje o tym, jak wdrożyć weryfikację w backendzie, znajdziesz w dokumentacji dotyczącej Płatności w Play. Jeśli nie potwierdzisz zakupu, po 3 dniach użytkownik otrzyma zwrot środków, a Google Play anuluje zakup.
...
const request = new PaymentRequest(paymentMethods, paymentDetails);
try {
const paymentResponse = await request.show();
const {purchaseToken} = paymentResponse.details;
// Call backend to validate and acknowledge the purchase.
if (await acknowledgePurchaseOnBackend(purchaseToken, sku)) {
// Optional: tell the PaymentRequest API the validation was
// successful. The user-agent may show a "payment successful"
// message to the user.
const paymentComplete = await paymentResponse.complete('success');
} else {
// Optional: tell the PaymentRequest API the validation failed. The
// user agent may show a message to the user.
const paymentComplete = await paymentResponse.complete('fail');
}
} catch(e) {
// The purchase failed, and we can handle the failure here. AbortError
// usually means a user cancellation
}
...
Opcjonalnie można wywołać consume()
przy użyciu tokena purchase, aby oznaczyć zakup jako wykorzystany i umożliwić jego ponowne zakup.
Po połączeniu wszystkich elementów metoda zakupu wygląda tak:
async function makePurchase(service, sku) {
// Define the preferred payment method and item ID
const paymentMethods = [{
supportedMethods: "https://play.google.com/billing",
data: {
sku: sku,
}
}];
// The "total" member of the paymentDetails is required by the Payment
// Request API, but is not used when using Google Play Billing. We can
// set it up with bogus details.
const paymentDetails = {
total: {
label: `Total`,
amount: {currency: `USD`, value: `0`}
}
};
const request = new PaymentRequest(paymentMethods, paymentDetails);
try {
const paymentResponse = await request.show();
const {purchaseToken} = paymentResponse.details;
// Call backend to validate and acknowledge the purchase.
if (await acknowledgePurchaseOnBackend(purchaseToken, sku)) {
// Optional: consume the purchase, allowing the user to purchase
// the same item again.
service.consume(purchaseToken);
// Optional: tell the PaymentRequest API the validation was
// successful. The user-agent may show a "payment successful"
// message to the user.
const paymentComplete =
await paymentResponse.complete('success');
} else {
// Optional: tell the PaymentRequest API the validation failed.
// The user agent may show a message to the user.
const paymentComplete = await paymentResponse.complete('fail');
}
} catch(e) {
// The purchase failed, and we can handle the failure here.
// AbortError usually means a user cancellation
}
}
Sprawdzanie stanu obecnych zakupów
Interfejs Digital Goods API pozwala sprawdzić, czy użytkownik ma jakiekolwiek uprawnienia (dokonania jeszcze niezrealizowanego zakupu w aplikacji lub trwającej subskrypcji) z wcześniejszych zakupów, których dokonał na innym urządzeniu, z poprzedniej instalacji, z wykorzystaniem kodu promocyjnego czy podczas ostatniego uruchomienia aplikacji.
const service =
await window.getDigitalGoodsService('https://play.google.com/billing');
...
const existingPurchases = await service.listPurchases();
for (const p of existingPurchases) {
// Update the UI with items the user is already entitled to.
console.log(`Users has entitlement for ${p.itemId}`);
}
To także dobry moment, aby sprawdzić, czy zakup został już dokonany, ale nie został potwierdzony. Jeśli chcesz, aby uprawnienia użytkowników były prawidłowo odzwierciedlane w aplikacji, zalecamy jak najszybsze potwierdzanie zakupów.
const service =
await window.getDigitalGoodsService("https://play.google.com/billing");
...
const existingPurchases = await service.listPurchases();
for (const p of existingPurchases) {
await verifyOrAcknowledgePurchaseOnBackend(p.purchaseToken, p.itemId);
// Update the UI with items the user is already entitled to.
console.log(`Users has entitlement for ${p.itemId}`);
}
Testowanie integracji
Na urządzeniu z Androidem deweloperskim
Na używanym urządzeniu z Androidem możesz włączyć interfejs Digital Goods API do testowania:
- Upewnij się, że używasz Androida 9 lub nowszego i włączony tryb programisty.
- Zainstaluj Chrome 101 lub nowszą wersję.
- Aby włączyć te flagi w Chrome, otwórz
chrome://flags
i wyszukaj flagę według nazwy:#enable-debug-for-store-billing
- Upewnij się, że witryna jest hostowana przy użyciu protokołu https. Użycie protokołu http spowoduje, że interfejs API będzie miał wartość
undefined
Na urządzeniu z ChromeOS
Interfejs Digital Goods API będzie dostępny w systemie stabilnym ChromeOS od wersji 89. Tymczasem interfejs Digital Goods API jest dostępny do testowania:
- Zainstaluj aplikację ze Sklepu Play na urządzeniu.
- Upewnij się, że witryna jest hostowana przy użyciu protokołu https. Użycie protokołu http spowoduje, że interfejs API będzie miał wartość
undefined
Użytkownicy testowi i zespoły kontroli jakości
Sklep Play udostępnia opcje testowania, m.in. konta testowe użytkowników i testowe kody SKU. Więcej informacji znajdziesz w dokumentacji dotyczącej testowania Płatności w Google Play.
Co dalej?
Jak wspomnieliśmy w tym dokumencie, interfejs Play Billing API wykorzystuje komponenty po stronie klienta, którymi zarządza się za pomocą interfejsu Digital Goods API oraz komponentów po stronie serwera.
- Zerknij na próbkę Petera Conna na https://github.com/PEConn/beer
- Zapoznaj się z dokumentacją Google Play na temat weryfikacji zakupów.
- Użyj jednej z bibliotek klienta interfejsu Google Play Developer API, które są dostępne w wielu językach.
- Jeśli implementujesz model subskrypcji w aplikacji, zapoznaj się z dokumentacją subskrypcji w Płatnościach w Play.
- zaimplementuj powiadomienia w czasie rzeczywistym dla deweloperów (RTDN) i zasubskrybuj powiadomienia, aby Twój backend był powiadamiany o zmianach stanu subskrypcji zamiast odpytywać ich stan w Google Play.
- Aby zapobiec powielaniu subskrypcji, zaimplementuj
linkedPurchaseToken
. Informacje o tym, jak go prawidłowo wdrożyć, znajdziesz w tym poście na blogu.