Google Play Faturalandırma ile abonelik değiştirme işlemlerini uygulama

1. Giriş

Bu codelab'de, abonelik planı değişikliklerini yönetmek için Google Play Faturalandırma Kitaplığı'nı (PBL) kullanmayı öğreneceksiniz. Arka uçtaki Gerçek Zamanlı Geliştirici Bildirimlerini (RTDN'ler) işlemeyi öğrenirken çeşitli değiştirme modlarının fiyatlandırmayı ve kullanıcı haklarını nasıl etkilediğini keşfedeceksiniz.

Kitle

Android uygulama geliştiriciler için tasarlanan bu codelab, gelişmiş abonelik yönetimi özelliklerini uygulama konusunda rehberlik sağlar. Bu kılavuz, kullanıcılara farklı abonelik planları arasında geçiş yapma, planlarını yükseltme veya düşürme konusunda sorunsuz bir deneyim sunmanıza yardımcı olur.

Öğrenecekleriniz...

  • Play Developer Console'da abonelik oluşturma
  • Uygulamanızın yükseltme ve eski sürüme dönme politikalarına uygun doğru ReplacementMode (ör. WITH_TIME_PRORATION ve DEFERRED) nasıl seçilir?
  • Plan değişikliği için Google Play satın alma sürecini tetiklemek üzere launchBillingFlow içinde BillingFlowParams nasıl yapılandırılır?
  • Arka uçta eski erişimi güvenli bir şekilde iptal etmek ve yeni erişim izni vermek için gerçek zamanlı geliştirici bildirimlerini (RTDN) ve purchases.subscriptionsv2 API'yi kullanma

Gerekenler

2. Örnek uygulamayı oluşturma

Bu codelab'de, PBL'de abonelik değiştirme işlemlerinin nasıl uygulanacağını göstermek için örnek bir Android uygulaması kullanılır. Örnek uygulama, aşağıdaki yönleri gösteren tam kaynak koduna sahip, tamamen işlevsel bir Android uygulaması olarak tasarlanmıştır:

  • Uygulamayı PBL ile entegre etme
  • Abonelik değişikliklerini uygulama

Abonelik değiştirme ve PBL hakkında bilginiz varsa örnek uygulamayı indirip inceleyebilirsiniz.

Aşağıdaki demo videosunda, örnek uygulamanın dağıtılıp çalıştırıldıktan sonra nasıl görüneceği ve davranacağı gösterilmektedir.

Ön koşullar

Örnek uygulamayı oluşturup dağıtmadan önce aşağıdakileri yapın:

Derleme

Codelab'i takip etmek için örnek uygulamayı gerektiği gibi oluşturmak üzere:

  1. GitHub'dan örnek uygulamayı indirin.
  2. Örnek uygulamanın build.gradle içindeki applicationId değerini, Play Console'daki uygulamanızın uygulama kimliğini yansıtacak şekilde güncelleyin.
  3. Örnek uygulamayı oluşturun.
    Not: Bu işlem, uygulamayı yerel test için başarıyla oluşturur. Ancak, gerekli abonelikler Play Console'da henüz oluşturulmadığı için uygulamayı çalıştırmak ürünleri ve fiyatları getirmez. Bir sonraki bölümde, Developer Console'da abonelik oluşturma konusu ele alınacaktır.

3. Play Console'da abonelik oluşturma

Google Play abonelik sistemi; abonelik oluşturma, yönetme ve satma konularında esneklik sağlar. Play Console'da, her biri birden fazla fırsat içeren birden fazla temel planlı abonelikler yapılandırabilirsiniz. Abonelik fırsatları için farklı fiyatlandırma modelleri ve uygunluk seçenekleri geçerli olabilir. Bu codelab'de, çeşitli fiyat noktalarında tipik bir abonelik teklifini simüle eden üç abonelik oluşturacaksınız: Premium Plan, Basic Plan ve Lite Plan. Her birinde tek bir aylık yinelenen temel plan bulunur.

Yeni abonelik oluşturun

Yeni abonelik oluşturmak için

  1. Play Console'u açıp Abonelikler sayfasına (Google Play ile para kazanın > Ürünler > Abonelikler) gidin.
  2. Abonelik oluştur'u tıklayın.
  3. Abonelik ayrıntılarınızı girin:
    • ProductID (Ürün Kimliği): Benzersiz bir ürün kimliği girin. premium_plan yazın.
    • Ad : Abonelik için kısa bir ad girin. Örnek: Premium Plan.
  4. Oluştur'u tıklayın.

Base Plan'ı oluşturma

  1. Play Console'u açıp Abonelikler sayfasına (Google Play ile para kazanın > Ürünler > Abonelikler) gidin.
  2. Temel plan oluşturmak istediğiniz aboneliğin yanındaki sağ oku tıklayarak abonelik ayrıntılarını görüntüleyin.
  3. Temel plan ekle'yi tıklayın.
  4. Temel plan kimliği girin. Örnek monthly-auto-renewing.
  5. Tür olarak Otomatik yenileme'yi seçin.
  6. Otomatik yenilenen temel plan için aşağıdakileri ayarlayın:
    • Fatura dönemi: Aylık.
    • Ek süre: 7 gün.
    • Faturalandırma planı ve teklif değişiklikleri: Faturalandırma tarihinde ödeme alınır.
    • Yeniden abone olma: İzin ver'i seçin.
  7. Fiyat ve stok durumu bölümünde, temel planın fiyatını belirlemek için Fiyatları belirle'yi tıklayın.
  8. Tüm ülkeleri ve bölgeleri seçip Fiyat belirle'yi tıklayın.
  9. Bu temel planın fiyatını 10 ABD doları olarak ayarlayın ve Güncelle'yi tıklayın.
  10. Temel planın fiyatı belirlendikten sonra sağ altta Kaydet'i ve ardından Etkinleştir'i tıklayın.

Örnek uygulama için abonelik oluşturma

Bu codelab'in amacı doğrultusunda, aşağıdaki yapılandırmaya sahip iki ek abonelik oluşturun:

  • Temel Plan
    • Ürün kimliği: basic_plan
    • Ad: Basic Plan
    • Temel plan kimliği: monthly-auto-renewing
    • Fiyat: 5 ABD doları
  • Lite Planı
    • Ürün kimliği: lite_plan
    • Ad: Lite Planı
    • Temel plan kimliği: monthly-auto-renewing
    • Fiyat: 3 ABD doları

Örnek uygulama, bu ürün kimliklerini ve temel plan kimliklerini kullanacak şekilde yapılandırılmıştır. Farklı yapılandırmalara sahip farklı abonelikler oluşturabilirsiniz. Bu durumda, oluşturduğunuz ürün kimliğini kullanmak için örnek uygulamayı değiştirmeniz gerekir.

Abonelik oluşturma videosu

Aşağıdaki videoda, Play Console'da abonelik oluşturmak için daha önce açıklanan adımlar gösterilmektedir.

4. Abonelik Değişiklikleri

PBL ile entegrasyon yapan geliştiriciler, mevcut abonelerine abonelik planlarını ihtiyaçlarına daha uygun şekilde değiştirmeleri için çeşitli seçenekler sunabilir:

  • Temel ve premium abonelikler gibi birden fazla abonelik katmanı satıyorsanız kullanıcıların farklı bir aboneliğin temel planını veya teklifini satın alarak katman değiştirmesine izin verebilirsiniz.
  • Kullanıcıların mevcut fatura dönemlerini değiştirmelerine (ör. aylık plandan yıllık plana geçme) izin verebilirsiniz.
  • Kullanıcıların otomatik yenilenen ve ön ödemeli planlar arasında geçiş yapmasına da izin verebilirsiniz.

Kullanıcılar aboneliklerini yükseltmeye, düşürmeye veya değiştirmeye karar verdiğinde, mevcut faturalandırma döneminin orantılı değerinin nasıl uygulanacağını ve kullanıcılar için hak değişikliğinin ne zaman gerçekleşeceğini belirleyen bir değiştirme modu belirtirsiniz.

Play Faturalandırma Kitaplığı, bu davranışı kontrol etmek için çeşitli ReplacementMode seçenekleri sunar.

Kullanılabilir değiştirme modları

  • WITH_TIME_PRORATION: Abonelik öğesi hemen yükseltilir veya düşürülür. Kalan süre, fiyat farkına göre ayarlanır ve bir sonraki fatura tarihi güncellenerek yeni aboneliğe aktarılır. Bu, varsayılan davranıştır.
  • CHARGE_PRORATED_PRICE: Abonelik öğesi hemen yükseltilir ve faturalandırma dönemi aynı kalır. Kalan süre için fiyat farkı kullanıcıdan tahsil edilir.
  • CHARGE_FULL_PRICE: Abonelik öğesi hemen yükseltilir veya düşürülür ve kullanıcıdan bu yeni hak için hemen tam fiyat alınır. Önceki abonelikten kalan değer, aynı hak için devredilir veya farklı bir hakka geçiş yapıldığında zamanla orantılı olarak hesaplanır.
  • WITHOUT_PRORATION: Abonelik öğesi hemen yükseltilir veya düşürülür ve abonelik yenilendiğinde yeni fiyat üzerinden ücret alınır. Faturalandırma dönemi aynı kalır.
  • DEFERRED: Abonelik öğesi yalnızca abonelik yenilendiğinde yükseltilir veya düşürülür.

5. WITH_TIME_PRORATION

Bu değiştirme modunda, abonelik öğesi hemen yükseltilir veya düşürülür. Kalan süre, fiyat farkına göre ayarlanır ve bir sonraki fatura tarihi ileriye alınarak yeni aboneliğe aktarılır. Bu, varsayılan davranıştır.

Örnek senaryo

Bir kullanıcı, aylık faturalandırma döneminin ortasında, 15 Nisan'da Basic planından (aylık 4,99 ABD doları) Premium planına (aylık 9,99 ABD doları) geçiş yapıyor.

Bu senaryoda:

  • Kullanıcı, Premium plana hemen erişebilir.
  • Google Play, orantılı ödeme dönemini otomatik olarak hesaplar. Örneğin, Play Basic planın kalan 15 gününün Premium planın 7 gününe eşdeğer olduğunu hesaplarsa bir sonraki fatura tarihi 21 Nisan'a alınır.
  • Kullanıcının hemen ödeme yapması gerekmez.

Kod snippet'i

// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATION;

SubscriptionProductReplacementParams subscriptionProductReplacementParams =
    SubscriptionProductReplacementParams.newBuilder()
        .setOldProductId(oldProductId)
        .setReplacementMode(replacementMode)
        .build();

ProductDetailsParams productDetailsParams =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails)
        .setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
        .setOfferToken(offerToken)
        .build();

List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .setSubscriptionUpdateParams(
            SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
        .build();

billingClient.launchBillingFlow(activity, billingFlowParams);

WITH_TIME_PRORATION ile yükseltme

Bu senaryoyu simüle etmek için:

  • Örnek uygulamanın MainActivity bölümünde, kod snippet'indeki replacementMode değerini SubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATION olarak güncelleyin.
  • Uygulamayı yeniden oluşturup başlatın.
  • Google Play Store'daki mevcut abonelikleri (varsa) iptal edin ve aboneliklerin süresinin dolmasını bekleyin.
  • Basic planını satın alın.
  • Premium planına geçin.

Kullanıcının hakkı hemen Premium plana yükseltilir. Kullanıcının hemen ödemesi gereken tutar 0,00 ABD dolarıdır. Basic planının kalan değeri, Premium planının süresine orantılı olarak yansıtılır. Bu işlem, bir sonraki yenileme tarihini öne çeker. Kullanıcıdan, yeni düzenlenmiş fatura tarihinde 9,99 ABD doları tutarındaki yenileme ücreti alınır.

WITH_TIME_PRORATION ile alt sürüme geçme

Bu senaryoyu simüle etmek için:

  • Örnek uygulamanın MainActivity bölümünde, kod snippet'indeki replacementMode değerini SubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATION olarak güncelleyin.
  • Uygulamayı yeniden oluşturup başlatın.
  • Google Play Store'daki mevcut abonelikleri (varsa) iptal edin ve aboneliklerin süresinin dolmasını bekleyin.
  • Basic planını satın alın.
  • Lite planına geçin.

Kullanıcının yetkisi hemen Lite planına düşürülür. Hemen ödenecek tutar 0,00 ABD dolarıdır. Basic planının kalan değeri, Lite planının süresine orantılı olarak eklenir. Bu sayede, bir sonraki yenileme tarihi önemli ölçüde uzar. Kullanıcıdan, yeni düzenlenmiş fatura tarihinde 2,99 ABD doları tutarındaki yenileme ücreti alınır.

Sonuç

Bu bölümde, WITH_TIME_PRORATION'nın, fiyat farkına göre bir sonraki yenilemeye kadar olan süreyi ayarlayarak kullanıcı haklarını nasıl değiştirdiğini ve bu değişikliklerin nasıl hemen ücretlendirilmediğini öğrendiniz. Kullanıcıları yükseltmek veya düşürmek için etkili bir varsayılan stratejidir.

6. CHARGE_PRORATED_PRICE

Bu değiştirme modunda, abonelik öğesi hemen yükseltilir ve faturalandırma dönemi aynı kalır. Kalan süre için fiyat farkı kullanıcıdan tahsil edilir.

Not: Bu seçenek yalnızca bir abonelik öğesinin, birim zaman başına fiyatın arttığı bir üst sürüme yükseltilmesi durumunda kullanılabilir.

Örnek senaryo

Basic planı (aylık 4,99 ABD doları) kullanan bir kullanıcı, aylık faturalandırma döneminin bitimine yaklaşık 10 gün kala 20 Nisan'da Premium plana (aylık 9,99 ABD doları) yükseltmeye karar veriyor.

Bu senaryoda:

  • Kullanıcı, Premium plana hemen erişebilir.
  • Kullanıcıdan, geçerli faturalandırma döneminin kalan 10 günü için hemen kullanımla orantılı fark ücreti alınır. Bu tutar yaklaşık 2, 99 ABD dolarıdır ve 10 günlük Premium planını temsil eder.
  • Kullanıcının fatura tarihi değişmez.

Kod snippet'i

// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICE;

SubscriptionProductReplacementParams subscriptionProductReplacementParams =
    SubscriptionProductReplacementParams.newBuilder()
        .setOldProductId(oldProductId)
        .setReplacementMode(replacementMode)
        .build();

ProductDetailsParams productDetailsParams =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails)
        .setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
        .setOfferToken(offerToken)
        .build();

List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .setSubscriptionUpdateParams(
            SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
        .build();

billingClient.launchBillingFlow(activity, billingFlowParams);

CHARGE_PRORATED_PRICE ile yükseltme

Bu senaryoyu simüle etmek için:

  • Örnek uygulamanın MainActivity bölümünde, kod snippet'indeki replacementMode değerini SubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICE olarak güncelleyin.
  • Uygulamayı yeniden oluşturup başlatın.
  • Google Play Store'daki mevcut abonelikleri (varsa) iptal edin ve aboneliklerin süresinin dolmasını bekleyin.
  • Basic planını satın alın.
  • Premium planına geçin.

Kullanıcı, orijinal yenileme tarihi korunarak hemen Premium planına yükseltilir. Anında ödenmesi gereken tutar, mevcut dönemin kalan günleri için Premium ve Basic plan fiyatları arasındaki orantılı farktır. Yenileme tarihinde kullanıcıdan 9, 99 ABD doları tutarındaki tam Premium yenileme ücreti alınır.

CHARGE_PRORATED_PRICE ile alt sürüme geçme

Bu senaryoyu simüle etmek için:

  • Örnek uygulamanın MainActivity bölümünde, kod snippet'indeki replacementMode değerini SubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICE olarak güncelleyin.
  • Uygulamayı yeniden oluşturup başlatın.
  • Google Play Store'daki mevcut abonelikleri (varsa) iptal edin ve aboneliklerin süresinin dolmasını bekleyin.
  • Basic planını satın alın.
  • Lite planına geçin.

Bu değiştirme modu, yalnızca birim zaman başına fiyatın arttığı abonelik öğesi yükseltmeleri için kullanılabilir olduğundan sürüm düşürme sırasında hataya neden olur. Faturalandırma akışı başarısız olur ve kullanıcıya, fiyatı düşürme işlemlerinde orantılı ödeme modunun desteklenmediğini belirten bir hata gösterilir.

Sonuç

Bu bölümde, CHARGE_PRORATED_PRICE özelliğinin, faturalandırma döngüsünü değiştirmeden kullanıcıları kalan fatura dönemi için tam fiyat farkını tahsil ederek anında yükseltmeye nasıl olanak tanıdığı açıklanmıştır. Bu özellik, kullanıcıların fatura tarihlerini değiştirmeden daha pahalı bir katmana yükseltmek istedikleri durumlarda kullanışlıdır.

7. CHARGE_FULL_PRICE

Bu değiştirme modunda, abonelik öğesi hemen yükseltilir veya düşürülür ve kullanıcıdan yeni hak için hemen tam fiyat alınır. Önceki abonelikten kalan değer, aynı hak için devredilir veya farklı bir hakka geçiş yapıldığında zamanla orantılı olarak hesaplanır.

Örnek senaryo

Kullanıcı, 1 Nisan'dan itibaren aylık 4,99 ABD doları olan Basic planını kullanıyor. Kullanıcı, 20 Nisan'da Premium plana (aylık 9,99 ABD doları) geçmek istiyor.

Bu senaryoda:

  • Kullanıcıdan Premium planın tam fiyatı (9,99 ABD doları) hemen alınır.
  • Basic planındaki kalan değer (ör. 10 günlük değer), Premium planı için eşdeğer süreye dönüştürülür. Bu örnekte, 10 günlük Basic, 5 günlük Premium'a eşittir.
  • Kullanıcının bir sonraki yenileme tarihi, bu orantılı süreyi içerecek şekilde ayarlanır. Bu nedenle, yenileme tarihi 25 Mayıs olur (20 Nisan + 1 ay + 5 gün).
  • Sonraki yenilemeler, 25 Mayıs'tan itibaren aylık olarak yapılır.

Kod snippet'i

// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICE;

SubscriptionProductReplacementParams subscriptionProductReplacementParams =
    SubscriptionProductReplacementParams.newBuilder()
        .setOldProductId(oldProductId)
        .setReplacementMode(replacementMode)
        .build();

ProductDetailsParams productDetailsParams =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails)
        .setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
        .setOfferToken(offerToken)
        .build();

List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .setSubscriptionUpdateParams(
            SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
        .build();

billingClient.launchBillingFlow(activity, billingFlowParams);

CHARGE_FULL_PRICE ile yükseltme

Bu senaryoyu simüle etmek için:

  • Örnek uygulamanın MainActivity bölümünde, kod snippet'indeki replacementMode değerini SubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICE olarak güncelleyin.
  • Uygulamayı yeniden oluşturup başlatın.
  • Google Play Store'daki mevcut abonelikleri (varsa) iptal edin ve aboneliklerin süresinin dolmasını bekleyin.
  • Basic planını satın alın.
  • Premium planına geçin.

Kullanıcı hemen Premium planına yükseltilir. Hemen ödenmesi gereken tutar, Premium planın tam fiyatı olan 9,99 ABD dolarıdır. Basic planından kalan değer, yeni Premium planında süreye dönüştürülür ve ilk yenileme tarihi biraz uzatılır. Yenileme tutarı, bu tarihten sonra dönem başına 9,99 ABD doları olur.

CHARGE_FULL_PRICE ile sürümü düşürme

Bu senaryoyu simüle etmek için:

  • Örnek uygulamanın MainActivity bölümünde, kod snippet'indeki replacementMode değerini SubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICE olarak güncelleyin.
  • Uygulamayı yeniden oluşturup başlatın.
  • Google Play Store'daki mevcut abonelikleri (varsa) iptal edin ve aboneliklerin süresinin dolmasını bekleyin.
  • Basic planını satın alın.
  • Lite planına geçin.

Kullanıcı hemen Lite planına geçirilir ve yeni bir faturalandırma dönemi başlatılır. Hemen ödenecek tutar, 2,99 ABD doları olan tam hedef fiyattır. Basic planının kullanılmayan kısmı, yeni Lite planının süresine orantılı olarak eklenir ve ilk yenileme tarihi uzatılır. Bu tarihten sonra yenileme tutarı, döngü başına 2,99 ABD doları olacaktır.

Sonuç

Bu bölümde, CHARGE_FULL_PRICE'nın geçiş gününde kullanıcıdan tam ödeme alarak yeni bir faturalandırma döngüsünü hemen başlattığı açıklanmıştır. Önceki plandan kalan bakiye, bir sonraki yenileme tarihine kadar eşit olarak uygulanır.

8. WITHOUT_PRORATION

Bu değiştirme modunda, abonelik öğesi hemen yükseltilir veya düşürülür ve abonelik yenilendiğinde yeni fiyat üzerinden ödeme alınır.

Örnek senaryo

Kullanıcı, 1 Nisan'dan itibaren aylık 4,99 ABD doları olan Basic planını kullanıyor. Kullanıcı, 20 Nisan'da Premium plana (aylık 9,99 ABD doları) geçmek istiyor.

Bu senaryoda:

  • Kullanıcı, Premium plana hemen erişebilir.
  • Kullanıcı, bir sonraki abonelik yenileme tarihine (1 Mayıs) kadar daha yüksek olan 9,99 ABD doları tutarındaki ücreti ödemek zorunda değildir.

Kod snippet'i

// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATION;

SubscriptionProductReplacementParams subscriptionProductReplacementParams =
    SubscriptionProductReplacementParams.newBuilder()
        .setOldProductId(oldProductId)
        .setReplacementMode(replacementMode)
        .build();

ProductDetailsParams productDetailsParams =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails)
        .setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
        .setOfferToken(offerToken)
        .build();

List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .setSubscriptionUpdateParams(
            SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
        .build();

billingClient.launchBillingFlow(activity, billingFlowParams);

WITHOUT_PRORATION ile yükseltme

Bu senaryoyu simüle etmek için:

  • Örnek uygulamanın MainActivity bölümünde, kod snippet'indeki replacementMode değerini SubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATION olarak güncelleyin.
  • Uygulamayı yeniden oluşturup başlatın.
  • Google Play Store'daki mevcut abonelikleri (varsa) iptal edin ve aboneliklerin süresinin dolmasını bekleyin.
  • Basic planını satın alın.
  • Premium planına geçin.

Kullanıcı, mevcut yenileme tarihini koruyarak hemen Premium planına yükseltilir. Hemen ödenecek tutar 0,00 ABD dolarıdır. Kullanıcı, bir sonraki fatura tarihinde yeni yenileme tutarı olan 9,99 ABD dolarına geçmeden önce, söz konusu dönemde kalan süre boyunca Premium planına erişebilir.

WITHOUT_PRORATION ile alt sürüme geçme

Bu senaryoyu simüle etmek için:

  • Örnek uygulamanın MainActivity bölümünde, kod snippet'indeki replacementMode değerini SubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATION olarak güncelleyin.
  • Uygulamayı yeniden oluşturup başlatın.
  • Google Play Store'daki mevcut abonelikleri (varsa) iptal edin ve aboneliklerin süresinin dolmasını bekleyin.
  • Basic planını satın alın.
  • Lite planına geçin.

Kullanıcı, Lite planına hemen düşürülür ve ödeme yaptığı Basic özelliklerini kaybeder. Hemen ödenecek tutar 0,00 ABD dolarıdır. Faturalandırma dönemi değiştirilmeden devam eder ve kullanıcı, bir sonraki planlanan yenileme tarihinde yeni ve daha düşük olan 2, 99 ABD doları tutarındaki ücreti öder.

Sonuç

Bu bölümde, WITHOUT_PRORATION'nın, faturalandırma dönemine dokunmadan kullanıcının haklarını ödeme ücreti almadan nasıl anında değiştirdiği gösterilmiştir.

9. ERTELENDİ

Bu değiştirme modunda, abonelik öğesi yalnızca abonelik yenilendiğinde yükseltilir veya düşürülür ancak yeni satın alma işlemi hemen gerçekleştirilir. Mevcut öğe yenilenemez olarak ayarlanır ve geçerli faturalandırma döneminin sonunda sona erer. Yeni istenen hak ise hemen ardından başlar.

Örnek senaryo

Kullanıcı, 1 Nisan'dan itibaren aylık 4,99 ABD doları olan Basic planını kullanıyor. Kullanıcı, 20 Nisan'da Premium plana (aylık 9,99 ABD doları) geçmek istiyor.

Bu senaryoda:

  • Kullanıcıdan hemen ödeme alınmaz.
  • Kullanıcı, geçerli faturalandırma döneminin sonuna (30 Nisan) kadar Basic özelliklerini almaya devam eder.
  • Abonelik planı, bir sonraki yenileme tarihinde (1 Mayıs) otomatik olarak Premium'a yükseltilir.

Kod snippet'i

// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.DEFERRED;

SubscriptionProductReplacementParams subscriptionProductReplacementParams =
    SubscriptionProductReplacementParams.newBuilder()
        .setOldProductId(oldProductId)
        .setReplacementMode(replacementMode)
        .build();

ProductDetailsParams productDetailsParams =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails)
        .setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
        .setOfferToken(offerToken)
        .build();

List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .setSubscriptionUpdateParams(
            SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
        .build();

billingClient.launchBillingFlow(activity, billingFlowParams);

DEFERRED ile yükseltme

Bu senaryoyu simüle etmek için:

  • Örnek uygulamanın MainActivity bölümünde, kod snippet'indeki replacementMode değerini SubscriptionProductReplacementParams.ReplacementMode.DEFERRED olarak güncelleyin.
  • Uygulamayı yeniden oluşturup başlatın.
  • Google Play Store'daki mevcut abonelikleri (varsa) iptal edin ve aboneliklerin süresinin dolmasını bekleyin.
  • Basic planını satın alın.
  • Premium planına geçin.

Kullanıcı, mevcut faturalandırma döneminin sonuna kadar Basic planında kalır. Hemen ödenecek tutar 0,00 ABD dolarıdır. Yenileme tarihinde, hakları Premium plana yükseltilir ve 9,99 ABD doları tutarındaki yeni yenileme ücreti alınır.

DEFERRED ile eski sürüme geçme

Bu senaryoyu simüle etmek için:

  • Örnek uygulamanın MainActivity bölümünde, kod snippet'indeki replacementMode değerini SubscriptionProductReplacementParams.ReplacementMode.DEFERRED olarak güncelleyin.
  • Uygulamayı yeniden oluşturup başlatın.
  • Google Play Store'daki mevcut abonelikleri (varsa) iptal edin ve aboneliklerin süresinin dolmasını bekleyin.
  • Basic planını satın alın.
  • Lite planına geçin.

Kullanıcı, mevcut faturalandırma döneminin sonuna kadar Basic planında kalır. Hemen ödenecek tutar 0,00 ABD dolarıdır. Yenileme tarihinde, hakları Lite planına yükseltilir ve 2,99 ABD doları tutarındaki yeni yenileme ücreti alınır.

Sonuç

Bu bölümde, DEFERRED değiştirme modunun, etkin bir kullanıcının ücretli süresinin sonuna kadar yükseltme veya düşürme işlemlerini nasıl ertelediği açıklanmıştır. Bu nedenle, satın alınmış özellikleri kaybetmemek için sürüm düşürme işlemlerinde özellikle idealdir.

10. Arka uç ve istemci tarafı işleme

Kullanıcı başarılı bir abonelik değişikliği başlattıktan sonra, hizmet kesintisi veya iki kez faturalandırma gibi sorunları önlemek için hem uygulamanızın hem de arka ucunuzun değişikliği doğru şekilde işlediğinden emin olun.

Örnek Senaryo

  • Kullanıcının Basic aylık planı (product_id basic_plan ve purchase_token basic_purchase_token_123) var.
  • Kullanıcı, anında değiştirme modunu (WITHOUT_PRORATION, WITH_TIME_PRORATION, CHARGE_PRORATED_PRICE, CHARGE_FULL_PRICE) kullanarak Premium plana geçerse
  • Abonelik geçişi başarılı olduğunda Google, bu geçişi YENİ bir abonelik olarak değerlendirir ve Premium plan için yeni ve farklı bir satın alma jetonu oluşturur (product_id premium_plan ve purchase_token premium_purchase_token_123).

İstemci tarafı işleme

onPurchasesUpdated

Değiştirme satın alma işlemi tamamlandığında PurchasesUpdatedListener tetiklenir. Bu işlem bir geçiş olsa da Google Play, Premium planını yepyeni bir satın alma olarak değerlendirir.

Uygulama, Purchase satın alma jetonu ve product_id premium_plan içeren bir premium_purchase_token_123 nesnesi alır. Bu durumu tam olarak yeni bir abone gibi değerlendirmeniz gerekir: Jetonu doğrulayın ve erişim izni vermeye hazırlanın.

@Override
public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) {
        for (Purchase purchase : purchases) {
            // purchase.getPurchaseToken() = premium_purchase_token_123
            // purchase.getProducts() will contain premium_plan
            // Verify the purchase and grant entitlement
            handleNewPurchase(purchase);
        }
    }
}

queryPurchasesAsync

queryPurchasesAsync yalnızca uygulamanızdan satın alınan etkin abonelikleri döndürür. Kullanıcıya hangi hakkın gösterileceğini belirlemek için bu yöntemi kullanmanız gerekir. Anında değiştirme işlemlerinde queryPurchasesAsync() eski BASIC satın alma jetonunu döndürmeyi durduracak ve artık yalnızca yeni PREMIUM satın alma jetonunu döndürecektir.

Uygulamanız her devam ettirildiğinde veya bir satın alma işlemi tamamlandığında bu yöntemi çağırın. Premium jetonu varsa Premium özellikleri hemen etkinleştirin ve Temel özellikleri kaldırın.

Arka uç işleme (RTDN)

Bir değiştirme işlemi gerçekleştiğinde Google Play, yapılandırılmış Pub/Sub konunuza Gerçek Zamanlı Geliştirici Bildirimi (RTDN) gönderir.

  • Anında değişim durumunda Google, yeni satın alma jetonunu içeren bir SUBSCRIPTION_PURCHASED RTDN gönderir.Örnek RTDN yükü
    {
      "version":"1.0",
      "packageName":"com.google.play.billing.samples.subscriptions",
      "eventTimeMillis":"...",
      "subscriptionNotification":
      {
        "version":"1.0",
        "notificationType":4, // SUBSCRIPTION_PURCHASED
        "purchaseToken":"premium_purchase_token_123" //purchase token for the new subscription
      }
    }
    
  • Sunucunuz RTDN'den yeni satın alma jetonunu aldığında, satın alma ayrıntılarını getirmek için yeni satın alma jetonuyla purchases.subscriptionsV2 API'sini çağırın. API yanıtı, satın alma jetonunun yeni bir abonelik satın alma işlemine mi yoksa abonelik değişikliğine mi karşılık geldiğini belirlemek için kullanılan bir linkedPurchaseToken alanı içerir.
  • Abonelik değiştirme durumunda linkedPurchaseToken, eski aboneliğin satın alma jetonunu ifade eder. Bu senaryoda basic_purchase_token_123 olur.Örnek GET purchases.subscriptionsV2 yanıt
    curl \
    'https://androidpublisher.googleapis.com/androidpublisher/v3/applications/<application_id>/purchases/subscriptionsv2/tokens/premium_purchase_token_123' \
    --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
    --header 'Accept: application/json'
    
    {
      "kind": "androidpublisher#subscriptionPurchaseV2",
      "startTime": "...",
      "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
      "latestOrderId": "GPA.<order_id>",
      "linkedPurchaseToken": "basic_purchase_token_123", // The purchase token of the subscription that was replaced (Basic Plan in this case)
      "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
      "lineItems": [
        {
          "productId": "premium_plan", // productID of the new subscription (Premium Plan in this case)
          "expiryTime": "....",
          "autoRenewingPlan": {...},
          "offerDetails": {
            "basePlanId": "monthly-auto-renewing" // base plan ID of the new subscription
          },
          "itemReplacement": { // Details about the subscription replacement
            "productId": "subscription_basic", // productID of the old subscription (Basic Plan in this case)
            "replacementMode": "CHARGE_PRORATED_PRICE", // Replacement strategy used for this subscription change
            "basePlanId": "monthly-auto-renewing" // base plan ID of the old subscription 
          },
          "offerPhase": {...}
        }
      ],
      "etag": "<etag_value>"
    }
    
  • Yeni Premium satın alma işlemini onaylamanız gerekir. Bu işlem uygulamanızda veya arka ucunuzda yapılabilir. Satın alma işleminin 3 gün içinde onaylanmaması durumunda geri ödeme yapılır ve hak iptal edilir. Satın alma işlemlerini işleme ve onaylama hakkında daha fazla bilgi için geliştirici belgelerine bakın.

Sonuç

Bu bölümde, hem istemcide hem de arka uçta anında abonelik değiştirme işlemlerini gerçekleştirme adımları ele alınmıştır. Google Play'in yeni planı yepyeni bir satın alma işlemi olarak değerlendirip yeni bir satın alma jetonu oluşturduğunu öğrendiniz. İstemcide, bu yeni satın alma işlemini PurchasesUpdatedListener kullanarak işlemeniz ve queryPurchasesAsync'den gelen yanıta göre hakları güncellemeniz gerekir. Arka uçta, yeni jeton için SUBSCRIPTION_PURCHASED RTDN'leri dinlemeniz, eski aboneliğin linkedPurchaseToken'ini belirlemek için purchases.subscriptionsv2 API'sini kullanmanız ve yeni hak tanırken eski jetonla ilişkili erişimi derhal iptal etmeniz gerekir. Yeni satın alma işlemini her zaman onaylamayı unutmayın.

11. ERTELENMİŞ Değişimleri İşleme

Anında değiştirme modlarının aksine, ReplacementMode.DEFERRED abonelik değişikliğini ve hak güncellemesini geçerli faturalandırma döneminin sonuna kadar erteler. Ertelenen değiştirmelerin işlenmesi, kullanıcıların uygun zamanda doğru hakka sahip olmasını sağlamak için belirli bir mantık gerektirir.

Örnek Senaryo

  • Kullanıcının, 15 Nisan'da yenilenen bir Basic aylık planı (product_id basic_plan ve purchase_token basic_purchase_token_123) var.
  • Kullanıcı, 1 Nisan'da ReplacementMode.DEFERRED kullanarak Premium plana geçmeye karar verir.
  • Google, Premium planı (product_id premium_plan ve purchase_token premium_purchase_123) için YENİ bir satın alma jetonu oluşturur ancak kullanıcıdan alınacak tutar ve hak, 15 Nisan'da planlanır.

Ertelenen değişimi işleme koyma

1. Satın alma süreci başarıyla tamamlandıktan hemen sonra (uygulama)

  • PurchasesUpdatedListener, satın alma süreci tamamlandıktan sonra çağrılır. Uygulama, yeni satın alma jetonunu premium_purchase_token_123 içeren bir Purchase nesnesi alır. Ancak kullanıcı yalnızca Basic planına sahip olduğundan product_id, eski basic_plan öğesini ifade etmeye devam eder. Bunu tam olarak yeni bir satın alma işlemi gibi ele almalı ve jetonu onaylamalısınız.
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) {
            for (Purchase purchase : purchases) {
                // purchase.getPurchaseToken() = premium_purchase_token_123
                // purchase.getProducts() will contain basic_plan
                // Verify and acknowledge the purchase
                handleNewPurchase(purchase);
            }
        }
    }
    
  • queryPurchasesAsync, yeni satın alma jetonu (premium_purchase_token_123) ile satın alma işlemini ve bununla ilişkili orijinal hakları (basic_plan) hemen iade eder. Kullanıcıya Basic planı hakkı vermeye devam etmek için bu bilgiyi kullanabilirsiniz.

2. Satın alma süreci başarıyla tamamlandıktan hemen sonra (arka uç)

  • SUBSCRIPTION_PURCHASED RTDN'si, yeni satın alma jetonu (premium_purchase_token_123) için satın alma sürecinden hemen sonra gönderilir.Örnek RTDN yükü
    {
      "version":"1.0",
      "packageName":"com.google.play.billing.samples.subscriptions",
      "eventTimeMillis":"...",
      "subscriptionNotification":
      {
        "version":"1.0",
        "notificationType":4, // SUBSCRIPTION_PURCHASED
        "purchaseToken":"premium_purchase_token_123" //purchase token for the new subscription
      }
    }
    
  • Satın alma ayrıntılarını getirmek için yeni satın alma jetonuyla GET purchases.subscriptionsv2 yöntemini çağırın. Yanıtta 2 satır öğesi var.
    • Biri eski aboneliği (temel plan) temsil eder ve gelecekteki bir expiryTime tarihine sahiptir. Eski abonelik yenilenmez ve yeni aboneliği (premium plan) içeren bir deferredItemReplacement gösterilir. Bu, eski hak süresi dolduğunda yerine yenisinin atanacağını gösterir.
    • Biri yeni satın alınan aboneliği temsil eder. "expiryTime" için değer ayarlanmamış.
    Örnek API yanıtı
    {
      "kind": "androidpublisher#subscriptionPurchaseV2",
      "startTime": "2026-05-07T15:50:11.383Z",
      "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
      "latestOrderId": "GPA.<order_id>",
      "linkedPurchaseToken": "basic_purchase_token_123",
      "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
      "lineItems": [
        {
          "productId": "premium_plan", // Premium Plan has no expiry time
          "autoRenewingPlan": {...},
          "offerDetails": {...},
          "itemReplacement": {. // Subscription replacement details
            "productId": "basic_plan",
            "replacementMode": "DEFERRED",
            "basePlanId": "monthly-auto-renewing"
          },
          "offerPhase": {}
        },
        {
          "productId": "basic_plan", // Subscription to be replaced
          "expiryTime": "2026-05-07T15:54:34.768Z", // Expiry time in the future
          "autoRenewingPlan": {},
          "offerDetails": {...},
          "deferredItemReplacement": { // identifier indicating this subscription will be replaced upon renewal
            "productId": "subscription_premium"
          },
          "latestSuccessfulOrderId": "GPA.<order_id>",
          "itemReplacement": {...},
        }
      ],
      "etag": "<etag>"
    }
    
  • Yeni satın alma jetonunu onaylamanız gerekir. Bu işlem uygulamanızda veya arka ucunuzda yapılabilir. Satın alma işlemlerini işleme ve onaylama hakkında daha fazla bilgi için geliştirici belgelerine bakın.
  • SUBSCRIPTION_EXPIRED: Eski satın alma jetonu (basic_purchase_token_123) için RTDN gönderilir. Örnek RTDN yükü
    {
      "version":"1.0",
      "packageName":"com.google.play.billing.samples.subscriptions",
      "eventTimeMillis":"...",
      "subscriptionNotification":
      {
        "version":"1.0",
        "notificationType":13, // SUBSCRIPTION_EXPIRED
        "purchaseToken":"basic_purchase_token_123" //purchase token for the old subscription
      }
    }
    
  • Eski satın alma jetonuyla GET purchases.subscriptionsv2 API'si çağrıldığında, süresi dolmuş (SUBSCRIPTION_STATE_EXPIRED) olarak görünür. Eski planın hakkı, kalan süre için yeni satın alma işlemine aktarılır.

3. Değiştirme tarihinde: Satın alma akışından (uygulama) sonraki ilk yenileme

  • queryPurchasesAsync, yeni satın alma jetonu (premium_purchase_token_123) ve bununla ilişkili yeni abonelik (premium_plan) ile satın alma işlemini döndürür.
  • Satın alma süreci başarılı olduğunda yeni satın alma işlemi zaten işlenmiş olmalıdır. Kullanıcıya doğru aboneliğe erişim izni verildiğinden emin olmanın dışında herhangi bir özel işlem yapmanız gerekmez.

4. Değiştirme tarihinde: Satın alma sürecinden sonraki ilk yenileme (arka uç)

  • ReplacementMode.DEFERRED ile ilk yenilemeler, SUBSCRIPTION_RENEWED RTDN'leri işleyen diğer yenilemelerin standart davranışını izler. Bu durumda, değiştirmeler için özel bir mantık kullanmanız gerekmez.
  • Satın alma ayrıntılarını getirmek için yeni satın alma jetonuyla GET purchases.subscriptionsv2 yöntemini çağırın. Yanıtta 2 satır öğesi var.
    • Eski aboneliği (temel plan) temsil eden ve expiryTime tarihi geçmişte olan bir abonelik. Eski abonelikte artık deferredItemReplacement alanı için bir değer ayarlanmayacak.
    • Gelecekteki expiryTime ile yeni aboneliği temsil eden ve autoRenewEnabled alanı true olarak ayarlanmış bir abonelik.
    Örnek API Yanıtı
    {
      "kind": "androidpublisher#subscriptionPurchaseV2",
      "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
      "latestOrderId": "GPA.<order_id>..0",
      "linkedPurchaseToken": "basic_purchase_token_123", // purchase token of the old subscription
      "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
      "lineItems": [
        {
          "productId": "premium_plan", // New subscription
          "expiryTime": "2026-05-07T16:00:09.437Z", // Expiry time set in the future
          "autoRenewingPlan": {
            "autoRenewEnabled": true, // Auto Renewing Flag set to True
            "recurringPrice": {...}
          },
          "offerDetails": {...},
          "latestSuccessfulOrderId": "GPA.<order_id>..0",
          "itemReplacement": {. // Details of the subscription replacement
            "productId": "basic_plan",
            "replacementMode": "DEFERRED",
            "basePlanId": "monthly-auto-renewing"
          },
          "offerPhase": {...}
        },
        {
          "productId": "basic_plan", // Old subscription, Does not contains the deferredItemReplacement field
          "expiryTime": "2026-05-07T15:54:34.768Z", // Expiry time set in the past
          "autoRenewingPlan": {},
          "offerDetails": {...},
          "latestSuccessfulOrderId": "GPA.<order_id>..0",
          "itemReplacement": {...},
        }
      ],
      "etag": "<etag>"
    }
    

Sonuç

Bu bölümde, ReplacementMode.DEFERRED için gereken benzersiz işlem ayrıntılı olarak açıklanmıştır. Hak değişikliğinin, anında modların aksine yalnızca mevcut faturalandırma döneminin sonunda gerçekleştiğini öğrendiniz. Bu bölümde, hem uygulamanızın hem de arka ucunuzun ilk satın alma işlemini doğru şekilde işlemesi, yeni jetonu onaylaması ve eski aboneliğin süresi dolup yeni abonelik etkinleştiğinde hak geçişini yönetmesi için gerekli adımlar ele alınmıştır.

12. Abonelik Değiştirme Deneme Alanı

Örnek uygulamadaki Değiştirme Deneme Alanı özelliği, Google Play Console hesabınızda yapılandırılan abonelik ürünleri için abonelik yükseltme ve düşürme işlemlerini test etmenize olanak tanır. Bu bölümde, Değiştirme Deneme Alanı özelliğinin nasıl kullanılacağı açıklanmaktadır.

Kurulum

Değiştirme Playground özelliğini kullanmak için aşağıdakilerden emin olun:

  • build.gradle dosyanızdaki packageId, Google Play Console'da yapılandırılan uygulamayla eşleşmelidir.
  • Test kullanıcısı hesabınız, Google Play Console'da lisanslı test kullanıcısı olarak kayıtlıdır. Lisans testi hakkında daha fazla bilgi edinmek için Uygulamanızın faturalandırma uygulamasını test etme başlıklı makaleyi inceleyin.

Abonelik Değiştirme Deneme Alanı

Örnek uygulamada, abonelik değişikliklerini simüle etmenize olanak tanıyan bir Replacement Playground (Değiştirme Deneme Alanı) sekmesi bulunur. Play Console'da tanımlanan abonelikleri sorgulayabilir ve çeşitli değiştirme modlarını kullanarak bunlar arasında geçiş yapmayı test edebilirsiniz. Bu deneme alanı, farklı modların aboneliklerinizin faturalandırma dönemlerini ve haklarını nasıl etkilediğini anlamanıza yardımcı olur. Böylece, işletmenizin ihtiyaçlarına en uygun seçenekleri belirleyebilirsiniz.

Playground'u kullanarak değiştirmeleri simüle etmek için aşağıdaki adımları uygulayın:

  1. Playground (Deneme Alanı) sekmesine gidin.
  2. Etkin bir aboneliğiniz varsa: Aboneliğiniz vurgulanır. Aşağıdaki abonelik değiştirilecek.

Playground ana sayfası

  1. Etkin bir aboneliğiniz yoksa: Önce bir abonelik satın almanız gerekir.
    • Playground'da bu codelab için varsayılan olarak oluşturulan Basic, Premium ve Lite planları listelenir.
    • Play Console'da yapılandırılan diğer planlarla test etmek için Özel Plan Ekle'yi tıklayın, productId ve basePlanId ile arama yapın.
    • Seçilen aboneliği satın alın.
    • Kullanıcının yeni satın aldığı etkin abonelik gösterilir. Özel abonelik ekleme
  2. Kullanıcının geçiş yapmak istediği hedef aboneliği seçin.
  3. Geçiş için bir Değiştirme Modu seçin.

Değiştirme modunu seçin

  1. Abonelik değiştirme işlemini simüle etmek için Test Değiştirme düğmesini tıklayın.
  2. Abonelik değiştirme işleminin hesaplanmış ayrıntılarını (ör. anında alınan ücretler ve faturalandırma dönemi ayarlamaları) içeren Google Play Faturalandırma alt sayfasını görürsünüz.

Abonelik değiştirme faturalandırma sepeti

  1. İşlemi tamamlayın.
  2. Etkin abonelik değişikliklerini, güncellenen yenileme tarihleri ve fiyatlarla ilgili ayrıntıları görmek için Play Store uygulamasında Abonelikleri Yönet sayfasına gidin.

Play Store abonelik yönetimi

13. Sonraki adımlar

Referans belgeleri

14. Tebrikler

Tebrikler! Abonelik değişikliklerini çeşitli orantılı ödeme modlarıyla başarıyla uyguladınız ve plan geçişleri için arka uç işlemeyi yapılandırdınız.

Öğrendikleriniz

  • SubscriptionProductReplacementParams'yı belirli değiştirme modlarıyla yapılandırma
  • Anında yükseltmeler ile ertelenen alt sürüme geçişler arasındaki fark.
  • linkedPurchaseToken kullanarak eski abonelik jetonlarını nasıl kullanımdan kaldırabilirsiniz?

Anket

Bu codelab ile ilgili geri bildiriminiz bizim için çok değerli. Anketimizi tamamlamak için birkaç dakikanızı ayırabilirsiniz.