Abonelikler hakkında

Bu belgede, yenileme ve sona erme gibi abonelik yaşam döngüsü etkinliklerinin nasıl ele alınacağı açıklanmaktadır. Ayrıca, promosyon sunma ve kullanıcılarınızın kendi aboneliklerini yönetmesine izin verme gibi ek abonelik özelliklerinden de bahsedilmektedir.

Uygulamanız için abonelik ürünleri yapılandırmadıysanız Ürünlerinizi oluşturma ve yapılandırma başlıklı makaleyi inceleyin.

Aboneliklere genel bakış

Abonelik, kullanıcılara belirli haklar veren yinelenen bir işlemdir. Haklar, kullanıcıların belirli bir dönem boyunca erişebileceği avantajları ifade eder. Örneğin, bir abonelik, kullanıcıya premium erişim hakkı verebilir.

Temel planlar ve fırsatlar aracılığıyla aynı abonelik ürünü için birden fazla yapılandırma oluşturabilirsiniz. Örneğin, uygulamanıza hiç abone olmamış kullanıcılar için bir tanıtım teklifi oluşturabilirsiniz. Benzer şekilde, halihazırda abone olan kullanıcılar için bir yükseltme teklifi oluşturabilirsiniz.

Abonelik ürünleri, temel planlar ve teklifler hakkında ayrıntılı bilgi için Play Console Yardım Merkezi'ndeki dokümanlara göz atın.

Play Faturalandırma Kitaplığı aşağıdaki abonelik türlerini destekler:

  • Tek öğeli abonelik: Bu türde, bir hakka karşılık gelen bir öğe bulunur. Örneğin, müzik akışı hizmetine abonelik.

  • Eklentili abonelik: Bu türde, tek bir satın alma işleminde birden fazla farklı hak bir arada sunulabilir. Örneğin, hem müzik akışı hizmetine hem de video aboneliği. Eklenti içeren aboneliklerle ilgili bilgiler için Eklenti içeren abonelikler başlıklı makaleyi inceleyin.

Ön ödemeli plan entegrasyonu

Ön ödemeli planlar, süreleri dolduğunda otomatik olarak yenilenmez. Abonelik haklarını kesintisiz olarak uzatmak için kullanıcının aynı abonelik için ön ödemeli bir plan yüklemesi gerekir.

Yükleme işlemleri için faturalandırma sürecini orijinal satın alma işleminde olduğu gibi başlatın. Satın alma işleminin yükleme olduğunu belirtmeniz gerekmez.

Ön ödemeli plan yüklemelerinde her zaman CHARGE_FULL_PRICE değiştirme modu kullanılır ve bu modu açıkça ayarlamanız gerekmez. Kullanıcıdan hemen tam bir fatura dönemi için ödeme alınır ve hakları, ekleme işleminde belirtilen süre kadar uzatılır.

Yükleme işleminden sonra, Purchase sonuç nesnesindeki aşağıdaki alanlar, en son yükleme satın alma işlemini yansıtacak şekilde güncellenir:

  • Sipariş kimliği
  • Satın alma zamanı
  • İmza
  • Satın alma jetonu
  • Onaylandı

Aşağıdaki Purchase alanlar her zaman orijinal satın alma işleminde bulunan aynı verileri içerir:

  • Paket adı
  • Satın alma durumu
  • Ürünler
  • Otomatik yenileme

Ön ödemeli satın alma onayı

Otomatik yenilenen aboneliklere benzer şekilde, ön ödemeli planları satın alma işleminden sonra onaylamanız gerekir. Hem ilk satın alma işleminin hem de tüm yüklemelerin kabul edilmesi gerekir. Daha fazla bilgi için Satın alma işlemlerini işleme başlıklı makaleyi inceleyin.

Kısa süreli ön ödemeli planlar olabileceğinden satın alma işlemini mümkün olan en kısa sürede onaylamak önemlidir.

Bir hafta veya daha uzun süreli ön ödemeli planlar üç gün içinde onaylanmalıdır.

Bir haftadan kısa süreli ön ödemeli planlar, plan süresinin yarısı içinde onaylanmalıdır. Örneğin, geliştiricilerin üç günlük ön ödemeli planı onaylamak için 1,5 gün süresi vardır.

Taksitli abonelik entegrasyonu

Taksitli abonelik, kullanıcıların abonelik ücretinin tamamını peşin ödemek yerine belirli bir süre boyunca birden fazla taksitte ödediği bir abonelik türüdür.

Taksitli aboneliklerle ilgili ek hususlar:

  • Ülke bazında kullanılabilirlik: Taksitli abonelik özelliği yalnızca Brezilya, Fransa, İspanya ve İtalya'da kullanılabilir (en son kullanılabilirlik durumu için Console'u kontrol edin).
  • Fiyatı ayarlama: Console'da taksitli ödeme aboneliğinin fiyatı ayarlanırken fiyat, aylık ödeme tutarını ifade eder. Bu değer, belirlenen taahhüt süresiyle birlikte satın alma ekranında aboneliğin toplam tutarını oluşturur.
  • Taahhüt süresi: Aylık ödemelerin yapılması gereken ilk abonelik taahhüdünün toplam süresi. Örneğin, bir temel planın 15 aylık taahhüt süresi varsa kullanıcı bu süre boyunca 15 aylık ödeme yapar.
  • Yenilemeler: Taksitli abonelikler bağlamında "yenileme", taahhüt döneminin (ilk taahhüt dönemi veya sonraki taahhüt dönemi) sona ermesini ifade eder. İlk kayıttan sonra ilk yenileme, ilk taahhüt süresinin tamamlanmasıyla gerçekleşir. Sonraki yenilemeler, sonraki her taahhüt dönemi tamamlandıktan sonra gerçekleşir. Taksitli aboneliklerin yenileme türleri "aylık otomatik yenilenir" veya "aynı süre için otomatik yenilenir" olabilir. "Aylık otomatik yenilenir" seçeneğinde, sonraki taahhüt yoktur ve plan, her aylık abonelik ücretinin yenileme olarak kabul edildiği aylık abonelik gibi davranır.
  • Fatura dönemi: Taksitli abonelikler bağlamında bu, temel planda belirtildiği gibi, bireysel ödemelerin yapıldığı yinelenen aralığı ifade eder.
  • Plan değişikliği ve fiyat değişikliği davranışları: Fiyat değişiklikleri ve iptallerde taahhüt kesindir. Bu nedenle, kullanıcı iptal etmek veya geliştirici fiyatı değiştirmek isterse değişiklik taahhüt süresinin sonunda geçerli olur. Plan değişikliklerinde taahhüt kesin değildir. Bu nedenle, plan değişikliğinin bir taahhüt döneminin sonuna kadar beklemesi gerekmez. Ayarlanan değiştirme moduna bağlı olarak hemen veya bir sonraki ödeme tarihinde geçerli olur.
  • Aynı abonelikte plan değişikliği: Taksitli temel plandan aynı abonelik ürününün taksitsiz temel planına geçişe izin verilmez.
  • Gerçek zamanlı geliştirici bildirimleri (RTDN'ler): Bir RTDN, ödeme dönemi boyunca ödeme yapılmaya devam edildiği durumlarda kullanıcı tarafından başlatılan iptal işleminden hemen sonra gönderilir.SUBSCRIPTION_CANCELLATION_SCHEDULED İptal işlemi beklemede ve yalnızca taahhüt süresinin sonunda geçerli olacak. Ardından, kullanıcı tarafından geri yüklenmezse taahhüt döneminin sonunda SUBSCRIPTION_CANCELED ve SUBSCRIPTION_EXPIRED RTDN'ler gönderilir.

  • Ödemeler / Gelir gerçekleştirme: Geliştirici ödemeleri, kullanıcılar aylık ödemelerini gerçekleştirdikçe yapılır. Bu ödemeler, diğer tüm aboneliklerle aynı şartlara tabidir. Kullanıcılar taksitli aboneliğe kaydolduğunda geliştiricilere önceden ödeme yapılmaz.

  • Ödenmeyen taksitler: Kullanıcı herhangi bir taksitli abonelik ödemesini yapmazsa Google veya Geliştirici, Google'ın normal ödeme yeniden deneme uygulamalarına uygun olarak geçerli bir ödeme süresi veya hesap askıya alma süresi boyunca ödemeyi düzenli aralıklarla yeniden denemesi dışında, kullanıcıdan bu tür ödenmemiş veya bekleyen ödemeleri tahsil etmeye çalışmaz. Google, Geliştirici'ye karşı ödenmemiş kalan taksit ödemelerinden sorumlu olmayacaktır.

  • Play Faturalandırma Kitaplığı'nın kullanılabilirliği: installmentDetails alanı yalnızca PBL 7 veya sonraki sürümlerde kullanılabilir. PBL 5 ve sonraki sürümlerde, taksitli abonelik queryProductDetails() kullanılarak iade edilir ancak abonelikte, planın taahhüt edilen ödeme sayısı gibi ayrıntılı taksit bilgileri yer almaz.

Kullanıcıların abonelik yönetmesine izin vermek için derin bağlantılar kullanma

Uygulamanızda, kullanıcılara aboneliklerini yönetme olanağı tanıyan bir ayarlar veya tercihler ekranı bağlantısı bulunmalıdır. Bu bağlantıyı uygulamanızın doğal görünümüne ve tarzına uygun şekilde ekleyebilirsiniz.

Uygulamanızdan, süresi dolmamış abonelikler için Google Play abonelik merkezine yönlendiren bir derin bağlantı ekleyebilirsiniz. Bu bağlantıyı, abonelik kaynağının subscriptionState alanını kullanarak belirleyebilirsiniz. Buna göre, Play Store abonelik merkezine derin bağlantı oluşturmanın birkaç yolu vardır.

Kullanıcıları, 1. ve 2. şekillerde gösterildiği gibi tüm aboneliklerinin gösterildiği sayfaya yönlendirmek için aşağıdaki URL'yi kullanın:

https://play.google.com/store/account/subscriptions
Play Store abonelikleri ekranında, kullanıcının Google Play üzerinden faturalandırılan tüm aboneliklerinin durumu gösterilir.
Şekil 1. Play Store abonelikleri ekranında, kullanıcının Google Play üzerinden faturalandırılan tüm aboneliklerinin durumu gösterilir.


Ek ayrıntıları görmek için bir aboneliğe dokunun.
Şekil 2. Ek ayrıntıları görmek için bir aboneliğe dokunun.

Bu derin bağlantı, kullanıcının Play Store abonelik merkezinden iptal edilmiş bir aboneliği geri yüklemesine yardımcı olmak için kullanılabilir.

Süresi dolmamış bir aboneliğin yönetim sayfasına doğrudan bağlantı vermek için satın alınan abonelikle ilişkili paket adını ve productId belirtin. Mevcut bir aboneliğin productId değerini programatik olarak belirlemek için uygulamanızın arka ucunu sorgulayın veya belirli bir kullanıcıyla ilişkili aboneliklerin listesi için BillingClient.queryPurchasesAsync() işlevini çağırın. Her abonelik, abonelik durumu bilgileri kapsamında ilgili productId içerir. Abonelik satın alma işlemiyle ilişkili her SubscriptionPurchaseLineItem nesnesi, kullanıcının söz konusu satır öğesinde satın aldığı abonelikle ilişkili productId değerini içerir.

Kullanıcıları belirli bir abonelik yönetimi ekranına yönlendirmek için aşağıdaki URL'yi kullanın. "your-sub-product-id" ve "your-app-package" bölümlerini sırasıyla productId ve uygulama paketi adıyla değiştirin:

https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package

Kullanıcı daha sonra ödeme yöntemlerini yönetebilir ve iptal, yeniden abone olma ve duraklatma gibi özelliklere erişebilir.

Kullanıcıların aboneliklerini yükseltmesine, düşürmesine veya değiştirmesine izin verme

Mevcut abonelere, abonelik planlarını ihtiyaçlarına daha uygun olacak şekilde değiştirmeleri için çeşitli seçenekler sunabilirsiniz:

  • "Temel" ve "premium" gibi birden fazla abonelik katmanı satıyorsanız kullanıcıların farklı bir aboneliğin temel planını veya teklifini satın alarak katmanlar arasında geçiş yapmasına 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.

Uygun kullanıcılara indirim sunmak için abonelik teklifleri vererek bu değişiklikleri teşvik edebilirsiniz. Örneğin, aylık plandan yıllık plana geçiş yapan kullanıcılara ilk yıl için% 50 indirim sunan bir teklif oluşturabilir ve bu teklifi, aylık plana abone olan ancak bu teklifi satın almamış kullanıcılarla sınırlayabilirsiniz. Fırsat uygunluk ölçütleri hakkında daha fazla bilgiyi Yardım Merkezi'nde bulabilirsiniz.

Şekil 3'te üç farklı plan içeren örnek bir uygulama gösterilmektedir:

Bu uygulamanın üç abonelik katmanı vardır.
Şekil 3. Bu uygulamanın üç abonelik katmanı vardır.

Uygulamanız, kullanıcılara aboneliklerini değiştirme seçenekleri sunan 3. şekle benzer bir ekran gösterebilir. Her durumda, kullanıcıların mevcut abonelik planlarının ne olduğu ve bunu değiştirmek için hangi seçeneklere sahip oldukları net bir şekilde anlaşılmalıdır.

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

Değiştirme modları

Aşağıdaki tabloda, kullanılabilen değiştirme modları, örnek kullanım ve ödenmiş olarak kabul edilen ödeme sayısı listelenmiştir.

Değiştirme modu

Açıklama

Örnek kullanım

Ödendi olarak kaydedilen taahhütlü ödemeler (taksitli abonelik değiştirme için)

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 ileri alınarak yeni aboneliğe eklenir. Bu, varsayılan davranıştır.

Daha pahalı bir plana geçiş yaptığınızda hemen ek ödeme yapmanız gerekmez.

0

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.

Not: Bu seçenek yalnızca bir abonelik öğesinin yükseltilmesi durumunda kullanılabilir. Bu durumda birim zaman başına fiyat artar.

Faturalandırma tarihini değiştirmeden daha pahalı bir katmana yükseltme

1

CHARGE_FULL_PRICE

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.

Not: Yeni abonelikte ücretsiz deneme veya tanıtım teklifi varsa kullanıcıdan yükseltme ya da düşürme sırasında 0 ABD doları veya tanıtım teklifinin fiyatı (hangisi geçerliyse) alınır.

Daha kısa faturalandırma döneminden daha uzun faturalandırma dönemine geçiş yapma

1 (Not: Yeni abonelikte ücretsiz deneme varsa 0)

WITHOUT_PRORATION

Abonelik öğesi hemen yükseltilir veya düşürülür ve abonelik yenilendiğinde yeni fiyat üzerinden ücretlendirilirsiniz. Faturalandırma dönemi aynı kalır.

Kalan ücretsiz dönemi koruyarak daha yüksek bir abonelik katmanına geçebilirsiniz.

0

DEFERRED

Abonelik öğesi yalnızca abonelik yenilendiğinde yükseltilir veya düşürülür. Ancak yeni satın alma işlemi, aşağıdaki iki öğeyle birlikte hemen gerçekleştirilir:

  • Otomatik yenileme devre dışı bırakılmış ve geçerlilik süresi geçerli faturalandırma döneminin sonuna ayarlanmış mevcut öğe.
  • Mevcut öğenin süresi dolduktan sonra başlayan yeni hak. İsterseniz kullanıcıların ek değişiklikler yapmasına izin verebilirsiniz. Örneğin, kullanıcılar orijinal plana geri dönebilir veya yeni bir ertelenmiş plan değişikliği başlatabilir.

Not: Taksitli aboneliklerde plan değişikliği, bir sonraki ödeme tarihinin başında gerçekleşir.

Daha ucuz bir katmana geçin.

1

KEEP_EXISTING

Abonelik öğesinin ödeme planı, değiştirme işleminde değişmez.

Belirli bir öğenin değiştirilmemesi gerektiğinde, eklentili bir aboneliğe abonelik öğesi ekleme veya abonelik öğesini kaldırma

Yok

Yükseltme veya düşürme tekliflerinin farklı üst satış ve geri kazanma uygulamaları hakkında daha fazla bilgi edinmek için teklifler ve promosyonlar kılavuzunu okuyun.

Satın alma işlemi için değiştirme modunu ayarlama

Tercihlerinize ve iş mantığınıza bağlı olarak farklı abonelik geçişi türleri için farklı değiştirme modları kullanabilirsiniz. Bu bölümde, abonelikteki bir değişiklik için nasıl değiştirme modu ayarlanacağı ve geçerli sınırlamalar açıklanmaktadır.

Aynı abonelik kapsamında yeniden abone olma veya plan değiştirme

Google Play Console'da varsayılan bir değiştirme modu belirtebilirsiniz. Bu ayar, mevcut aboneler aynı abonelik için farklı bir temel plan veya fırsat satın aldığında ya da iptalden sonra yeniden abone olduğunda ödeme alınacak zamanı seçmenize olanak tanır. Kullanılabilir seçenekler Hemen öde (CHARGE_FULL_PRICE) ve Bir sonraki fatura tarihinde öde (WITHOUT_PRORATION) şeklindedir. Aynı abonelikteki temel planlar arasında geçiş yaparken yalnızca bu değiştirme modları geçerlidir.

Örneğin, kullanıcı iptal ettikten sonra ancak abonelik sona ermeden önce aynı plan için yeniden kazanma teklifi uyguluyorsanız yeni satın alma işlemini SubscriptionUpdateParams alanında herhangi bir değer belirtmeden normal satın alma işlemi olarak işleyebilirsiniz. Sistem, abonelikte yapılandırdığınız varsayılan değiştirme modunu kullanır ve plan geçişini eski satın alma işleminden yeni satın alma işlemine otomatik olarak gerçekleştirir.

Abonelikler arasında plan değiştirme veya varsayılan değiştirme modunu geçersiz kılma

Kullanıcı abonelik ürünlerini değiştiriyorsa (farklı bir abonelik satın alıyorsa) veya varsayılan değiştirme modunu herhangi bir nedenle geçersiz kılmak istiyorsanız satın alma akışı parametrelerinin bir parçası olarak çalışma zamanında orantılı ödeme oranını belirtirsiniz.

Çalışma zamanı satın alma süreci yapılandırmanızın bir parçası olarak SubscriptionProductReplacementParams veya SubscriptionUpdateParams içinde ReplacementMode değerini doğru şekilde sağlamak için aşağıdaki kısıtlamalara dikkat edin:

  • Yükseltme, düşürme veya aynı abonelikle ilgili bir geçişi ön ödemeli plan olarak başlatırken (ön ödemeli plan, otomatik yenilenen plan veya taksitli plan) tek izin verilen değiştirme modu CHARGE_FULL_PRICE'dır. Başka bir değiştirme modu belirtirseniz satın alma işlemi başarısız olur ve kullanıcıya bir hata gösterilir.
  • Aynı abonelikteki planlar arasında, ön ödemeli plandan veya otomatik yenilenen plandan otomatik yenilenen bir plana geçiş yaparken geçerli orantılı ödeme modları CHARGE_FULL_PRICE ve WITHOUT_PRORATION'dir. Başka bir oranlı ödeme modu belirtirseniz satın alma işlemi başarısız olur ve kullanıcıya bir hata gösterilir.
  • Aynı abonelik ürününde, taksitli ödeme planından taksitli olmayan ödeme planına geçişe izin verilmez.
  • Bir öğenin ödemesini değiştirme sırasında aynı tutmak için KEEP_EXISTING değiştirme modu kullanılırken eski ürün kimliği, yeni ürünün ürün kimliğiyle aynı olmalıdır.SubscriptionProductReplacementParams KEEP_EXISTING modu, SubscriptionUpdateParams'da desteklenmez.

Değiştirme örnekleri ve davranışları

Her orantılı ödeme modunun nasıl çalıştığını anlamak için aşağıdaki senaryoyu inceleyin:

Samwise, Country Gardener uygulamasından online içeriklere abone. İçeriğin yalnızca metin içeren 1. Katman sürümüne aylık abone. Bu aboneliğin aylık maliyeti 2 ABD dolarıdır ve her ayın başında yenilenir.

Samwise, 15 Nisan'da video güncellemelerini içeren ve yıllık 36 ABD doları olan 2. Katman aboneliğinin yıllık sürümüne geçmeyi tercih etti.

Abonelik yükseltilirken geliştirici, orantılı ödeme modu seçer. Aşağıdaki listede, her bir orantılı ödeme modunun Samwise'ın aboneliğini nasıl etkilediği açıklanmaktadır:

WITH_TIME_PRORATION

Samwise'ın 1. Katman aboneliği hemen sona erer. Bir ayın tamamı (1-30 Nisan) için ödeme yaptığı ancak abonelik döneminin yarısında yükseltme yaptığı için yeni aboneliğine yarım aylık abonelik ücreti (1 TL) uygulanır. Ancak bu yeni aboneliğin yıllık maliyeti 36 ABD doları olduğundan 1 ABD doları kredi bakiyesi yalnızca 10 gün (16-25 Nisan) için yeterlidir. Bu nedenle, 26 Nisan'da yeni abonelik için 36 ABD doları ve sonraki her yılın 26 Nisan'ında 36 ABD doları daha öder.

Satın alma işlemi başarılı olduğunda ve yeni satın alma işlemini PurchasesUpdatedListener çağrısının bir parçası olarak alabildiğinizde uygulamanızın queryPurchasesAsync() yöntemini çağırmanız gerekir. Arka uçunuz hemen bir SUBSCRIPTION_PURCHASED Gerçek Zamanlı Geliştirici Bildirimi alır.

CHARGE_PRORATED_PRICE

Bu mod, 2. katman aboneliğinin zaman birimi başına fiyatı ($36/yıl = $3/ay), 1. katman aboneliğinin zaman birimi başına fiyatından ($2/ay) yüksek olduğu için kullanılabilir. Samwise'ın 1. Katman aboneliği hemen sona erer. Bir aylık abonelik ücretinin tamamını ödeyip yalnızca yarısını kullandığı için yeni aboneliğine yarım aylık abonelik ücreti (1 ABD doları) uygulanır. Ancak bu yeni aboneliğin yıllık maliyeti 36 TL olduğundan kalan 15 gün için 1,50 TL ödemesi gerekir. Bu nedenle, yeni aboneliği için 0,50 TL fark ücreti alınır. Samwise, 1 Mayıs'ta yeni abonelik katmanı için 36 ABD doları, sonraki her yılın 1 Mayıs'ında ise 36 ABD doları daha öder.

Satın alma işlemi başarılı olduğunda ve yeni satın alma işlemini PurchasesUpdatedListener çağrısının bir parçası olarak alabildiğinizde uygulamanızın queryPurchasesAsync() yöntemini çağırmanız gerekir. Arka uçunuz hemen bir SUBSCRIPTION_PURCHASED Gerçek Zamanlı Geliştirici Bildirimi alır.

WITHOUT_PRORATION

Samwise'ın 1. Katman aboneliği, ek ücret alınmadan hemen 2. Katman'a yükseltilir. 1 Mayıs'ta yeni abonelik katmanı için 36 ABD doları, sonraki her yılın 1 Mayıs'ında ise 36 ABD doları daha öder.

Satın alma işlemi başarılı olduğunda ve yeni satın alma işlemini PurchasesUpdatedListener çağrısının bir parçası olarak alabildiğinizde uygulamanızın queryPurchasesAsync() yöntemini çağırmanız gerekir. Arka uçunuz hemen bir SUBSCRIPTION_PURCHASED Gerçek Zamanlı Geliştirici Bildirimi alır.

DEFERRED

Samwise'ın 1. katman aboneliği 30 Nisan'da sona erene kadar devam eder. 1 Mayıs'ta 2. Katman aboneliği geçerli olur ve Samwise'dan yeni abonelik katmanı için 36 ABD doları tutarında ödeme alınır.

Satın alma işlemi başarılı olduğunda ve yeni satın alma işlemini PurchasesUpdatedListener çağrısının bir parçası olarak alabildiğinizde uygulamanızın queryPurchasesAsync() yöntemini çağırmanız gerekir. Arka uçunuz hemen bir SUBSCRIPTION_PURCHASED Gerçek Zamanlı Geliştirici Bildirimi alır. Satın alma işlemini, o noktada diğer yeni satın alma işlemlerini yaptığınız şekilde gerçekleştirmeniz gerekir. Özellikle yeni satın alma işlemini onayladığınızdan emin olun. Yeni aboneliğin startTime değerinin, eski aboneliğin süresi dolduğunda gerçekleşen değiştirme işlemiyle birlikte doldurulduğunu unutmayın. Bu noktada, yeni abonelik planı için bir SUBSCRIPTION_RENEWED RTDN'si alırsınız. Ertelenmiş değiştirme işlemini gerçekleştirme bölümünde ReplacementMode.DEFERRED davranışı hakkında daha fazla bilgi edinebilirsiniz.

CHARGE_FULL_PRICE

Samwise'ın 1. Katman aboneliği hemen sona erer. 2. Katman aboneliği bugün başlıyor ve 36 ABD doları ödeme alınıyor. Bir aylık ödeme yaptığı ancak yalnızca yarısını kullandığı için yeni aboneliğine yarım aylık abonelik ücreti (1 ABD doları) uygulanır. Yeni aboneliğin yıllık maliyeti 36 ABD doları olduğu için abonelik süresine 1/36 yıl (~10 gün) eklenir. Bu nedenle, Samwise'ın bir sonraki ödemesi 36 TL tutarında olacak ve bugünden itibaren 1 yıl 10 gün sonra alınacak. Sonrasında, her yıl 36 ABD doları ücret alınır.

Orantılandırma modu seçerken değiştirme önerilerimizi incelediğinizden emin olun.

KEEP_EXISTING

Samwise, Country Gardener uygulamasından online içeriklere abone. Temel içerikler için 1. Plan'a aylık abone. Bu aboneliğin tanıtım fiyatı 3 ay boyunca ayda 2 ABD doları, sonrasında ise ayda 4 ABD dolarıdır. Samwise, bu ürünü 1 Nisan'da satın aldı. Country Gardener uygulaması, 2. Planı aylık 3 ABD doları karşılığında ek özel içerik olarak sunar. 15 Nisan'da Samwise, mevcut Plan 1'i koruyarak Country Gardener uygulaması aboneliğine Plan 2'yi ekledi. Samwise'ın ödeme planı aşağıdaki gibidir:

  • 2.Plan için 15 Nisan'da ödenmesi gereken 1, 50 ABD doları tutarında kullanımla orantılı fiyat.
  • Sonraki 2 ay boyunca aylık 5,00 ABD doları fiyatla hem 1. Plan'ın tanıtım fiyatı hem de 2. Plan'ın normal fiyatı.
  • Sonrasında ise aylık 7, 00 ABD doları tutarında sabit bir ödeme alınır.

Uygulama içinde abonelik değişikliklerini tetikleme

Uygulamanız, satın alma akışı başlatma işleminde kullanılan adımları uygulayarak kullanıcılara yükseltme veya düşürme seçeneği sunabilir. Ancak yükseltme veya düşürme işlemi yaparken mevcut aboneliğin, gelecekteki (yükseltilmiş veya düşürülmüş) aboneliğin ve kullanılacak değiştirme modunun ayrıntılarını sağlamanız gerekir.

Değiştirme için SubscriptionProductReplacementParams'i kullanın (tercih edilen yöntem).

Aşağıdaki örnekte, SubscriptionProductReplacementParams kullanılarak aboneliğin nasıl güncelleneceği gösterilmektedir.

  • BillingFlowParams.ProductDetailsParams nesnesi artık ürün düzeyinde değiştirme bilgilerini belirtmek için setSubscriptionProductReplacementParams() yöntemine sahip.

  • SubscriptionProductReplacementParams öğesinin iki ayarlayıcı yöntemi vardır:

    • setOldProductId:Bu, mevcut ürünüyle değiştirilecek eski üründür.ProductDetails.
    • setReplacementMode:Bu, öğe düzeyinde değiştirme modudur. Modlar esasen SubscriptionUpdateParams ile aynıdır ancak değer eşleme güncellenmiştir.
  • Mevcut satın alma düzeyi güncelleme parametreleri BillingFlowParams.setSubscriptionUpdateParams(), setOldPurchaseToken() ile oluşturulmalıdır.

  • setSubscriptionProductReplacementParams(), ProductDetailsParams öğelerinden herhangi biri için çağrıldığında SubscriptionUpdateParams.setSubscriptionReplacementMode() öğesinin hiçbir etkisi olmaz.

Aşağıdaki kod örneğinde, abonelik planının (old_product_1, old_product_2) değerinden (product_1, product_2, product_3) değerine nasıl değiştirileceği gösterilmektedir. Bu senaryoda product_1, old_product_1 yerine, product_2, old_product_2 yerine geçer ve product_3 hemen aboneliğe eklenir.

Kotlin

val billingClient: BillingClient = ...
val replacementModeForBasePlan: Int = ...
val replacementModeForAddon: Int = ...

val purchaseTokenOfExistingSubscription: String = "your_old_purchase_token"

// ProductDetails instances obtained from queryProductDetailsAsync();

val productDetailsParams1 =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails1_obj) // Required: Set the ProductDetails object
        .setSubscriptionProductReplacementParams(
            SubscriptionProductReplacementParams.newBuilder()
                .setOldProductId("old_product_id_1")
                .setReplacementMode(replacementModeForBasePlan)
                .build()
        )
        .build()

val productDetailsParams2 =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails2_obj) // Required: Set the ProductDetails object
        .setSubscriptionProductReplacementParams(
            SubscriptionProductReplacementParams.newBuilder()
                .setOldProductId("old_product_id_2")
                .setReplacementMode(replacementModeForAddon)
                .build()
        )
        .build()

// Example for a third item without replacement params
val productDetailsParams3 =
    ProductDetailsParams.newBuilder()
        .setProductDetails(productDetails3_obj) // Required: Set the ProductDetails object
        .build()

val newProductDetailsList = listOf(
    productDetailsParams1,
    productDetailsParams2,
    productDetailsParams3
)

val billingFlowParams =
    BillingFlowParams.newBuilder()
        .setSubscriptionUpdateParams(
            SubscriptionUpdateParams.newBuilder()
                .setOldPurchaseToken(purchaseTokenOfExistingSubscription)
                .build()
        )
        .setProductDetailsParamsList(newProductDetailsList)
        .build()

// To launch the billing flow:
// billingClient.launchBillingFlow(activity, billingFlowParams)

Java

BillingClient billingClient = ;

int replacementModeForBasePlan =;
int replacementModeForAddon =;
// ProductDetails obtained from queryProductDetailsAsync().
ProductDetailsParams productDetails1 =
  ProductDetailsParams.newBuilder()
      .setSubscriptionProductReplacementParams(
           SubscriptionProductReplacementParams.newBuilder()
               .setOldProductId("old_product_id_1")
               .setReplacementMode(replacementModeForBasePlan))
               .build();
ProductDetailsParams productDetails2 =
  ProductDetailsParams.newBuilder()
      .setSubscriptionProductReplacementParams(
           SubscriptionProductReplacementParams.newBuilder()
               .setOldProductId("old_product_id_2")
               .setReplacementMode(replacementModeForAddon))
               .build();
ProductDetailsParams productDetails3 = ...;

ArrayList newProductDetailsList = new ArrayList<>();
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails2);
newProductDetailsList.add(productDetails3);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setSubscriptionUpdateParams(
          SubscriptionUpdateParams.newBuilder()
              .setOldPurchaseToken(purchaseTokenOfExistingSubscription)
             .build())
        .setProductDetailsParamsList(productDetailsList)
        .build();

billingClient.launchBillingFlow(billingFlowParams);

Değiştirme için SubscriptionUpdateParams'i ayarlama (desteği sonlandırıldı)

Aşağıdaki örnekte, SubscriptionUpdateParams kullanılarak aboneliğin nasıl güncelleneceği gösterilmektedir.

Kotlin

val offerToken = productDetails
        .getSubscriptionOfferDetails(selectedOfferIndex)
        .getOfferToken()

val billingParams = BillingFlowParams.newBuilder().setProductDetailsParamsList(
       listOf(
           BillingFlowParams.ProductDetailsParams.newBuilder()
               .setProductDetails(productDetails)
               .setOfferToken(offerToken)
               .build()
       )
       ).setSubscriptionUpdateParams(
           BillingFlowParams.SubscriptionUpdateParams.newBuilder()
               .setOldPurchaseToken("old_purchase_token")
               .setSubscriptionReplacementMode(
                 BillingFlowParams.ReplacementMode.CHARGE_FULL_PRICE
               )
               .build()
       ).build()

billingClient.launchBillingFlow(
    activity,
    billingParams
   )
// ...

Java

String offerToken = productDetails
    .getSubscriptionOfferDetails(selectedOfferIndex)
    .getOfferToken();

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(
        ImmuableList.of(
            ProductDetailsParams.newBuilder()
                // fetched via queryProductDetailsAsync
                .setProductDetails(productDetails)
                // offerToken can be found in
                // ProductDetails=>SubscriptionOfferDetails
                .setOfferToken(offerToken)
                .build()))
    .setSubscriptionUpdateParams(
        SubscriptionUpdateParams.newBuilder()
            // purchaseToken can be found in Purchase#getPurchaseToken
            .setOldPurchaseToken("old_purchase_token")
            .setSubscriptionReplacementMode(ReplacementMode.CHARGE_FULL_PRICE)
            .build())
    .build();

BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
// ...

Değiştirme önerileri

Aşağıdaki tabloda, farklı orantılı ödeme senaryoları ve her senaryo için önerilerimiz gösterilmektedir:

Senaryo Önerilen değiştirme modu Sonuç
Daha pahalı bir katmana geçme CHARGE_PRORATED_PRICE Kullanıcı, aynı faturalandırma dönemini korurken erişimi hemen alır.
Daha ucuz bir katmana geçiş DEFERRED Kullanıcı, daha pahalı katman için ödeme yaptığından bir sonraki fatura tarihine kadar erişmeye devam eder.
Ücretsiz deneme süresindeyken üst sürüme geçme ve denemeyi sürdürme WITHOUT_PRORATION Kullanıcı, deneme süresinin geri kalanı için ek ücret ödemeden daha yüksek bir katmana yükseltir.
Ücretsiz deneme süresinde plan yükseltme: Ücretsiz denemeye erişimi sonlandırma CHARGE_PRORATED_PRICE Kullanıcı, yeni katmana hemen erişir ve ücretsiz denemenin kalan değeri aktarılır. Devreden değer, temel plan fiyatlandırmasına göre hesaplanır.
Eklentili aboneliğe başka abonelik öğeleri eklerken veya bu abonelikten öğe kaldırırken bazı abonelik öğelerinin ödeme planını değiştirmeme KEEP_EXISTING Kullanıcı, değişmeyen öğe için eski fiyatı ödemeye devam eder. Yeni öğeler hemen eklenir. Diğer eski öğeler, değiştirme modu belirtilerek değiştirilebilir veya kaldırılabilir.

Abonelik değişikliği satın alma işlemlerini yönetme

Plan değişiklikleri, tüm şartlar ve amaçlar için yeni satın alma işlemleri olarak kabul edilir ve faturalandırma akışı başarıyla tamamlandıktan sonra bu şekilde işlenip onaylanmalıdır. Yeni satın alma işlemini uygun şekilde işlemenin yanı sıra, değiştirilen satın alma işlemini de kullanımdan kaldırmanız gerekir.

Uygulama içi davranış, yeni satın alma işlemlerinde olduğu gibidir. Uygulamanız, PurchasesUpdatedListener bölümünde yeni satın alma işleminin sonucunu alır ve yeni satın alma işlemi queryPurchasesAsync bölümünde kullanılabilir.

Google Play Developer API, bir satın alma işlemi mevcut bir satın alma işleminin yerini aldığında abonelik kaynağında linkedPurchaseToken değerini döndürür. Eski jetonun hizmetlerinize erişmek için kullanılmaması amacıyla linkedPurchaseToken içinde sağlanan jetonu geçersiz kıldığınızdan emin olun. Yükseltme ve alt sürüme geçiş satın alma işlemlerini yönetme hakkında bilgi edinmek için Üst sürüme geçiş, alt sürüme geçiş ve yeniden kaydolma başlıklı makaleyi inceleyin.

Yeni satın alma jetonunu aldığınızda yeni satın alma jetonunu doğrulama ile aynı doğrulama sürecini uygulayın. Bu satın alma işlemlerini Google Play Faturalandırma Kitaplığı'ndan BillingClient.acknowledgePurchase() veya Google Play Developer API'den Purchases.subscriptions:acknowledge ile onayladığınızdan emin olun.

Ertelenen değiştirme işlemini gerçekleştirme

Ertelenmiş değiştirme modu, kullanıcının yeni plana başlamadan önce eski planındaki kalan haklarını kullanmasına olanak tanır.

Yeni bir satın alma işleminde ReplacementMode.DEFERRED kullandığınızda, satın alma işlemi tamamlandıktan sonra queryPurchasesAsync() yeni bir satın alma jetonu döndürür. Bu jeton, ertelenmiş değiştirme işlemi bir sonraki yenileme tarihinde gerçekleşene kadar eski ürünle ilişkilendirilmeye devam eder. Bu tarihten sonra yeni ürün döndürülür.

Geçmişte bu kullanıcı deneyimini kullanımdan kaldırılan ProrationMode.DEFERRED ile sağlayabiliyordunuz ancak ProrationMode.DEFERRED, Play Faturalandırma Kitaplığı 6 ile birlikte kullanımdan kaldırıldı. Davranışın nerede farklılık gösterdiğini anlamak için aşağıdaki tabloya bakın:

Süre

ProrationMode.DEFERRED (desteği sonlandırıldı)

ReplacementMode.DEFERRED

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

PurchasesUpdatedListener, satın alma işleminden sonra yükseltme veya eski sürüme geçirme işleminin başarılı olup olmadığına dair bir durumla birlikte çağrılır.

Eski planın hakları, bir sonraki yenileme tarihine kadar devam eder. Uygulamanın doğru yetkiyi verdiğinden emin olmak için queryPurchasesAsync(), değiştirme işlemi gerçekleşene kadar orijinal satın alma jetonu ve orijinal yetkiyle birlikte bir satın alma nesnesi döndürür.

Yeni satın alma jetonu gösterilmediğinden şu anda işlenemiyor.

PurchasesUpdatedListener, satın alma işleminden sonra yükseltme veya eski sürüme geçirme işleminin başarılı olup olmadığına dair bir durumla birlikte çağrılır.

queryPurchasesAsync(), yeni satın alma jetonu ve bununla ilişkili orijinal hak ile birlikte satın alma işlemini hemen iade eder.

Yeni satın alma jetonu gösterilir. Bu nedenle, değiştirme işleminin ne zaman yapılacağı dikkate alınarak bu noktada işlenmelidir.

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

SUBSCRIPTION_PURCHASED RTDN, satın alma akışından sonra gönderilmez. Arka uç, yeni satın alma işleminden henüz haberdar değildir.

Eski product_id ile SUBSCRIPTION_PURCHASED RTDN, yeni satın alma jetonu için satın alma sürecinden hemen sonra gönderilir.

Yeni satın alma jetonuyla purchases.subscriptionsv2.get yöntemini çağırmak, satın alma zamanını belirten bir "startTime" değerine sahip ve iki satır öğesi içeren bir satın alma işlemi döndürür:

  • Eski yetkilendirmeyi temsil eden ve gelecekte bir "expiryTime" değeri içeren. Eski kazanılmış hak yenilenmez ve yeni kazanılmış hakkın ürününü içeren bir DeferredItemReplacement'a sahiptir. Bu, eski hak süresi dolduğunda yerine yenisinin atanacağını gösterir.
  • Yeni satın alınan hakları temsil eden bir öğe. "expiryTime" için değer ayarlanmamış.

Eski satın alma jetonu için SUBSCRIPTION_EXPIRED gönderildi. purchases.subscriptionsv2.get yöntemi old satın alma jetonuyla çağrıldığında, süresi dolmuş olarak görünür (eski planın hakkı, kalan süre için yeni satın alma işlemine aktarılır).

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

queryPurchasesAsync(), yeni satın alma jetonu ve yetkilendirmeyle yeni bir Purchase nesnesi döndürür.

Yeni satın alma jetonu artık gösteriliyor. Bu nedenle işlenmesi gerekir.

queryPurchasesAsync(), yeni satın alma jetonu ve bununla ilişkili yeni hak ile birlikte satın alma işlemini hemen 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. Bu nedenle, uygulamanın doğru yetkinin verildiğinden emin olmanın dışında herhangi bir özel işlem yapması gerekmez.

Değiştirme işleminde: Satın alma akışından (arka uç) sonraki ilk yenileme

Yeni satın alma işlemi, ilk SUBSCRIPTION_RENEWED RTDN gönderildiğinde işlenebilir ve onaylanabilir.

Abonelik kaynağındaki linkedPurchaseToken, abonelik arka ucunuzda hangi kullanıcının (varsa) yeni hakla güncellenmesi gerektiğini belirlemek için kullanılabilir.

Yeni satın alma işlemi, yeni satın alma jetonu için SUBSCRIPTION_PURCHASED RTDN gönderildiğinde işlenip onaylandı ve "startTime" olarak kaydedildi.

ReplacementMode.DEFERRED ile ilk yenilemeler, diğer yenilemelerin standart davranışını izler ve bu etkinlik gerçekleştiğinde değiştirmeler için özel bir mantık uygulamanız gerekmez.

Yeni satın alma jetonuyla purchases.subscriptionsv2.get yöntemi çağrıldığında iki satır öğesi içeren bir satın alma işlemi döndürülür:

  • Geçmişte bir "expiryTime" değerine sahip olan ve DeferredItemReplacement için ayarlanmış bir değeri olmayan eski hak.
  • Gelecekteki bir "expiryTime" ile yeni yetkilendirmeyi temsil eden ve auto_renewing_enabled işareti etkinleştirilmiş bir öğe.

Kullanım hakkı değişiklikleriyle ilgili olarak aynı davranışı sergilediği ancak satın alma işlemini diğer yeni satın alma işlemlerinin davranışlarıyla daha tutarlı bir şekilde yönetme olanağı sunduğu için, kullanımdan kaldırılan ProrationMode.DEFERRED yerine artık ReplacementMode.DEFERRED kullanılmalıdır.

Müşteri yönetimi

Gerçek zamanlı geliştirici bildirimlerini kullanarak kullanıcıların iptal etmeye karar verdiği anı anında tespit edebilirsiniz. Kullanıcılar abonelikleri sona ermeden önce aboneliklerini iptal ettiğinde onlara yeniden abone olmalarını isteyen push bildirimleri veya uygulama içi mesajlar gönderebilirsiniz.

Aboneliğini iptal eden bir kullanıcıyı uygulamanızda veya Play Store'da geri kazanmayı deneyebilirsiniz. Aşağıdaki tabloda, çeşitli abonelik senaryoları, ilişkili yeniden kazanma işlemleri ve uygulama gereksinimleri açıklanmaktadır.

Abonelik süresi dolmadan önce Abonelik süresi dolduktan sonra
Uygulama içi Play Store'da Uygulama içi Play Store'da
Geri kazanma özelliği Uygulama içi abonelik Geri yükle Uygulama içi abonelik Yeniden abone olun
Kullanıcı, ödeme adımlarını tamamlar Evet Hayır Evet Evet
Kullanıcı aboneliği aynı SKU ile ilişkilendirilmeye devam eder Kullanıcı aynı veya farklı SKU'ya kaydolabilir Evet Kullanıcı aynı veya farklı SKU'ya kaydolabilir Evet
Yeni satın alma jetonu oluşturur Evet Hayır Evet Evet
Varsayılan olarak etkindir Hayır Evet, tüm geliştiriciler için destek gerekir Hayır

Faturalandırma Kitaplığı 2.0 veya sonraki sürümlerin kullanılmadığı uygulamalar: Hayır

Faturalandırma Kitaplığı 2.0 veya daha yeni bir sürümünü kullanan uygulamalar: Evet. Geliştiriciler Console'da bu özelliği devre dışı bırakabilir.

Kullanıcıdan ödeme alındığında

Aynı SKU kullanılıyorsa: Geçerli fatura döneminin sonu.

Farklı SKU kullanılıyorsa: Orantılı ödeme moduna bağlıdır.

Geçerli fatura döneminin sonu Hemen Hemen
Uygulama gerekli Uygulamanızda yeniden kaydolma kullanıcı arayüzü sağlama

Abonelik durumundaki değişikliği algılama

Play Store'a derin bağlantı

Uygulamanızda yeniden kaydolma kullanıcı arayüzü sağlama Uygulama dışı satın alma işlemlerini yönetme

Abonelik sona ermeden önce (uygulama içi)

İptal edilmiş ancak henüz süresi dolmamış aboneliklerde, yeni aboneler için geçerli olan aynı uygulama içi ürün satın alma akışını uygulayarak abonelerin aboneliklerini uygulamanızda geri yüklemelerine izin verebilirsiniz. Kullanıcı arayüzünüzde, kullanıcının mevcut bir aboneliği olduğunu gösterin. Örneğin, kullanıcının mevcut son kullanma tarihini ve yinelenen fiyatını Yeniden etkinleştir düğmesiyle birlikte göstermek isteyebilirsiniz.

Çoğu zaman, kullanıcıya daha önce abone olduğu fiyatı ve SKU'yu aşağıdaki şekilde sunmak isteyeceksiniz:

  • Aynı SKU ile yeni bir abonelik satın alma işlemi başlatın.
  • Yeni abonelik, eski aboneliğin yerini alır ve aynı son kullanma tarihinde yenilenir. Eski abonelik hemen süresi dolmuş olarak işaretlenir.
  • Örneğin, Akhilleus, Örnek Müzik Uygulaması'na abone ve aboneliğin süresi 1 Ağustos'ta dolacak. 10 Temmuz'da aylık aboneliğe aynı aylık fiyatla yeniden abone oluyor. Yeni abonelik, kalan krediyle orantılı olarak ücretlendirilir, hemen etkinleştirilir ve 1 Ağustos'ta yenilenmeye devam eder.

Farklı bir fiyat (ör. yeni bir ücretsiz deneme veya geri kazanma indirimi) sunmak isterseniz kullanıcıya farklı bir SKU sunabilirsiniz:

  • Değiştirme modunu WITHOUT_PRORATION kullanarak farklı bir SKU ile üst veya alt sürüme geçiş başlatın.
  • Yeni abonelik, eski aboneliğin yerini alır ve aynı son kullanma tarihinde yenilenir. Kullanıcıdan, yeni SKU'nun fiyatı (tanıtım fiyatları dahil) orijinal son kullanma tarihinde tahsil edilir. Eski abonelik, kimliği karartılmış bir hesap kullanılarak oluşturulduysa yükseltme ve düşürme işlemleri için aynı kimliğin BillingFlowParams'ye iletilmesi gerekir.
  • Örneğin, Akhilleus, Örnek Müzik Uygulaması'na abone ve aboneliğin süresi 1 Ağustos'ta dolacak. 10 Temmuz'da tanıtım fiyatlı bir yıllık aboneliğe yeniden abone olur. Yeni abonelik hemen etkinleştirilir ve kullanıcıdan 1 Ağustos'ta tanıtım fiyatı alınır.
  • Geri kazanma SKU'nuza ücretsiz deneme veya tanıtım fiyatı eklemeye karar verirseniz Google Play Console'da Uygulama başına bir ücretsiz denemeye izin ver kutusunun işaretini kaldırarak kullanıcının uygun olduğundan emin olun. Bu kutu, kullanıcının uygulama başına bir ücretsiz deneme almasını kısıtlar.

Satın alma jetonunu aldığınızda satın alma işlemini yeni bir abonelikle aynı şekilde işleyin. Ayrıca, Google Play Developer API, abonelik kaynağında linkedPurchaseToken döndürür. Eski jetonun hizmetlerinize erişmek için kullanılmadığından emin olmak üzere linkedPurchaseToken içinde sağlanan jetonu geçersiz kıldığınızdan emin olun.

Abonelik süresi dolmadan önce - Play Store'da

Abonelik iptal edilmiş ancak hâlâ etkin durumdayken kullanıcılar, Google Play abonelik merkezinde Yeniden abone ol'u (eski adıyla Geri yükle) tıklayarak aboneliği geri yükleyebilir. Bu işlem, aynı abonelik ve satın alma jetonunu korur.

Google Play Store uygulamasındaki abonelikler bölümünde, yeniden abone ol düğmesiyle birlikte iptal edilmiş bir abonelik gösteriliyor.
Şekil 8. Google Play Store uygulamasındaki Hesap > Abonelikler bölümünde, iptal edilmiş bir abonelik ve Yeniden abone ol düğmesi gösteriliyor.

Abonelikleri geri yükleme hakkında daha fazla bilgi için Geri yüklemeler başlıklı makaleyi inceleyin.

Abonelik süresi dolduktan sonra - uygulama içi

Aynı uygulama içi ürün satın alma akışını yeni aboneler için olduğu gibi uygulayarak süresi dolmuş abonelerin uygulamanızda yeniden abone olmalarına izin verebilirsiniz. Aşağıdakileri göz önünde bulundurun:

  • Kullanıcılara indirim sunmak için aboneliğinizde özel fiyatlandırma uygulanan bir ürün kimliği (geri kazanma SKU'su olarak da bilinir) sunabilirsiniz. Teklifi uygulamanızda sunabilir veya kullanıcıyı tekliften uygulama dışında (ör. e-posta yoluyla) haberdar edebilirsiniz.
  • Kullanıcıları geri kazanmaya yönelik abonelik başlatmak için Google Play Faturalandırma Kitaplığı'nı kullanarak Android uygulamanızda satın alma akışını başlatın. Bu işlem, yeni abonelikle aynıdır ancak kullanıcıya sunulan SKU'yu belirleyebilirsiniz.
  • Geri kazanma SKU'nuza ücretsiz deneme veya tanıtım fiyatı eklemeye karar verirseniz Google Play Console'da Uygulama başına bir ücretsiz denemeye izin ver kutusunun işaretini kaldırarak kullanıcının uygun olduğundan emin olun. Bu kutu, kullanıcının uygulama başına bir ücretsiz deneme almasını kısıtlar.
  • Kullanıcı aynı SKU'ya yeniden abone olursa ücretsiz deneme veya tanıtım fiyatı için uygunluk koşullarını karşılamaz. Kullanıcı arayüzünüzün bunu yansıttığından emin olun.

Satın alma jetonunu aldığınızda satın alma işlemini yeni bir abonelikle aynı şekilde işleyin. Abonelik kaynağında linkedPurchaseToken almazsınız.

Abonelik süresi dolduktan sonra - Play Store'da

Etkinleştirilirse kullanıcılar, Google Play abonelik merkezinde Yeniden abone ol'u tıklayarak aynı SKU'ya aboneliklerini, süresi dolduktan sonraki bir yıl içinde yeniden başlatabilirler. Bu işlem sonucunda yeni bir abonelik ve satın alma jetonu oluşturulur.

Google Play Store uygulamasındaki abonelikler bölümünde, yeniden abone olma ve kaldırma düğmelerinin bulunduğu iptal edilmiş ve süresi dolmuş bir abonelik gösteriliyor.
Şekil 9. Google Play Store uygulamasındaki Hesap > Abonelikler bölümünde, iptal edilmiş ve süresi dolmuş bir abonelik ile Yeniden abone ol ve Kaldır düğmeleri gösteriliyor.

Yeniden abone olma işlemi, uygulama dışı satın alma işlemi olarak kabul edilir. Bu nedenle, uygulamanızın dışından yapılan satın alma işlemlerini yönetmeye yönelik en iyi uygulamaları uyguladığınızdan emin olun.

Aboneliğinizi tanıtma

Belirli kullanıcılara mevcut bir aboneliğin ücretsiz deneme süresini uzatmak için promosyon kodları oluşturabilirsiniz. Daha fazla bilgi edinmek için Promosyon kodları başlıklı makaleyi inceleyin.

Google Play, ücretsiz denemelerde deneme süresi başlamadan önce kullanıcının geçerli bir ödeme yöntemi olduğunu doğrular. Bazı kullanıcılar bu doğrulamayı ödeme yöntemlerinde bekletme veya ödeme olarak görebilir. Bu provizyon veya ödeme geçicidir ve daha sonra geri alınır ya da iade edilir.

Deneme süresi sona erdikten sonra kullanıcının ödeme yönteminden tam abonelik tutarı alınır.

Kullanıcının ücretsiz deneme süresinin herhangi bir noktasında aboneliği iptal etmesi halinde abonelik, denemenin sonuna kadar etkin kalır ve ücretsiz deneme süresi sona erdiğinde kullanıcıdan ücret alınmaz.

İptal etme veya geri alma

Aboneliği iptal veya geri almak için Google Play Developer API'yi kullanabilirsiniz. Bu işlev Google Play Console'da da kullanılabilir.

  • İptal: Kullanıcılar, Google Play'de abonelikleri iptal edebilir. Ayrıca, uygulamanızda veya web sitenizde kullanıcıların aboneliği iptal etmesine olanak tanıyan bir seçenek de sunabilirsiniz. Uygulamanız, bu iptalleri İptaller bölümünde açıklandığı şekilde işlemelidir.

  • İptal etme: İptal ettiğinizde kullanıcı, aboneliğe erişimi hemen kaybeder. Örneğin, kullanıcının ürününüze erişmesini engelleyen teknik bir hata oluştuysa ve kullanıcı ürünü kullanmaya devam etmek istemiyorsa bu seçenek kullanılabilir. Uygulamanız, bu iptalleri Geri Alma bölümünde açıklandığı şekilde işlemelidir.

Aşağıdaki tabloda iptal etme ve geri alma arasındaki farklar gösterilmektedir.

Yenilemeyi durdurur Erişimi iptal etme
İptal Evet Hayır
İptal et Evet Evet

Bir abone için faturalandırmayı erteleme

Google Play Developer API'den Purchases.subscriptions:defer kullanarak otomatik yenilenen aboneliklerde bir sonraki faturalandırma tarihini öne çekebilirsiniz. Erteleme süresi boyunca kullanıcı, içeriğinize tam erişimle abone olur ancak ödeme yapmaz. Abonelik yenileme tarihi, yeni tarihi yansıtacak şekilde güncellenir.

Ön ödemeli planlarda, son kullanma süresini ertelemek için faturalandırmayı erteleme API'sini kullanabilirsiniz.

Ertelenmiş faturalandırma, aşağıdakileri yapmanıza olanak tanır:

  • Kullanıcılara özel teklif kapsamında ücretsiz erişim verin. Örneğin, film satın alan kullanıcılara bir hafta ücretsiz erişim verin.
  • Müşterilere iyi niyetinizin göstergesi olarak ücretsiz erişim hakkı tanıyabilirsiniz.

Faturalandırma, API çağrısı başına en az bir gün, en fazla bir yıl ertelenebilir. Faturalandırmayı daha da ertelemek için yeni fatura tarihi gelmeden önce API'yi tekrar çağırabilirsiniz.

Örneğin, Deniz, Fishing Quarterly uygulaması için aylık online içerik aboneliğine sahip. Normalde her ayın ilk günü 1,25 GBP faturalandırılıyor. Mart ayında, uygulama yayıncısı için bir online ankete katıldı. Yayıncı, bir sonraki ödemeyi 15 Mayıs'a (önceden planlanan faturalandırma tarihi olan 1 Nisan'dan altı hafta sonra) erteleyerek aboneyi altı haftalık ücretsiz abonelikle ödüllendirir.

  1. Darcy'den nisan ayı veya mayıs ayının başı için ödeme alınmaz ve içeriğe erişimi devam eder. 15 Mayıs'ta, o ay için normal 1,25 sterlinlik abonelik ücreti alınır. Bir sonraki yenileme tarihi 15 Haziran olarak belirlendi.

Ödemeyi ertelediğinizde, kullanıcının fatura tarihinin değiştiğini e-posta yoluyla veya uygulama içinde bildirmek isteyebilirsiniz.

Reddedilen ödemeleri işleme

Abonelik yenileme ile ilgili ödeme sorunları varsa Google, iptal etmeden önce bir süre boyunca aboneliği yenilemeyi düzenli aralıklarla dener. Kurtarma döneminde varsayılan olarak verilen ek süreyi takiben hesap askıya alınır. Google, bu süre zarfında kullanıcıya ödeme yöntemini güncellemesini isteyen e-postalar ve bildirimler gönderir.

Ödeme reddedildiğinde, yapılandırılmışsa abonelik ek süreye girer. Ek süre boyunca kullanıcının abonelik haklarına erişmeye devam etmesini sağlamalısınız.

Ek süre sona erdiğinde abonelikte hesap askıya alınır. Hesap askıya alındığı sırada kullanıcının abonelikten yararlanma haklarına erişemediğinden emin olmalısınız.

Google Play Console'da her otomatik yenilenen temel planın ek süresinin ve hesabı askıya alma süresinin uzunluğunu belirleyebilirsiniz. Uzunlukların varsayılan değerlerden daha kısa belirlenmesi, reddedilen ödeme durumlarında kurtarılan abonelik sayısını azaltabilir.

Ödeme reddedildiğinde aboneliğin kurtarılma olasılığını en üst düzeye çıkarmak için kullanıcınızı ödeme sorunu hakkında bilgilendirebilir ve sorunu düzeltmesini isteyebilirsiniz.

Bu işlemi, ek süre ve hesabı bekletme bölümlerinde açıklandığı gibi kendiniz yapabilir veya Google'ın uygulamanızdaki kullanıcılara mesaj gösterdiği uygulama içi mesajlaşma API'sini uygulayabilirsiniz.

Uygulama içi mesajlaşma

InAppMessageCategoryId.TRANSACTIONAL ile uygulama içi mesajlaşmayı etkinleştirdiyseniz Google Play, ödeme süresi ve hesap askıya alma döneminde kullanıcılara günde bir kez mesajlaşma gösterir ve uygulamadan çıkmadan ödemelerini düzeltme fırsatı sunar.

Kullanıcıya ödemesini düzeltmesini bildiren snackbar
Şekil 20. Kullanıcıya ödemesini düzeltmesini bildiren snackbar.

Mesajın gösterilip gösterilmeyeceğini belirlemek için kullanıcı uygulamayı her açtığında bu API'yi çağırmanızı öneririz.

Kullanıcı aboneliğini başarıyla kurtarırsa satın alma jetonuyla birlikte SUBSCRIPTION_STATUS_UPDATED yanıt kodunu alırsınız. Ardından, Google Play Developer API'yi çağırmak ve uygulamanızdaki abonelik durumunu yenilemek için bu satın alma jetonunu kullanmanız gerekir.

Uygulama içi mesajlaşmayı entegre etme

Kullanıcıya uygulama içi mesajlaşmayı göstermek için BillingClient.showInAppMessages() kullanın.

Uygulama içi mesajlaşma akışını tetikleme örneğini aşağıda görebilirsiniz:

Kotlin

val inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build()

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        object : InAppMessageResponseListener() {
            override fun onInAppMessageResponse(inAppMessageResult: InAppMessageResult) {
                if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        })

Java

InAppMessageParams inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build();

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        new InAppMessageResponseListener() {
            @Override
            public void onInAppMessageResponse(InAppMessageResult inAppMessageResult) {
                if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        });

Beklemedeki abonelik işlemlerini yönetme

Beklemede olan işlemler, ilk satın alma, yükleme, yükseltme veya sürüm düşürme işlemlerinde gerçekleşebilir. Abonelik satın alma işlemi, SUBSCRIPTION_STATE_ACTIVE durumuna geçmeden önce SUBSCRIPTION_STATE_PENDING durumuyla başlar. İşlemin süresi dolmuşsa veya kullanıcı tarafından iptal edilmişse SUBSCRIPTION_STATE_PENDING_PURCHASE_EXPIRED'ya gider. Kullanıcının hakkını yalnızca işlem tamamlandıktan sonra güncellemeniz gerekir.

Bekleyen işlemleri olan ilk satın alma işleminde abonelik durumu değişikliği kolayca yapılabilir. Kullanıcı bekleyen bir işlem başlattığında uygulamanız Purchase durumunda PENDING alır. İşlem tamamlandığında uygulamanız, durumu PURCHASED olarak güncellenmiş Purchase değerini tekrar alır. SUBSCRIPTION_PURCHASED türünde bir SubscriptionNotification mesajı, RTDN istemcinize gönderilir. Satın alma işlemini doğrulama, kullanıcıya içeriğe erişim izni verme ve satın alma işlemini onaylama için uygulanan normal süreci takip edin. İşlem sona ererse veya iptal edilirse RTDN istemcinize SubscriptionNotification türünde bir SUBSCRIPTION_PENDING_PURCHASE_CANCELED mesajı gönderilir. Bu gibi durumlarda kullanıcı, içeriğe hiçbir zaman erişmemelidir.

Bekleyen işlemleri kullanarak yükleme yapma, üst sürüme geçme veya alt sürüme geçme işlemleri hem eski hem de yeni aboneliklerde durum değişiklikleri içerir. Kullanıcı, bekleyen bir üst pakete geçme veya alt pakete geçme işlemi başlattığında uygulamanız, PendingPurchaseUpdate nesnesiyle eski abonelik için Purchase alır. Bu durumda kullanıcı, eski aboneliğe sahip olmaya devam eder ve henüz yeni aboneliği almamıştır. PendingPurchaseUpdate nesnesinde getProducts() ve getPurchaseToken() çağrıldığında yeni aboneliğin ürün kimlikleri ve satın alma jetonu döndürülür. İşlem tamamlandığında uygulamanız, yeni abonelik için üst düzey satın alma jetonu ayarlanmış ve durumu PURCHASED olarak belirlenmiş bir Purchase alır. RTDN istemcinize, türü SUBSCRIPTION_PURCHASED olan bir SubscriptionNotification mesajı gönderilir. Yalnızca bu durumda eski satın alma jetonunu yeni satın alma jetonuyla değiştirmeniz ve kullanıcının içeriğe erişimini güncellemeniz gerekir. İşlemin süresi dolarsa veya işlem iptal edilirse RTDN istemcinize türü SUBSCRIPTION_PENDING_PURCHASE_CANCELED olan bir SubscriptionNotification mesajı gönderilir. Bu gibi durumlarda kullanıcı, eski aboneliğin içeriğine erişmeye devam edebilir.