Sürüm 4 veya 5'ten Google Play Faturalandırma Kitaplığı 6'ya geçiş

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:

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 yerine QueryProductDetailsParams kullanın
  • BillingClient.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çin SkuDetails yerine ProductDetailsParams 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 = ...
// Retrieve a value for "productDetails" by calling queryProductDetailsAsync()
// Get the offerToken of the selected offer
val offerToken = productDetails.subscriptionOfferDetails?.get(selectedOfferIndex)?.offerToken

val productDetailsParamsList =
    listOf(
        BillingFlowParams.ProductDetailsParams.newBuilder()
            .setProductDetails(productDetails)
            .setOfferToken(offerToken)
            .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 = ...;

// Retrieve a value for "productDetails" by calling queryProductDetailsAsync()
// Get the offerToken of the selected offer
String offerToken = productDetails
                     .getSubscriptionOfferDetails()
                     .get(selectedOfferIndex)
                     .getOfferToken();
// Set the parameters for the offer that will be presented
// in the billing flow creating separate productDetailsParamsList variable
ImmutableList<ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
                 ProductDetailsParams.newBuilder()
                     .setProductDetails(productDetails)
                     .setOfferToken(offerToken)
                     .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 bir BillingClient.SkuType değeri iletmek yerine, BillingClient.ProductType değeri içeren bir QueryPurchasesParams 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.