1. Giriş
Bu codelab'de, abonelik planı değişikliklerini yönetmek için Google Play Faturalandırma Kitaplığı'nı (PBL) nasıl kullanacağınız açıklanmaktadır. Arka uçtaki gerçek zamanlı geliştirici bildirimlerini (RTDN'ler) nasıl işleyeceğinizi öğ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 düşürme politikalarına uygun doğru
ReplacementMode(ör.WITH_TIME_PRORATIONveDEFERRED) nasıl seçilir? - Plan değişikliği için Google Play satın alma sürecini tetiklemek üzere
launchBillingFlowiçindeBillingFlowParamsnası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.subscriptionsv2API'yi kullanma
Gerekenler
- Geliştirici hesabı ile Google Play Console'a erişim Geliştirici hesabınız yoksa hesap oluşturmanız gerekir.
- Bu codelab'in örnek uygulamasını GitHub'dan indirebilirsiniz.
- Android Studio
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ştirme işlemlerini 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 nasıl davranacağı gösterilmektedir.
Ön koşullar
Örnek uygulamayı oluşturup dağıtmadan önce aşağıdakileri yapın:
- Google Play Console geliştirici hesabı oluşturun. Zaten bir geliştirici hesabınız varsa bu adımı atlayın.
- Para kazanma özellikleri etkinleştirilmiş olarak Play Console'da yeni bir uygulama oluşturun. Alternatif olarak, Play Console'da mevcut bir uygulamayı kullanabilirsiniz. Uygulamanızda para kazanma özellikleri etkin değilse bu özellikleri ayarlamak için buradaki adımları uygulayın.
- Android Studio'yu yükleyin.
Derleme
Codelab'i takip etmek için örnek uygulamayı gerektiği gibi oluşturmak üzere:
- GitHub'dan örnek uygulamayı indirin.
- Örnek uygulamanın
build.gradleiçindekiapplicationIddeğerini, Play Console'daki uygulamanızın uygulama kimliğini yansıtacak şekilde güncelleyin. - Ö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 uygulama çalıştırıldığında ürünler ve fiyatlar getirilmez. 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 plan içeren 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 ederek Premium Plan, Basic Plan ve Lite Plan olmak üzere üç abonelik oluşturacaksınız. Her birinde tek bir aylık yinelenen temel plan bulunur.
Yeni abonelik oluşturun
Yeni abonelik oluşturmak için
- Play Console'u açıp Abonelikler sayfasına (Google Play ile para kazanma > Ürünler > Abonelikler) gidin.
- Abonelik oluştur'u tıklayın.
- Abonelik ayrıntılarınızı girin:
- ProductID (Ürün Kimliği): Benzersiz bir ürün kimliği girin.
premium_planyazın. - Ad : Abonelik için kısa bir ad girin. Örnek:
Premium Plan.
- ProductID (Ürün Kimliği): Benzersiz bir ürün kimliği girin.
- Oluştur'u tıklayın.
Base Plan'ı oluşturma
- Play Console'u açıp Abonelikler sayfasına (Google Play ile para kazanma > Ürünler > Abonelikler) gidin.
- Temel plan oluşturmak istediğiniz aboneliğin yanındaki sağ oku tıklayarak abonelik ayrıntılarını görüntüleyin.
- Temel plan ekle'yi tıklayın.
- Temel plan kimliği girin. Örnek
monthly-auto-renewing. - Tür olarak Otomatik yenileme'yi seçin.
- 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.
- Fiyat ve stok durumu bölümünde, temel planın fiyatını belirlemek için Fiyatları belirle'yi tıklayın.
- Tüm ülkeleri ve bölgeleri seçip Fiyat belirle'yi tıklayın.
- Bu temel planın fiyatını 10 ABD doları olarak ayarlayın ve Güncelle'yi tıklayın.
- 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:
- Basic 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çmelerine) 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 eklenir. 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 süreye göre 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 ileri alınarak yeni aboneliğe yansıtı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 denk geldiğini hesaplarsa bir sonraki faturalandırma 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
MainActivitybölümünde, kod snippet'indekireplacementModedeğeriniSubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATIONolarak güncelleyin. - Uygulamayı yeniden oluşturup başlatın.
- Google Play Store'daki mevcut abonelikleri (varsa) iptal edin. Bu aboneliklerin süresi dolar.
- Basic planını satın alın.
- Premium planına geçin.
Kullanıcının hakkı hemen Premium planına 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 eklenir. 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
MainActivitybölümünde, kod snippet'indekireplacementModedeğeriniSubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATIONolarak güncelleyin. - Uygulamayı yeniden oluşturup başlatın.
- Google Play Store'daki mevcut abonelikleri (varsa) iptal edin. Bu aboneliklerin süresi dolar.
- 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 da bir sonraki yenileme tarihini önemli ölçüde uzatır. Kullanıcıdan, yeni düzenlenmiş fatura tarihinde 2,99 ABD doları tutarında 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 anında ü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
MainActivitybölümünde, kod snippet'indekireplacementModedeğeriniSubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICEolarak güncelleyin. - Uygulamayı yeniden oluşturup başlatın.
- Google Play Store'daki mevcut abonelikleri (varsa) iptal edin. Bu aboneliklerin süresi dolar.
- Basic planını satın alın.
- Premium planına geçin.
Kullanıcı, orijinal yenileme tarihi korunarak hemen Premium planına yükseltilir. Hemen ödenecek 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
MainActivitybölümünde, kod snippet'indekireplacementModedeğeriniSubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICEolarak güncelleyin. - Uygulamayı yeniden oluşturup başlatın.
- Google Play Store'daki mevcut abonelikleri (varsa) iptal edin. Bu aboneliklerin süresi dolar.
- 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, orantılı ödeme modunun sürüm düşürme işlemleri için desteklenmediğini belirten bir hata mesajı 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ı üzerinden ücretlendirerek anında yükseltme yapmalarına nasıl olanak tanıdığı açıklanmıştır. Bu, kullanıcının fatura tarihini değiştirmeden daha pahalı bir katmana yükseltmek istediği 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 süreye göre 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 gerçekleşir.
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
MainActivitybölümünde, kod snippet'indekireplacementModedeğeriniSubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICEolarak güncelleyin. - Uygulamayı yeniden oluşturup başlatın.
- Google Play Store'daki mevcut abonelikleri (varsa) iptal edin. Bu aboneliklerin süresi dolar.
- 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 alt sürüme geçme
Bu senaryoyu simüle etmek için:
- Örnek uygulamanın
MainActivitybölümünde, kod snippet'indekireplacementModedeğeriniSubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICEolarak güncelleyin. - Uygulamayı yeniden oluşturup başlatın.
- Google Play Store'daki mevcut abonelikleri (varsa) iptal edin. Bu aboneliklerin süresi dolar.
- Basic planını satın alın.
- Lite planına geçin.
Kullanıcının planı hemen Lite'a düşürülür 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 9,99 ABD doları tutarındaki yüksek fiyatı ö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
MainActivitybölümünde, kod snippet'indekireplacementModedeğeriniSubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATIONolarak güncelleyin. - Uygulamayı yeniden oluşturup başlatın.
- Google Play Store'daki mevcut abonelikleri (varsa) iptal edin. Bu aboneliklerin süresi dolar.
- Basic planını satın alın.
- Premium planına geçin.
Kullanıcı, mevcut yenileme tarihi korunarak 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
MainActivitybölümünde, kod snippet'indekireplacementModedeğeriniSubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATIONolarak güncelleyin. - Uygulamayı yeniden oluşturup başlatın.
- Google Play Store'daki mevcut abonelikleri (varsa) iptal edin. Bu aboneliklerin süresi dolar.
- 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 planlı 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
MainActivitybölümünde, kod snippet'indekireplacementModedeğeriniSubscriptionProductReplacementParams.ReplacementMode.DEFERREDolarak güncelleyin. - Uygulamayı yeniden oluşturup başlatın.
- Google Play Store'daki mevcut abonelikleri (varsa) iptal edin. Bu aboneliklerin süresi dolar.
- 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 planına 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
MainActivitybölümünde, kod snippet'indekireplacementModedeğeriniSubscriptionProductReplacementParams.ReplacementMode.DEFERREDolarak güncelleyin. - Uygulamayı yeniden oluşturup başlatın.
- Google Play Store'daki mevcut abonelikleri (varsa) iptal edin. Bu aboneliklerin süresi dolar.
- 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ınan özelliklerin kaybedilmesini önlemek için özellikle sürüm düşürme işlemlerinde 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ı var (product_id
basic_planve purchase_tokenbasic_purchase_token_123). - 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_planve purchase_tokenpremium_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 premium_purchase_token_123 product_id premium_plan içeren bir nesne 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ürecek.
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 anlık geliştirici bildirimi (RTDN) gönderir.
- Anında değişim durumunda Google, yeni satın alma jetonunu içeren bir
SUBSCRIPTION_PURCHASEDRTDN 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.subscriptionsV2API'sini çağırın. API yanıtında, 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 birlinkedPurchaseTokenalanı bulunur. - Abonelik değiştirme durumunda
linkedPurchaseToken, eski aboneliğin satın alma jetonunu ifade eder. Bu senaryodabasic_purchase_token_123olur.ÖrnekGET purchases.subscriptionsV2yanıtcurl \ '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 uçunuzda 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şlemlerinin işlenmesi ve onaylanması 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 doğru hakka uygun zamanda 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_planve purchase_tokenbasic_purchase_token_123) var. - 1 Nisan'da kullanıcı,
ReplacementMode.DEFERREDkullanarak Premium plana geçmeye karar verir. - Google, Premium planı (product_id
premium_planve purchase_tokenpremium_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
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 jetonunupremium_purchase_token_123içeren birPurchasenesnesi alır. Ancak kullanıcı yalnızca Basic planına sahip olduğundan product_id, eskibasic_planöğesini ifade etmeye devam eder. Bunu yeni bir satın alma işlemi gibi değerlendirmeniz ve jetonu onaylamanız gerekir.@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 döndürür. 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.subscriptionsv2yöntemini çağırın. Yanıtta 2 satır öğesi var.- Biri eski aboneliği (temel plan) temsil eder ve gelecekteki bir
expiryTimetarihine sahiptir. Eski abonelik yenilenmez ve yeni aboneliği (premium plan) içeren birdeferredItemReplacementolur. 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ış.
{ "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>" } - Biri eski aboneliği (temel plan) temsil eder ve gelecekteki bir
- Yeni satın alma jetonunu onaylamanız gerekir. Bu işlem uygulamanızda veya arka uçunuzda yapılabilir. Satın alma işlemlerinin işlenmesi ve onaylanması hakkında daha fazla bilgi için geliştirici belgelerine bakın.
- Eski satın alma jetonu (
basic_purchase_token_123) için SUBSCRIPTION_EXPIRED RTDN'si 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.subscriptionsv2API'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.DEFERREDile ilk yenilemeler,SUBSCRIPTION_RENEWEDRTDN'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.subscriptionsv2yöntemini çağırın. Yanıtta 2 satır öğesi var.- Eski aboneliği (temel plan) temsil eder ve
expiryTimegeçmişte olmalıdır. Eski abonelikte artıkdeferredItemReplacementalanı için bir değer ayarlanmayacak. - Gelecekte
expiryTimeolan yeni aboneliği veautoRenewEnabledalanıtrueolarak ayarlanmış olanı gösterir.
{ "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>" } - Eski aboneliği (temel plan) temsil eder ve
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'u özelliğini kullanmak için aşağıdakilerden emin olun:
build.gradledosyanızdakipackageId, Google Play Console'da yapılandırılan uygulamayla eşleşmelidir.- Test kullanıcısı hesabınız, Google Play Console'da lisans test kullanıcısı olarak kaydedilmiştir. 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 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 faturalandırma dönemlerini ve aboneliklerinizin 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:
- Playground (Deneme Alanı) sekmesine gidin.
- Etkin bir aboneliğiniz varsa: Aboneliğiniz vurgulanır. Aşağıdaki abonelik değiştirilecek.

- 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,
productIdvebasePlanIdile arama yapın. - Seçilen aboneliği satın alın.
- Kullanıcının yeni satın aldığı etkin abonelik gösterilir.

- Kullanıcının geçiş yapmak istediği hedef aboneliği seçin.
- Geçiş için bir Değiştirme Modu seçin.

- Abonelik değiştirme işlemini simüle etmek için Test Değiştirme düğmesini tıklayın.
- 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.

- İşlemi tamamlayın.
- 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.

13. Sonraki adımlar
- Play Faturalandırma entegrasyonunuzdan en iyi şekilde nasıl yararlanacağınızı öğrenin.
- Kullanıcılar bu ürünleri satın almaya başladığında güvenli arka uç sisteminizde satın alma işlemlerini doğrulama ve işleme ile ilgili en iyi uygulamaları uyguladığınızdan emin olun.
Referans belgeleri
14. Tebrikler
Tebrikler! Çeşitli orantılı ödeme modlarıyla abonelik değişikliklerini 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.
linkedPurchaseTokenkullanarak eski abonelik jetonlarını nasıl kullanımdan kaldırabilirsiniz?
Anket
Bu codelab ile ilgili geri bildiriminiz bizim için çok değerli. Anketimizi doldurmak için birkaç dakikanızı ayırabilirsiniz.