Uygulamanız Google Play üzerinden dağıtılıyorsa ve dijital ürünler satmak ya da abonelik sunmak istiyorsanız Google Play Faturalandırma'yı kullanmanız gerekir. Google Play Faturalandırma, kataloğunuzu, fiyatlarınızı ve aboneliklerinizi yönetmenize yardımcı olacak araçlar, faydalı raporlar ve kullanıcılarınızın aşina olduğu, Play Store tarafından desteklenen bir ödeme akışı sunar.
Güvenilir Web Etkinlikleri kullanılarak oluşturulan ve Google Play Store üzerinden yayınlanan uygulamalarda artık Google Play Faturalandırma ile entegrasyon için Payment Request API ve Digital Goods API'yi kullanabilirsiniz. Android ve ChromeOS için Chrome 101 ve sonraki sürümlerde kullanılabilir.
Bu kılavuzda, PWA'nıza Google Play Faturalandırma desteğini nasıl ekleyeceğinizi ve hem ChromeOS hem de Play Store için Google Play Store'da dağıtılmak üzere nasıl paketleyeceğinizi öğreneceksiniz.
PWA'nıza Play Faturalandırma desteği eklemek için iki web platformu API'si kullanacaksınız. Digital Goods API, SKU bilgilerini toplamak ve Play Store'daki satın alma işlemlerini ve haklarınızı kontrol etmek için kullanılır. Payment Request API, Google Play Store'u ödeme yöntemi olarak yapılandırmak ve satın alma akışını tamamlamak için kullanılır.
Play Store'daki uygulamalardan para kazanma
Uygulamanızın Play Store'da Google Play Faturalandırma ile para kazanmasının iki yolu vardır:
- Uygulama içi satın alma işlemleri, ek özellikler veya reklamları kaldırma gibi hem dayanıklı hem de tüketilebilir sanal ürünlerin satışına olanak tanır.
- Abonelikler, kullanıcılarınıza belirli aralıklarla ödeme yapmaları karşılığında içerik veya hizmetlere sürekli erişim imkanı sunar (ör. haber abonelikleri veya üyelikler).
Şartlar
Google Play Faturalandırma'yı ayarlamak için şunlar gerekir:
- Birbirine bağlı bir Google Play Geliştirici hesabı ve Google Ödeme satıcı hesabı.
- Herkese açık, kapalı test veya dahili test kanalında sürüm içeren bir Play Store girişi.
- Uygulamanızın Play Store'daki ürünlerini ve aboneliklerini oluşturmak ve yapılandırmak için
- Çalışan bir Digital Asset Links yapılandırması içeren Bubblewrap tarafından oluşturulmuş bir proje.
Bubblewrap projesini güncelleme
Bubblepack'i yüklemediyseniz yüklemeniz gerekir. Nasıl başlayacağınızla ilgili ayrıntılar için Hızlı Başlangıç Kılavuzu'na bakın. Bubblewrap zaten yüklüyse 1.8.2 veya sonraki bir sürüme güncellediğinizden emin olun.
Bubblewrap'ta da bu özellik bir bayrakla gösterilir. Bu özelliği etkinleştirmek için projenin kökünde bulunan twa-manifest.json
dosyasında proje yapılandırmasını değiştirmeniz ve hem alphaDependencies
hem de playBilling
özelliğini etkinleştirmeniz gerekir:
...,
"enableNotifications": true,
"features": {
"playBilling": {
"enabled": true
}
},
"alphaDependencies": {
"enabled": true
},
...
Yapılandırma dosyası güncellendikten sonra, yapılandırmayı projeye uygulamak için bubblewrap update
'ü, ardından yeni bir Android paketi oluşturmak ve bu paketi Play Store'a yüklemek için bubblewrap build
'ü çalıştırın.
Dijital Ürünler API'sinin ve Google Play Faturalandırma'nın kullanılabilirliğini algılama özelliği
Digital Goods API, şu anda yalnızca PWA, Güvenilir Web Etkinliği içinde yürütülüyorken Chrome tarafından desteklenmektedir. window
nesnesinde getDigitalGoodsService
olup olmadığını kontrol ederek kullanılabilir olup olmadığını tespit etmek mümkündür:
if ('getDigitalGoodsService' in window) {
// Digital Goods API is supported!
}
Digital Goods API, herhangi bir tarayıcıda kullanılabilir ve farklı mağazaları destekleyebilir. Belirli bir mağaza arka ucunun desteklenip desteklenmediğini kontrol etmek için mağaza kimliğini parametre olarak göndererek getDigitalGoodsService()
'yi çağırmanız gerekir. Google Play Store, https://play.google.com/billing
dizesi ile tanımlanır:
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;
}
}
SKU ayrıntılarını alma
Digital Goods API, ödeme arka ucundan ürün başlığı, açıklama ve en önemlisi fiyat gibi bilgilerin alınmasına olanak tanıyan getDetails()
sağlar.
Ardından bu bilgileri kullanıcı arayüzünüzde kullanabilir ve kullanıcıya daha fazla ayrıntı sağlayabilirsiniz:
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);
}
Satın alma akışını oluşturma
PaymentRequest sınıfının kurucusu iki parametre alır: ödeme yöntemlerinin listesi ve ödeme ayrıntılarının listesi.
Güvenilir Web Etkinliği'ndeyken https://play.google.com/billing
adresini tanımlayıcı olarak ayarlayıp ürün SKU'sunu veri üyesi olarak ekleyerek Google Play faturalandırma ödeme yöntemini kullanmanız gerekir:
async function makePurchase(service, sku) {
// Define the preferred payment method and item ID
const paymentMethods = [{
supportedMethods: "https://play.google.com/billing",
data: {
sku: sku,
}
}];
...
}
Ödeme ayrıntıları gerekli olsa da Play Faturalandırma bu değerleri yoksayar ve Play Console'da SKU'yu oluştururken ayarlanan değerleri kullanarak sahte değerlerle doldurulabilir:
const paymentDetails = {
total: {
label: `Total`,
amount: {currency: `USD`, value: `0`}
}
};
const request = new PaymentRequest(paymentMethods, paymentDetails);
Ödeme akışını başlatmak için ödeme isteği nesnesinde show()
işlevini çağırın. Promise başarılı olursa
ödeme başarılı olmuş olabilir. Ödeme başarılı olmadıysa, kullanıcı muhtemelen ödemeyi iptal etmiştir.
Taahhüt başarılı olursa satın alma işlemini doğrulamanız ve onaylamanız gerekir. Sahtekarlığa karşı koruma sağlamak için bu adımın arka uçunuz kullanılarak uygulanması gerekir. Doğrulamayı arka uçunuza nasıl uygulayacağınızı öğrenmek için Play Faturalandırma belgelerine göz atın. Satın alma işlemini onaylamazsanız üç gün sonra kullanıcıya geri ödeme yapılır ve Google Play satın alma işlemini iptal eder.
...
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
}
...
İsteğe bağlı olarak, satın alma işlemini kullanılmış olarak işaretlemek ve tekrar satın alınmasına izin vermek için purchaseToken üzerinde consume()
çağrılabilir.
Tüm bunları bir araya getirdiğimizde satın alma yöntemi aşağıdaki gibi görünür:
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
}
}
Mevcut satın alma işlemlerinin durumunu kontrol etme
Digital Goods API, kullanıcının başka bir cihazda, önceki bir yüklemede yaptığı, bir promosyon kodundan kullandığı veya yalnızca uygulamayı son açtığı tarih fark etmeksizin önceden yaptığı satın alma işlemlerinden herhangi bir yararlanma hakkına (henüz kullanılmamış uygulama içi satın alma işlemleri veya devam eden abonelikler) sahip olup olmadığını kontrol etmenizi sağlar.
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}`);
}
Bu, daha önce yapılan ancak onaylanmayan satın alma işlemlerini kontrol etmek için de iyi bir fırsattır. Kullanıcılarınızın haklarının uygulamanıza doğru şekilde yansıtılmasını sağlamak için satın alma işlemlerini mümkün olan en kısa sürede onaylamanız önerilir.
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}`);
}
Entegrasyonunuzu test etme
Geliştirme amaçlı Android cihazda
Test için geliştirme amaçlı bir Android cihazda Dijital Ürünler API'yi etkinleştirmek mümkündür:
- Geliştirici modunun etkinleştirildiği Android 9 veya sonraki bir sürüm kullandığınızdan emin olun.
- Chrome 101 veya sonraki bir sürümü yükleyin.
chrome://flags
adresine gidip bayrağı ada göre arayarak Chrome'da şu işaretleri etkinleştirin:#enable-debug-for-store-billing
- Sitenin https protokolü kullanılarak barındırıldığından emin olun. http kullanılması, API'nin
undefined
olmasına neden olur.
ChromeOS cihazda
Digital Goods API, ChromeOS'te 89 sürümünden itibaren kararlı sürümde kullanılabilir. Bu sırada Digital Goods API'yi test edebilirsiniz:
- Uygulamanızı Play Store'dan cihaza yükleyin.
- Sitenin https protokolü kullanılarak barındırıldığından emin olun. http kullanılması, API'nin
undefined
olmasına neden olur.
Test kullanıcıları ve kalite kontrol ekipleriyle
Play Store, kullanıcı test hesapları ve test SKU'ları da dahil olmak üzere test için olanaklar sunar. Daha fazla bilgi için Google Play Faturalandırma test belgelerine göz atın.
Sıradaki durak neresi?
Bu belgede de belirtildiği gibi Play Billing API'nin, Digital Goods API tarafından yönetilen istemci tarafı bileşenleri ve sunucu tarafı bileşenleri vardır.
- Peter Conn'un https://github.com/PEConn/beer adresindeki örneğine göz atın.
- Satın alma işlemini doğrulama ile ilgili Play belgelerini inceleyin.
- Çoklu dilde kullanılabilen Google Play Developer API istemci kitaplıklarından birini kullanabilirsiniz.
- Uygulamanızda abonelik modeli uyguluyorsanız Play Faturalandırma abonelikleri dokümanlarına göz atın.
- Gerçek zamanlı geliştirici bildirimlerini (RTDN) uygulayın ve Play'de durumlarını sorgulamak yerine, aboneliğin durumu değiştiğinde arka uç sunucunuzun bilgilendirilmesi için bildirimlere abone olun.
- Yinelenen abonelikleri önlemek için
linkedPurchaseToken
uygulayın. Doğru şekilde nasıl uygulanacağıyla ilgili bu blog yayınını okuyun.