Bu konuda, Google Play Faturalandırma Kitaplığı 4 veya 5'ten Google Play Faturalandırma Kitaplığı 6'ya nasıl geçiş yapılacağı ve yeni abonelik özelliklerinin nasıl kullanılacağı açıklanmaktadır.
6.0.0 sürümündeki değişikliklerin tam listesi için sürüm notlarına bakın.
Genel bakış
Google Play Faturalandırma Kitaplığı 6, sürüm 5'te sunulan yeni abonelik özelliklerini temel alır ve birkaç iyileştirme daha ekler. Bu özellikler, abonelikleri daha fazla şekilde satmanıza olanak tanır ve sürekli artan sayıda SKU oluşturma ve yönetme ihtiyacını ortadan kaldırarak operasyonel maliyetleri düşürür.
Play Faturalandırma Kitaplığı 5 ile birlikte sunulan yeni özellikler hakkında daha fazla bilgi için Play Console'da aboneliklerle ilgili son değişiklikler bölümüne bakın.
Geriye dönük uyumlu Play Faturalandırma Kitaplığı yükseltmesi
Play Faturalandırma Kitaplığı 5'in ve yeni abonelik platformunun Mayıs 2022'de yayınlanması kapsamında mevcut tüm abonelik ürünleri otomatik olarak bu yeni paradigmaya dönüştürüldü. Bu sayede, Play Faturalandırma Kitaplığı'nın yeni sürümleriyle uyumlu bir kataloga sahip olmak için abonelik ürün yapılandırmasında değişiklik yapmanız gerekmez. Abonelik SKU'larının geriye dönük uyumlu aboneliklere nasıl dönüştürüldüğü hakkında daha fazla bilgi için Play Console Yardım makalesinin Eski aboneliklerle çalışma bölümüne bakın.
Uygulamanızın eski sürümleri çalışmaya devam eder
Geriye dönük uyumlu bir abonelik kataloğunuz varsa uygulamanızın mevcut tüm sürümleri bu ürünler için amaçlandığı şekilde çalışmaya devam eder. Tek seferlik ürün satın alımları, eski sürümlerde sorun yaşamadan çalışmaya devam edecektir.
Uygulamanızın kullanımdan kaldırılan yöntemleri (ör. querySkuDetailsAsync()
) kullanan sürümleri, geriye dönük uyumlu olmayan temel plan veya fırsatları satamaz. Geriye dönük uyumlu teklifler hakkında bilgi edinmek için ilgili Play Console Yardım Merkezi makalesine göz atabilirsiniz.
Play Faturalandırma Kitaplığı 5 veya 6 sürümüne geçme
Play Faturalandırma Kitaplığı 5 ve 6, kullanımdan kaldırılan querySkuDetailsAsync
ve SkuDetails
yöntemlerini faturalandırma akışı parametresi olarak kabul eden BillingFlowParams.Builder.setSkuDetails
yöntemlerini içerir. Yani farklı taşıma aşamalarını planlayarak Play Faturalandırma Kitaplığı 6'ya kademeli olarak geçebilirsiniz.
Taşıma işleminin ilk adımı olarak kitaplık sürümünü güncelleyebilir, kataloğunuzu ve arka ucunuzu olduğu gibi bırakabilir ve uygulamanızı, kullanımdan kaldırılan yöntemleri kullanmaya devam ederken test edebilirsiniz. queryPurchases
, launchPriceChangeFlow
veya setVrPurchaseFlow
kullanmıyor olsanız da beklendiği gibi çalışmaya devam edecektir. Daha sonra, Mayıs 2022'de kullanıma sunulan yeni abonelik özelliklerini tam olarak kullanmaya başlayabilirsiniz.
Bu özellikleri daha önce Google Play Faturalandırma Kitaplığı 5'e taşırken kullandıysanız doğrudan Google Play Faturalandırma Kitaplığı'nı güncelleme ve Kullanıcının abonelik satın alma işlemlerini değiştirme başlıklı bölümlere geçebilirsiniz. Eski bir sürümden başlıyorsanız veya yeni özellikleri henüz tam olarak benimsemediyseniz bu özellikleri nasıl kullanacağınızı öğrenmek için aşağıdaki taşıma adımlarının tamamını okuyabilirsiniz.
Tam taşıma adımları
Arka uç ürün kataloğunuzda yeni abonelikler oluşturma
Artık Play Developer Console veya Play Developer API'yi kullanarak her biri birden fazla teklif içeren birden fazla temel plan içeren tek bir abonelik yapılandırabilirsiniz. Abonelik fırsatlarının esnek fiyatlandırma modelleri ve uygunluk seçenekleri vardır. Otomatik yenilenen ve ön ödemeli plan çeşitlerini kullanarak abonelik yaşam döngüsü boyunca fırsatlar oluşturabilirsiniz.
Uygulamanızı taşımadan önce, Play Faturalandırma Kitaplığı 6 entegrasyonunuzun yeni abonelik platformundaki varlık yapısını takip ederek yeni ürünler oluşturmanızı öneririz. Eski kataloğunuzdaki, aynı yararlanma haklarını tek bir abonelik altında temsil eden yinelenen ürünleri birleştirebilir ve sunmak istediğiniz tüm seçenekleri temsil eden temel plan ve teklif yapılandırmalarını kullanabilirsiniz. Bu öneri hakkında daha fazla bilgi için Play Console Yardım makalesinin Eski aboneliklerle çalışma bölümüne bakın.
Dönüştürülen abonelik ürünlerini Mayıs 2022 sürümünden sonra değiştirmemenizi öneririz. Bunları, kullanımdan kaldırılan yöntemler (ör. querySkuDetailsAsync()
) kullanılarak uygulamanızın sürümleriyle birlikte satılacakları için, söz konusu eski derlemeleri etkileyebilecek değişiklikler yapılmadan bırakmalısınız.
Dönüşüm süreci, mevcut entegrasyonunuzda sorunlara neden olabilecek kazara yapılan değişiklikleri önlemek için Mayıs 2022'den önce kataloğunuzda bulunan abonelik ürünlerini salt okunur hale getirmiştir. Bu aboneliklerde değişiklik yapmak mümkündür ancak ön uç ve arka uç entegrasyonlarınızı etkileyebilecek değişiklikler olabilir:
Ön uçta, abonelik ürün ayrıntılarını almak için
querySkuDetailsAsync()
kullanan uygulama sürümleri yalnızca geriye dönük uyumlu temel planlar ve fırsatlar satabilir. Ayrıca geriye dönük uyumluluğa sahip yalnızca bir temel plan ve bunların bir kombinasyonu olabilir. Bu nedenle, dönüştürülen aboneliklere yeni planlar veya teklifler eklerseniz yeni ek temel planlar veya teklifler uygulamanızın bu eski sürümlerinde satılamaz.Arka uçta, dönüştürülmüş aboneliklerinizi Play Console kullanıcı arayüzünde düzenlerseniz uç noktayı bu amaçla çağırıyorsanız bunları
inappproducts
uç noktası ile yönetemezsiniz. Eski satın alma durumu uç noktası (purchases.subscriptions.get
) yalnızca geriye dönük uyumlu temel planları işlemek ve satın alma işlemleri gerçekleştirmek için gereken verileri döndürdüğünden, bu aboneliklerle ilgili satın alma işlemlerini yönetmek için yeni abonelik satın alma durumu uç noktasına (purchases.subscriptionsv2.get
) geçmeniz gerekir. Daha fazla bilgi için Abonelik satın alma durumunu yönetme bölümünü okuyun.
Arka uç abonelik kataloğunuzu yeni API ile yönetin
Abonelik ürün kataloğunuzu Google Play Developer API ile otomatik olarak yönetiyorsanız abonelikler, temel planlar ve teklifler oluşturup yönetmek için yeni abonelik ürün tanımı uç noktalarını kullanmanız gerekir. Bu sürümdeki ürün kataloğu API'sinde yapılan değişiklikler hakkında daha fazla bilgi edinmek için Mayıs 2022 abonelik özellikleri kılavuzunu okuyun.
Google Play Faturalandırma abonelikleri için otomatik bir ürün kataloğu yönetim modülünü taşımak isterseniz abonelik kataloğunuzu yönetmek ve yayınlamak için inappproducts
API'yi yeni Subscription Publishing API ile değiştirin. Üç yeni uç nokta mevcuttur:
- Abonelik ürünlerini yönetmek için
Monetization.subscriptions
. - Aboneliklerle ilgili temel planları yönetmek için
Monetization.basePlans
. - Temel plan tekliflerini yönetmek için
Monetization.offers
.
Bu yeni uç noktalar, kataloğunuzdaki tüm yeni özelliklerden yararlanmak için gerekli tüm işlevlere sahiptir: temel plan ve teklif etiketleri, bölgesel hedefleme, ön ödemeli planlar ve daha fazlası.
Tek seferlik satın alınan ürünlere ilişkin uygulama içi ürün kataloğunuzu yönetmek için yine inappproducts
API'sini kullanmanız gerekir.
Uygulamanızın kullanımdan kaldırılan yöntemleri (ör. querySkuDetailsAsync()
) kullanan sürümleri, geriye dönük uyumlu olmayan temel plan veya fırsatları satamaz. Eski sürümlerle uyumlu fırsatlar hakkında buradan bilgi edinebilirsiniz.
Google Play Faturalandırma Kitaplığı'nı güncelleme
Yeni abonelik ürünleri kataloğunuzu oluşturduktan sonra uygulamanızı Google Faturalandırma Kitaplığı 5'e taşıyabilirsiniz. Mevcut Play Faturalandırma Kitaplığı bağımlılığını, uygulamanızın build.gradle
dosyasının güncellenmiş sürümüyle değiştirin.
dependencies {
def billingVersion = "6.0.0"
implementation "com.android.billingclient:billing:$billingVersion"
}
Yöntem çağrılarında herhangi bir değişiklik yapmamış olsanız bile projenizin hemen oluşturulması gerekir. Play Faturalandırma Kitaplığı 6, geriye dönük uyumludur. SKU kavramı kullanımdan kaldırılmıştır ancak uygulama taşımayı daha basit, daha kademeli bir süreç haline getirmek için hâlâ mevcuttur.
Faturalandırma İstemcisini başlatma ve Google Play ile bağlantı kurma
Satın alma işlemlerini bir Android uygulamasından başlatmanın ilk adımları aynıdır:
Satın alınabilecek ürünleri gösterin
Kullanıcının satın almaya uygun olduğu tüm teklifleri almak için:
SkuDetailsParams
yerineQueryProductDetailsParams
kullanınBillingClient.querySkuDetailsAsync()
aramasınıBillingClient.queryProductDetailsAsync()
kullanacak şekilde değiştirin
Sorgu sonuçlarının artık SkuDetails
yerine ProductDetails
olduğunu unutmayın.
Her ProductDetails
öğe, ürünle ilgili bilgileri içerir (kimlik, başlık, tür vb.). Abonelik ürünleri için ProductDetails
, abonelik teklifi ayrıntılarının listesi olan bir List<ProductDetails.SubscriptionOfferDetails>
içerir. ProductDetails
, tek seferlik satın alınan ürünlerde ProductDetails.OneTimePurchaseOfferDetails
içerir. Bunlar, kullanıcılara hangi tekliflerin gösterileceğine karar vermek için kullanılabilir.
Aşağıdaki örnekte, uygulamanızın bu değişiklikler yapılmadan önce ve yapıldıktan sonra nasıl görünebileceği gösterilmektedir:
Önce
Kotlin
val skuList = ArrayList<String>() skuList.add("up_basic_sub") val params = SkuDetailsParams.newBuilder() params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS).build() billingClient.querySkuDetailsAsync(params) { billingResult, skuDetailsList -> // Process the result }
Java
List<String> skuList = new ArrayList<>(); skuList.add("up_basic_sub"); SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); params.setSkusList(skuList).setType(SkuType.SUBS).build(); billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) { // Process the result. } } );
Sonra
Kotlin
val productList = listOf( QueryProductDetailsParams.Product.newBuilder() .setProductId("up_basic_sub") .setProductType(BillingClient.ProductType.SUBS) .build() ) val params = QueryProductDetailsParams.newBuilder().setProductList(productList).build() billingClient.queryProductDetailsAsync(params) { billingResult, productDetailsList -> // Process the result }
Java
ImmutableList<Product> productList = ImmutableList.of(Product.newBuilder() .setProductId("up_basic_sub") .setProductType(ProductType.SUBS) .build()); QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder() .setProductList(productList) .build(); billingClient.queryProductDetailsAsync( params, new ProductDetailsResponseListener() { public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) { // Process the result } } );
queryProductDetailsAsync
için geri çağırma List<ProductDetails>
döndürür.
Her ProductDetails
öğe, ürünle ilgili bilgileri içerir (kimlik, başlık, tür vb.). Başlıca fark, abonelik ürünlerinde artık kullanıcının yararlanabileceği tüm teklifleri içeren bir List<ProductDetails.SubscriptionOfferDetails>
içermesidir.
Play Faturalandırma Kitaplığı'nın önceki sürümleri yeni nesneleri (abonelikler, temel planlar, fırsatlar vb.) desteklemediğinden yeni sistem, her abonelik SKU'sunu geriye dönük olarak uyumlu tek bir temel plana ve teklife dönüştürür. Tek seferlik satın alınan mevcut ürünler de bir ProductDetails
nesnesine aktarılır. Tek seferlik satın alınan bir ürünün teklif ayrıntılarına getOneTimePurchaseOfferDetails()
yöntemiyle erişilebilir.
Nadiren de olsa bazı cihazlar ProductDetails
ve queryProductDetailsAsync()
hizmetlerini destekleyemez. Bu durum, genellikle Google Play Hizmetleri'nin eski sürümlerinden kaynaklanır. Bu senaryoya yönelik doğru desteğin sağlanması amacıyla queryProductDetailsAsync
yöntemini çağırmadan önce PRODUCT_DETAILS
özelliği için isFeatureSupported()
numaralı telefonu arayın. Yanıt OK
ise cihaz bu özelliği destekliyor demektir ve queryProductDetailsAsync()
araması yaparak devam edebilirsiniz.
Yanıt FEATURE_NOT_SUPPORTED
ise bunun yerine querySkuDetailsAsync()
ile kullanılabilir geriye dönük uyumlu ürün listesini isteyebilirsiniz.
Geriye dönük uyumluluk özelliklerinin nasıl kullanılacağı hakkında daha fazla bilgi edinmek için Mayıs 2022 abonelik özellikleri kılavuzunu inceleyin.
Teklif satın alma akışını başlatın
Bir teklif için satın alma akışı başlatmak, SKU için akış başlatmaya çok benzer. Sürüm 6'yı kullanarak bir satın alma isteği başlatmak için aşağıdakileri yapın:
BillingFlowParams
içinSkuDetails
yerineProductDetailsParams
kullanın.- Teklif kimliği, temel plan kimliği ve daha fazlası gibi fırsat ayrıntıları
SubscriptionOfferDetails
nesnesi kullanılarak elde edilebilir.
Kullanıcının seçtiği teklifle bir ürün satın almak için seçilen teklife ait offerToken
değerini alın ve ProductDetailsParams
nesnesine iletin.
Bir BillingFlowParams
nesnesi oluşturduktan sonra, BillingClient
ile faturalandırma akışının başlatılması aynı kalır.
Aşağıdaki örnekte, uygulamanızın bu değişiklikler yapılmadan önce ve yapıldıktan sonra nasıl görünebileceği gösterilmektedir:
Önce
Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ... // Retrieve a value for "skuDetails" by calling querySkuDetailsAsync(). val billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(skuDetails) .build() val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; // Retrieve a value for "skuDetails" by calling querySkuDetailsAsync(). BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(skuDetails) .build(); BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Sonra
Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ...; val productDetailsParamsList = listOf( BillingFlowParams.ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // For One-time product, "setOfferToken" method shouldn't be called. // For subscriptions, to get the offer token corresponding to the selected // offer call productDetails.subscriptionOfferDetails?.get(selectedOfferIndex)?.offerToken .setOfferToken(selectedOfferToken) .build() ) val billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build() // Launch the billing flow val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // For one-time products, "setOfferToken" method shouldn't be called. // For subscriptions, to get the offer token corresponding to the selected // offer call productDetails.getSubscriptionOfferDetails().get(selectedOfferIndex).getOfferToken() .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
Satın alma işlemlerini işleme
Satın alma işlemlerinin Google Play Faturalandırma Kitaplığı 6 ile işlenmesi önceki sürümlerle aynıdır.
Kullanıcının sahip olduğu tüm etkin satın alma işlemlerini almak ve yeni satın alma işlemleri sorgulamak için aşağıdakileri yapın:
queryPurchasesAsync()
öğesine birBillingClient.SkuType
değeri iletmek yerine,BillingClient.ProductType
değeri içeren birQueryPurchasesParams
nesnesi iletin.
Aşağıdaki örnekte, uygulamanızın bu değişiklikler yapılmadan önce ve yapıldıktan sonra nasıl görünebileceği gösterilmektedir:
Önce
Kotlin
billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS) { billingResult, purchaseList -> { // Process the result } }
Java
billingClient.queryPurchasesAsync( BillingClient.SkuType.SUBS, new PurchasesResponseListener() { public void onQueryPurchasesResponse( BillingResult billingResult, List<Purchase> purchases) { // process the result } } );
Sonra
Kotlin
billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder() .setProductType(BillingClient.ProductType.SUBS) .build() ) { billingResult, purchaseList -> // Process the result }
Java
billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder().setProductType(ProductType.SUBS).build(), new PurchasesResponseListener() { public void onQueryPurchasesResponse( BillingResult billingResult, List<Purchase> purchases) { // Process the result } } );
Uygulama dışı satın alma işlemlerini ve bekleyen işlemleri yönetme adımları değişmemiştir.
Arka ucunuzdaki yeni API ile abonelik satın alma durumunu yönetin
Önceki adımlarda oluşturulan yeni ürünlerin satın alma işlemlerini yönetmeye hazır olmak için arka ucunuzda aboneliklerinizin satın alma durumu yönetimi bileşenini taşımanız gerekir. Mevcut abonelik satın alma durumu yönetimi bileşeniniz, Mayıs 2022'nin kullanıma sunulmasından önce tanımladığınız dönüştürülmüş abonelik ürünlerinde her zamanki gibi çalışmalı ve geriye dönük uyumlu tekliflerin satın alma işlemlerini yönetmek için yeterli olmalıdır ancak yeni işlevlerin hiçbirini desteklemez.
Aboneliklerinizin satın alma durumu yönetimi modülü için yeni Subscription Purchases API'yi uygulamanız gerekir. Bu modül, satın alma durumunu kontrol eder ve arka ucunuzda Play Faturalandırma abonelik yararlanma haklarını yönetir. API'nin eski sürümü, yeni platformda satın alma işlemlerini yönetmek için gerekli tüm ayrıntıları döndürmez. Önceki sürümlerde yapılan değişiklikler hakkında ayrıntılı bilgi için Mayıs 2022'deki yeni abonelik özellikleri kılavuzunu inceleyin.
Normalde, abonelik durumuyla ilgili en son bilgileri almak için her SubscriptionNotification
Gerçek Zamanlı Geliştirici Bildirimi aldığınızda Subscription Purchases API'yi çağırırsınız. purchases.subscriptions.get
çağrılarınızı Subscription Purchases API'nin yeni sürümüyle (purchases.subscriptionsv2.get
) değiştirmeniz gerekiyor.
Yeni modelde aboneliklerden yararlanma hakkını yönetmek için yeterli bilgi sağlayan SubscriptionPurchaseV2
adlı yeni bir kaynak var.
Bu yeni uç nokta, ürünlerinizi satan uygulamanın sürümüne ve ürünün tanımlandığı zamana (Mayıs 2022 sürümünden önce veya sonra) bağımsız olarak tüm abonelik ürünlerinizin ve tüm satın alma işlemlerinizin durumunu döndürür. Bu nedenle, taşıma işleminden sonra yalnızca abonelik satın alma durumu yönetimi modülünüzün bu sürümüne ihtiyacınız olacaktır.
Kullanıcının abonelik satın alma işlemlerini değiştirme
Play Faturalandırma Kitaplığı 5 ve önceki sürümlerde ProrationMode
, kullanıcıların abonelik satın alma işlemlerinde yükseltme veya düşürme gibi değişiklikleri uygulamak için kullanılıyordu. Bu özellik kullanımdan kaldırıldı ve sürüm 6'da ReplacementMode
ile değiştirildi.
Abonelik fiyat değişikliklerini işleme
Daha önce kullanımdan kaldırılan launchPriceConfirmationFlow
API, Play Faturalandırma Kitaplığı 6'dan kaldırılmıştır. Alternatifler için fiyat değişiklikleri kılavuzuna bakın.
Play Faturalandırma Kitaplığı hatalarını işleme
Play Faturalandırma Kitaplığı 6'ya, kullanıcının cihazı ile Google Play sistemi arasındaki ağ bağlantısıyla ilgili sorunları belirtmek için yeni bir NETWORK_ERROR
kodu eklenmiştir. SERVICE_TIMEOUT
ve SERVICE_UNAVAILABLE
kodlarında da değişiklik yapıldı. Daha fazla bilgi için BillingResult yanıt kodlarını işleme bölümüne bakın.
Bekleyen işlemleri ele alma
Play Faturalandırma Kitaplığı, 6.0.0 sürümünden itibaren bekleyen satın alma işlemleri için sipariş kimliği oluşturmamaktadır. Bu satın alma işlemlerinde sipariş kimliği, satın alma işlemi PURCHASED
durumuna taşındıktan sonra doldurulur. Entegrasyonunuzun yalnızca bir işlem tamamen tamamlandıktan sonra sipariş kimliği beklediğinden emin olun. Kayıtlarınız için satın alma jetonunu kullanmaya devam edebilirsiniz. Bekleyen satın alma işlemlerini yönetme hakkında daha fazla bilgi için Play Faturalandırma Kitaplığı entegrasyon kılavuzuna ve satın alma yaşam döngüsü yönetim kılavuzuna bakın.