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 Ödeme İsteği API'sini ve Dijital Ürünler API'sini 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 reklam kaldırma gibi hem dayanıklı hem de tüketim amaçlı 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
Bubblewrap yüklü değilse 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 kullanıyorsanız 1.8.2 veya sonraki bir sürüme güncellediğinizden emin olun.
Bubblewrap'te de 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.
Digital Goods API ve Google Play Faturalandırma kullanılabilirliğini algılayan özellik
Digital Goods API şu anda yalnızca PWA'nın Güvenilir Web Etkinliği içinde yürütüldüğü durumlarda Chrome tarafından desteklenmektedir. window
nesnesinde getDigitalGoodsService
olup olmadığını kontrol ederek API'nin kullanılabilir olup olmadığını tespit edebilirsiniz:
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()
'ü ç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'nun ayrıntılarını alma
Digital Goods API, ürün başlığı, açıklama ve en önemlisi fiyat gibi bilgilerin ödeme arka ucundan 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
değerini tanımlayıcı olarak ayarlayarak ve ü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ı zorunlu olsa da Play Faturalandırma bu değerleri yoksayıp Play Console'da SKU oluşturulurken ayarlanan değerleri kullanır. Bu nedenle, bu alanlar 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. Sözleşme başarılı olursa ödeme başarılı olmuş demektir. Bu işlem başarısız olursa kullanıcı ödemeyi iptal etmiş olabilir.
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 daha önce yaptığı satın alma işlemlerinden (başka bir cihazda, önceki bir yüklemeden, promosyon koduyla etkinleştirilen veya uygulamayı en son açtığında etkinleştirilen henüz kullanılmamış uygulama içi satın alma işlemleri ya da devam eden abonelikler) yararlanma hakkı olup olmadığını kontrol etmenize olanak tanır.
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 kabul edilmeyen satın alma işlemlerini kontrol etmek için de iyi bir zamandı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 Digital Goods 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 işareti isme göre arayarak Chrome'da aşağıdaki 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
özelliğini uygulayın. Doğru şekilde nasıl uygulanacağıyla ilgili bu blog yayınını okuyun.