Abonelik yaşam döngüsü

Abonelik satın alma işlemleri, yaşam döngüleri boyunca otomatik yenileme davranışı, ödeme reddi durumları ve geliştirici yönetim işlemleri gibi birçok faktöre bağlı olarak çeşitli durumlardan geçebilir.

Otomatik yenilenen aboneliklerin yaşam döngüsünü yönetme

Bir kullanıcının abonelik durumu değiştiğinde arka uç sunucunuz bir SubscriptionNotification mesajı alır.

subs-auto-renew-state
1. şekil. Otomatik yenilenen abonelik satın alma işlemleri için yaşam döngüsü durumları ve geçiş etkinlikleri.

Arka uçtaki durumu güncellemek için bildirime dahil edilen satın alma jetonuyla purchases.subscriptionsv2.get API'sini çağırın. Bu uç nokta, satın alma jetonu verildiğinde en son abonelik durumunu sağlar ve abonelik yönetimi için doğru kaynak olarak kabul edilir.

Satın alma jetonu, aboneliğe kaydolma tarihinden itibaren geçerlilik süresinin bitiminden sonraki 60 güne kadar geçerlidir. Bu tarihten sonra, Google Play Geliştirici API'sini çağırmak için satın alma jetonu artık geçerli olmayacak.

Yeni otomatik yenilenen abonelik satın alma işlemleri

Kullanıcı bir abonelik satın aldığında, RTDN istemcinize türü SUBSCRIPTION_PURCHASED olan bir SubscriptionNotification mesajı gönderilir. Bu bildirimi alsanız da PurchasesUpdatedListener üzerinden uygulama içi yeni bir satın alma işlemi kaydetseniz veya uygulamanızın onResume() yönteminde satın alma işlemlerini manuel olarak getirseniz de yeni satın alma işlemini güvenli arka uç sisteminizde işlemeniz gerekir. Bunu yapmak için şu adımları uygulayın:

  1. En son abonelik durumunu içeren bir abonelik kaynağı almak için purchases.subscriptionsv2.get uç noktasını sorgulayın.
  2. subscriptionState alanının değerinin SUBSCRIPTION_STATE_ACTIVE olduğundan emin olun.
  3. Satın alma işlemini doğrulayın.
  4. Kullanıcıya içeriğe erişim izni verin. Satın alma işlemiyle ilişkili kullanıcı hesabı, satın alma sırasında setObfuscatedAccountId ve setObfuscatedProfileId kullanılarak tanımlayıcılar ayarlandıysa abonelik kaynağındaki ExternalAccountIdentifiers nesnesiyle tanımlanabilir.

Play Faturalandırma Kitaplığı'nda aboneliği onaylama yöntemi (acknowledgePurchase()) ve onay durumunu kontrol etme yöntemi (isAcknowledged()) de bulunur. Ancak daha iyi güvenlik için satın alma işlemlerini arka uçta işlemenizi öneririz.

Yeni satın alma işlemlerine ait abonelik kaynağı aşağıdaki örneğe benzer:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Abonelik yenilemeleri

Taksitli olmayan ve otomatik yenilenen aboneliklerde, abonelik yenilendiğinde SUBSCRIPTION_RENEWED bildirim gönderilir. Taksitli aboneliklerde, abonelik faturalandırma tarihinde her ücretlendirildiğinde SUBSCRIPTION_RENEWED bildirimi gönderilir. Kullanıcının abonelikten yararlanmaya devam ettiğinden emin olun ve ardından Google Play Developer API'den döndürülen abonelik kaynağında sağlanan yeni expiryTime ile abonelik durumunu güncelleyin. Abonelik kaynağı aşağıdaki örneğe benzer:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ]
}

Abonelik yenilemelerini onaylamanız gerekmez.

Ek süre

Abonelik yenileme ile ilgili ödeme sorunları varsa Google, kullanıcıyı bilgilendirir ve aboneliğin süresi dolmadan önce bir süre boyunca aboneliği yenilemeyi düzenli aralıklarla dener. Kurtarma döneminde verilen ek süreyi takiben hesap askıya alınabilir. Ek süre boyunca kullanıcı, abonelikten yararlanma hakkına erişmeye devam etmelidir.

queryPurchasesAsync() yöntemi, ek süre içinde olan satın alma işlemlerini döndürmeye devam eder. Uygulamanız, kullanıcının abonelik hakkı olup olmadığını kontrol etmek için yalnızca queryPurchasesAsync kullanıyorsa bu abonelikler Play Faturalandırma Kitaplığı aracılığıyla etkin olarak gösterildiğinden uygulamanız, ödeme sürelerini otomatik olarak yönetmelidir.

Abonelik durumunu arka uçunuzla senkronize etmek, ödeme reddetme durumlarından daha fazla haberdar olmanızı sağlar ve istem dışı müşteri kaybını azaltmaya çalışırken daha fazla bağlam bilgisi sunar. Kullanıcı ek süreye girdiğinde bildirim almak için SUBSCRIPTION_IN_GRACE_PERIOD türünde SubscriptionNotification mesajlarını dinleyin. Kullanıcı ek süre içindeyken subscription resource autoRenewEnabled = true içerir. Google Play, ek yayınlanma süresi sona erene kadar expiryTime değerini dinamik olarak uzatır. Bunun nedeni, kullanıcının iptal etmesine veya ek yayınlanma süresinin maksimum uzunluğuna ulaşmasına kadar hakların geçerli olmasıdır. Bu dönemde subscriptionState alanının değeri SUBSCRIPTION_STATE_IN_GRACE_PERIOD. Abonelik kaynağı aşağıdaki örneğe benzer:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Play, ek süre içinde olan kullanıcıları ödemelerinin reddedildiği konusunda bilgilendirir ve Play Store'da ödeme yöntemiyle ilgili sorunlarını düzeltmelerini ister. Kullanıcı ek süreye girdiğinde, başarısızlığın istem dışı olması ihtimaline karşı ödeme yöntemini düzeltmesini de teşvik etmelisiniz. Bunu yapmanın basit bir yolu In-App Messaging API'yi kullanmaktır. Bu API'yi kullanıcı uygulamanızı açtığında çağırırsanız kullanıcıya, ödemesinin reddedildiğini bildiren geçici bir snackbar'da Play mesajı gösterilir. Bu mesajda, kullanıcının Google Play'de ödeme yöntemini düzeltmesi için derin bağlantı da yer alır.

Kullanıcı ödeme yöntemini düzelttiği anda abonelik, orijinal yenileme tarihiyle yenilenir ve yenilemeyi Yenilemeler bölümünde açıklandığı şekilde işleyebilirsiniz.

Kullanıcı, ek süre içinde ödeme yöntemini düzeltmezse abonelik hesap askıya alma durumuna geçer ve kullanıcı, abonelikten yararlanma hakkını kaybeder.

Ek kullanım süresi erişimi ve kurtarma

Şekil 2'de, ek süreye giren ve kullanıcı ödeme yöntemini düzelttiğinde kurtarılan bir aboneliğin zaman çizelgesi gösterilmektedir. Ek süre sona erdiğinde kullanıcının abonelik avantajlarını kaybetmesi ve hesabının askıya alınması gerekir.

Şekil 2. Ek kullanım süresine giren ve bu süre sona ermeden önce kurtarılan bir aboneliğin zaman çizelgesi

Aşağıdaki noktaları unutmayın:

  • Ek süre boyunca kullanıcı, abonelik avantajlarına erişmeye devam etmelidir.
  • Bir abonelik ek süre içinde kurtarıldığında yenileme tarihi sıfırlanmaz.
  • Ek süreyi artırırsanız (örneğin, 7 günden 14 güne çıkarırsanız) ek süre içinde olan kullanıcılar abonelik avantajlarına daha uzun süre erişebilir.
  • Ek süreyi kısaltırsanız eski ek sürenin yeni ek süreyi aşacak kadar ilerisinde olan kullanıcıların abonelik avantajları hemen iptal edilir. Örneğin, ek süreyi 14 günden 7 güne düşürürseniz eski ek sürenin 8-14. günlerinde olan kullanıcıların abonelik avantajları hemen iptal edilir.
  • Abonelik etkin durumda kalır ve sessiz ek süre sona erene kadar ek süre RTDN'si almazsınız.

Sessiz ek süre

0 gün ek süre belirleyebilirsiniz ancak Play, ödeme yeniden denemeleri için yeterli süre sağlamak amacıyla en az 1 gün bekler. Bu sessiz ek süre, ödeme işlemleri için bir güvenlik ağı sunar. Bu 24 saatlik süre boyunca abonelik ACTIVE durumunda kalır.

Abonelik durumu değişiklikleriyle ilgili güncel kalmanın en iyi yolu, gerçek zamanlı geliştirici bildirimlerini (RTDN) dinleyip bunlara tepki vermektir. Aboneliğin daha doğru durumunu almak için son kullanma tarihi yerine RTDN zamanında purchases.subscriptionsv2.get() yöntemini çağırın.

24 saatlik sessiz ek süre sonrasındaki abonelik durumuna bağlı olarak aşağıdaki bildirimlerden birini alırsınız:

  • SUBSCRIPTION_ON_HOLD (etkinse)
  • SUBSCRIPTION_CANCELED (iptal edildiyse)
  • SUBSCRIPTION_EXPIRED (süresi dolduysa)
  • SUBSCRIPTION_RENEWED (başarıyla yenilendiyse)

Aboneliğin en son durumunu almak için 24 saatlik sessiz ek süre sona erdikten sonra da subscriptionV2.get() yöntemini çağırabilirsiniz.

Hesabı askıya alma

Abonelik yenilemeyle ilgili ödeme sorunları varsa ek süre sona erdiğinde hesap askıya alınır. Bir abonelik, hesap askıya alma durumuna girdiğinde abonelikten yararlanma hakkına erişimi engellemeniz gerekir.

Hesap bekletme süresi boyunca, abonelik bekletmedeyken kullanıcının bu değişiklikleri yapması mümkün olduğundan, gerektiğinde abonelik iptallerini, geri yüklemeleri veya yeniden satın alma işlemlerini yönetmeye devam etmeniz gerekir.

RTDN'ler, kullanıcı hesap bekletme dönemine girdiğinde sizi bilgilendirir. Böylece, kullanıcılara aboneliğe erişimlerinin neden askıya alındığını en kısa sürede bildirebilirsiniz. Bunu yapmanın basit bir yolu In-App Messaging API'yi kullanmaktır. Kullanıcınız uygulamayı açtığında bu API'yi çağırmak, kullanıcıya ödemesinin reddedildiğini bildiren geçici bir snackbar mesajı gösterir. Bu mesajda, kullanıcının Google Play'de ödeme yöntemini düzeltmesi için bir derin bağlantı da yer alır.

Kullanıcılarınız, abonelik içeriğine uygulamanızın dışında erişebiliyorsa farklı platformlarda erişimlerini kaybettiklerini fark edebilir. Kullanıcıya, ödeme reddedildiği için aboneliğinin artık etkin olmadığını bildirmek üzere push bildirimi veya e-posta gönderebilirsiniz.

Abonelik, hesap bekletme sırasında queryPurchasesAsync() yöntemiyle döndürülmez. Bu nedenle, uygulamanız mevcut satın alma işlemlerini göstermek için bu yöntemi kullanıyorsa hesap bekletmeyi varsayılan olarak desteklemeniz gerekir.

Gerçek zamanlı geliştirici bildirimleri ile bir abonelik hesap askıya alma durumuna girdiğinde SUBSCRIPTION_ON_HOLD türünde bir SubscriptionNotification mesajı alırsınız. Yeni abonelik bilgilerini almak için güvenli arka uç sunucunuzdan purchases.subscriptionsv2.get yöntemini çağırın. Hesabı askıya alma süresince subscription resource'un expiryTime alanı geçmiş bir zaman damgasına, subscriptionState alanı ise SUBSCRIPTION_STATE_ON_HOLD olarak ayarlanır:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Erişimi geri yüklemek için kullanıcıların ödeme yöntemlerini düzeltmeleri gerekir. Play, hesapları ödeme bekletme durumunda olan kullanıcıları ödemelerinin reddedildiği konusunda bilgilendirir. Ayrıca, kullanıcıları ödeme yöntemlerini düzeltmeye teşvik etmeniz gerekir.

Kullanıcı ödeme yöntemini düzelttikten sonra abonelik etkin duruma döner ve abone olunan içeriğe erişimi geri yüklemeniz gerekir. Bu durumda, aynı satın alma işlemi kurtarıldığı ve SUBSCRIPTION_RECOVERED türünde bir RTDN aldığınız için satın alma jetonu, hesap bekletme işlemi başlamadan öncekiyle aynıdır.

Taksitli aboneliklerde, her ödeme denemesinde ödeme reddedilebilir ve ödeme alınabilir.

Kurtarma işleminden sonra Play Faturalandırma Kitaplığı, aboneliği queryPurchasesAsync() yöntemiyle tekrar döndürür. Bir kullanıcının abonelikten yararlanma hakkı olup olmadığını belirlemek için bu yöntemi kullanıyorsanız uygulamanız, aboneliğin hesap bekletme durumundan kurtarılmasını otomatik olarak yönetmelidir.

Abonelik kurtarıldığında ve kullanıcının erişimi yeniden kazanması gerektiğinde bildirim almak için SUBSCRIPTION_RECOVERED türünde bir SubscriptionNotification mesajını dinleyin. Bu bildirimi aldıktan sonra bir abonelik için sorgu gönderirseniz expiryTime alanı gelecekteki bir zaman damgası olarak, subscriptionState alanı ise tekrar SUBSCRIPTION_STATE_ACTIVE olarak ayarlanır:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      ...
    }
  ],
}

Kullanıcı, hesap bekletme süresi sona ermeden önce ödeme yöntemini düzeltmezse bunun yerine türü SUBSCRIPTION_CANCELED olan bir RTDN alırsınız. İptal işlemini gerçekleştirme talimatları için İptaller başlıklı makaleyi inceleyin. Bu şekilde iptal edilen bir abonelik için sorgu gönderdiğinizde, döndürülen expiryTime alanı geçmiş bir zaman damgası olarak ayarlanır:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

Hesap bekletme sırasında iptalden hemen sonra, kullanıcı ücretli haklardan yararlanamadığı ve abonelik iptal edildiği için SUBSCRIPTION_EXPIRED türünde bir RTDN de alırsınız. Bu sürenin dolmasını normalde yaptığınız gibi ele alabilirsiniz.

Kullanıcı, aynı abonelik planını veya hesabının bekletildiği süre boyunca uygulamada sunduğunuz diğer planlardan herhangi birini orijinal satın alma işleminden yeniden satın alarak erişimi tekrar kazanabilir. Bu durumda, yeni bir satın alma jetonu verilir ve yeni değer, bu yeni örneği temsil eden bir SUBSCRIPTION_PURCHASED etkinliğinin parçası olarak döndürülür.

Hesabı askıya alma erişimi ve kurtarma

Şekil 3'te, hesap askıya alma durumuna giren ve kullanıcı ödeme yöntemini düzelttiğinde kurtarılan bir aboneliğin zaman çizelgesi gösterilmektedir.

3.şekil Hesabı askıya alınmış duruma giren ve sona ermeden önce kurtarılan aboneliğin zaman çizelgesi

Önceki örneğe benzer şekilde, Şekil 4'te önce ek kullanım süresine giren, ardından hesap askıya alınma durumuna geçen ve askıya alınma durumundayken kurtarılan bir aboneliğin zaman çizelgesi gösterilmektedir.

4.şekil Ek süreye giren, ardından hesabı askıya alınan ve son olarak hesabı askıya alma süresi sona ermeden kurtarılan abonelikle ilgili zaman çizelgesi

Aşağıdaki noktaları unutmayın:

  • Abonelik hesap bekletmeye alınmadan önce Google Play, ödeme yönteminden 48 saate kadar ek ödeme alma girişimlerinde bulunur. Kullanıcı, bu süre boyunca abonelik avantajlarından yararlanmaya devam edebilir. Bu yeniden deneme süresi geçtikten sonra abonelik hesap bekletme durumuna girer ve kullanıcı abonelik avantajlarına erişimini kaybeder.
  • Abonelik, duraklatılmış durumdan ödeme şekli başarısız olarak devam ettirildiğinde doğrudan hesabı askıya alma durumuna girer.
  • Abonelik, askıya alınmış hesap durumundan kurtarıldığında yenileme tarihi sıfırlanır.

Süre sonları

Aboneliğin süresi dolduğunda kullanıcı, aboneliğe erişimini kaybeder. Bu durumda, türü SUBSCRIPTION_EXPIRED olan bir SubscriptionNotification mesajı gönderilir. Bu bildirimi aldığınızda en son abonelik kaynağını almak için Google Play Developer API'yi sorgulayın. subscriptionState değerinin SUBSCRIPTION_STATE_EXPIRED olduğunu onayladıktan sonra yetkilendirmeyi kaldırın ve satın alma durumunu arka uç sisteminizde geçersiz olarak kaydedin. Abonelik kaynağı aşağıdaki örneğe benzer:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time_in_past,
      ...
    }
  ],
}

İptal sayısı

Kullanıcılar, Play abonelik merkezinden aboneliklerini kendi istekleriyle iptal edebilir veya hesap askıya alındıktan sonra kurtarmazlarsa abonelikleri otomatik olarak iptal edilebilir. Geliştiriciler, purchases.subscriptionsv2.cancel ile iptal işlemini de tetikleyebilir. Abonelik iptal edildiğinde kullanıcı, geçerli faturalandırma döneminin sonuna kadar içeriğe erişmeye devam eder. Faturalandırma dönemi sona erdiğinde erişim iptal edilmelidir.

Taksitli olmayan ve otomatik yenilenen bir aboneliğin iptal edilmesiyle SUBSCRIPTION_CANCELED bildirimi tetiklenir. Bu bildirimi aldığınızda, Google Play Developer API'den döndürülen abonelik kaynağının subscriptionState alanı SUBSCRIPTION_STATE_CANCELED olarak ayarlanır ve expiryTime alanı, kullanıcının aboneliğe erişimini kaybedeceği tarihi içerir. Bu tarih geçmişteyse kullanıcının hakları hemen iptal edilmelidir. Örneğin, bir kullanıcı ödemesi reddedildiği için hesabı askıya alınmışken aboneliğini iptal ederse bu durum yaşanabilir.

İptal edilen bir satın alma işlemine ait abonelik kaynağı aşağıdaki örneğe benzer:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

Taksitli aboneliklerde, kullanıcı tarafından başlatılan iptal işleminde, taahhüt dönemi için ödemeler devam ediyorsa bildirim gönderilir.SUBSCRIPTION_CANCELLATION_SCHEDULED İptal işlemi beklemede ve mevcut taahhüt döneminin sonunda geçerli olacak. Bu bildirimi aldığınızda, Google Play Developer API'den döndürülen abonelik kaynağının subscriptionState alanı SUBSCRIPTION_STATE_ACTIVE olarak ayarlanır. Bunun nedeni, taahhüt dönemi sona erene kadar taksitli aboneliğin hâlâ etkin olmasıdır. Ancak, boş bir pendingCancellation nesnesi mevcut. SUBSCRIPTION_CANCELED bildirimi gönderilir ve taahhüt süresinin sonunda SUBSCRIPTION_EXPIRED bildirimi gönderilir.

İptal işlemi bekleyen bir taksitli abonelik satın alma işlemine ait abonelik kaynağı aşağıdaki örneğe benzer:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_plan01",
      "expiryTime": expiration_time,
      "autoRenewingPlan": {
        "autoRenewEnabled": true,
        "recurringPrice": {
          "currencyCode": "USD",
          "units": "1",
          "nanos": 990000000
        },
        "installmentDetails": {
          "initialCommittedPaymentsCount": 6,
          "remainingCommittedPaymentsCount": 5,
          "pendingCancellation": {}
      ...
        }
      }
    }
  ],
}

Aboneliğin neden iptal edildiğini öğrenmek için abonelik kaynağındaki canceledStateContext alanına bakabilirsiniz (örneğin, aboneliğin kullanıcı, sistem veya sizin tarafınızdan mı iptal edildiği). Abonelik kullanıcı tarafından iptal edildiyse kullanıcının aboneliği neden iptal ettiğini öğrenmek için userInitiatedCancellation alanına bakabilirsiniz. Bu, iletişim stratejilerine yön vermeye yardımcı olabilir.

İptal edilen ancak henüz süresi dolmamış abonelikler queryPurchasesAsync() tarafından döndürülmeye devam eder. Uygulamanızda, kullanıcıyı aboneliğinin iptal edildiği ve geçerlilik bitiş tarihi hakkında bilgilendiren bir mesaj görüntüleyebilirsiniz.

İptaller

Abonelik, arka uçunuzun purchases.subscriptionsv2.revoke kullanarak aboneliği iptal etmesi veya satın alma işleminin geri ödenmesi gibi çeşitli nedenlerle iptal edilebilir. Bu durumda, kullanıcının yetkisini hemen iptal edin. Bu durumda, türü SUBSCRIPTION_REVOKED olan bir SubscriptionNotification mesajı gönderilir. Bu bildirimi aldığınızda, Google Play Developer API'den döndürülen abonelik kaynağının subscriptionState alanı SUBSCRIPTION_STATE_EXPIRED olarak ayarlanır.

İptal edilen bir satın alma işlemine ait abonelik kaynağı aşağıdaki örneğe benzer:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ]
}

Ertelenmiş abonelikler

Kullanıcı yetkisini uzatmak istemenizin çeşitli nedenleri olabilir. Örneğin, kullanıcılara özel bir promosyon kapsamında ücretsiz erişim sunmak isteyebilirsiniz. Bir film satın alan kullanıcılara bir hafta ücretsiz erişim vermek veya iyi niyet göstergesi olarak müşterilere ücretsiz erişim sağlamak bu kapsamda değerlendirilebilir. Otomatik yenilenen bir aboneliğin bir sonraki faturalandırma tarihini öne almak için Play Developer API'deki purchases.subscriptions.defer yöntemini kullanabilirsiniz. Bu işlemi yaptığınızda, türü SUBSCRIPTION_DEFERRED olan bir SubscriptionNotification mesajı gönderilir. Erteleme süresi boyunca kullanıcı, içeriğinize tam erişimle abone olur ancak ücretlendirilmez. 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ş bir aboneliğin abonelik kaynağı, aşağıdaki örneğe benzer görünür:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      ...
    }
  ],
}

Duraklatılmış abonelikler

Kullanıcıların aboneliklerini duraklatmalarına izin vererek, uygulama kullanımını gönüllü bir şekilde bırakma oranını düşürebilirsiniz. Duraklatma özelliğini etkinleştirdiğinizde kullanıcılar aboneliklerini iptal etmek yerine, yinelenme dönemine bağlı olarak bir hafta ile üç ay arasında bir süre boyunca duraklatmayı tercih edebilirler.

Abonelik tekrarı Haftalık Aylık Üç ay Altı ay Yıllık
Kullanılabilir duraklatma süreleri* 1 hafta
2 hafta
3 hafta
4 hafta
1 ay
2 ay
3 ay
1 ay
2 ay
3 ay
1 ay
2 ay
3 ay
Yok
*Herhangi bir zamanda değiştirilebilir.

Abonelik duraklatma işleminin geçerli olması için mevcut fatura döneminin bitmesi gerekir. Kullanıcılar, duraklatılmış olan aboneliklere erişemezler ve yenileme ücretini ödemezler. Duraklatma döneminin sonunda abonelik devam eder ve Google aboneliği yenilemeyi dener. Başarıyla devam ettirilen abonelikler yeniden etkinleşir. Ödeme sorunu nedeniyle devam ettirme işlemi başarısız olursa kullanıcı, 5. ve 6. şekillerde gösterildiği gibi askıya alınmış hesap durumuna girer:

5.şekil Kullanıcı, aboneliğini duraklatıp yeniden başlatırsa
6. Şekil. Kullanıcı, aboneliğine ara verip hesap askıya alma durumuna geçer.

Kullanıcı, 6. şekilde gösterildiği gibi, duraklatma süresi boyunca aboneliği istediği zaman manuel olarak da devam ettirebilir. Kullanıcı manuel olarak devam ettirdiğinde fatura tarihi, manuel devam ettirme tarihi olarak değişir.

Bir kullanıcının aboneliği duraklatıldığında Play Billing Library, aboneliği queryPurchasesAsync() yöntemiyle döndürmez. Abonelik devam ettirilirse queryPurchasesAsync() yöntemi tekrar döndürür.

Kullanıcının aboneliğine ara verdiğini öğrenmek için anlık bildirimleri dinleyin. Bu bildirimler, kullanıcılarınızı uygulamanızda aboneliklerini duraklattıkları ve aboneliklerine erişemedikleri konusunda bilgilendirmenize de olanak tanır. Ayrıca, kullanıcıya Google Play'e derin bağlantı kullanarak aboneliğini istediği zaman manuel olarak devam ettirme olanağı da sunmanız gerekir.

Kullanıcınız aboneliğini duraklattığında SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED türünde bir SubscriptionNotification mesajı gönderilir. Bu durumda, kullanıcı bir sonraki yenileme tarihine kadar aboneliğine erişmeye devam eder ve abonelik kaynağı autoRenewEnabled = true içerir. subscriptionState alanının değeri bu noktada SUBSCRIPTION_STATE_ACTIVE'dır.

Duraklatma etkin olduğunda SUBSCRIPTION_PAUSED türünde bir SubscriptionNotification mesajı gönderilir. Bu durumda, kullanıcının aboneliğine erişimi kaybedilir ve abonelik kaynağı autoRenewEnabled = true içerir. Ayrıca subscriptionState alanı SUBSCRIPTION_STATE_PAUSED olarak ayarlanır. Aboneliğin ne zaman yenileneceğini PausedStateContext nesnesini kontrol ederek görebilirsiniz.

Abonelik, duraklatma süresinin sonunda otomatik olarak veya kullanıcı tarafından manuel olarak devam ettirilirse SubscriptionNotification türünde bir SUBSCRIPTION_RENEWED mesajı gönderilir. Bu durum, Yenilemeler bölümünde açıklandığı şekilde ele alınmalıdır.

Abonelik duraklatıldıktan sonra devam ettirilmeye çalışılırken ödeme hatası oluşursa SUBSCRIPTION_ON_HOLD türünde bir SubscriptionNotification mesajı gönderilir. Bu durum, Hesabın bekletilmesi başlıklı makalede açıklandığı şekilde ele alınmalıdır.

Yeniden abone olun

Otomatik yenilenen abonelik temel planları için Google Play Store'da Yeniden abone ol düğmesi gösterilebilir. Bu düğme, kullanıcıların aboneliğe tekrar erişmelerini sağlar. Bu bölüm, örneğin aboneliğin süresi uzun zaman önce dolduysa çeşitli nedenlerle görünmeyebilir.

7.şekil Google Play Store uygulamasının Hesap > Abonelikler bölümünde, iptal edilmiş bir abonelik ve Yeniden abone ol düğmesi gösteriliyor.

Düğme her zaman Yeniden abone ol olarak etiketlense de işlevi abonelik durumuna bağlıdır.

Bir abonelik iptal edildikten sonra ancak süresi henüz dolmadan kullanıcı, abonelik avantajlarından yararlanmaya devam eder. Kullanıcı Yeniden abone ol'a dokunursa iptal işlemi geri alınır ve abonelik yenilenmeye devam eder. Bu işlem, Play geliştirici belgelerinde ve API'lerinde geri yükleme olarak bilinir.

Otomatik yenilenen bir aboneliğin süresi dolduktan sonra kullanıcıların aynı abonelik temel planını satın almasına izin verebilirsiniz. Bu işlem, Play geliştirici belgelerinde ve API'lerinde yeniden abone olma olarak bilinir. Bu seçeneği Play Console'da veya API'yi kullanarak her temel plan için yapılandırabilirsiniz.

Süre dolmadan geri yükleme

Uygulamanız, kullanıcının abonelik hakkı olup olmadığını belirlemek için yalnızca queryPurchasesAsync() yöntemini kullanıyorsa queryPurchasesAsync() yöntemi, iptal edilen satın alma işlemlerini geçerlilik tarihleri dolmadan döndürmeye devam ettiğinden uygulamanız geri yüklemeleri otomatik olarak işlemelidir. Geri yüklenen abonelikler, iptal edilmemiş gibi yenilenmeye devam eder.

Uygulamanız abonelik durumunu bir arka uçla senkronize ediyorsa SUBSCRIPTION_RESTARTED türünde bir SubscriptionNotification mesajını dinlemeniz gerekir. Bu RTDN'yi aldıktan sonra uygulamanız bildirime yanıt verebilir, aboneliğin artık yenilenecek şekilde ayarlandığını kaydedebilir ve uygulamanızda yenileme mesajları göstermeyi durdurabilir. Abonelik kaynağı aşağıdaki örneğe benzer:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date
      ...
    }
  ],
}

Süre sonundan sonra yeniden abone olma

Google Play Console veya API kullanılarak yeniden abone olmaya izin verecek şekilde otomatik yenilenen bir temel plan yapılandırılırsa kullanıcılar, süresi dolmuş bir aboneliği Google Play Store'da yeniden satın alabilir.

Bunlar yeni satın alma işlemleridir. Google Play, yepyeni bir satın alma jetonu oluşturur ve arka uç sisteminiz SUBSCRIPTION_PURCHASED türünde bir RTDN alır. Bu tür uygulama dışı satın alma işlemlerinde, orijinal abonelik tamamen sona erdiğinden satın alma durumu, orijinal satın alma işlemiyle ilişkili bir linkedPurchaseToken içermez. Bunlar, arka uç sisteminizin diğer satın alma işlemleri gibi işlemesi ve onaylaması gereken yeni satın alma işlemleridir.

Sürüm yükseltme, sürüm düşürme ve yeniden abone olma

Bir kullanıcı, abonelik süresi dolmadan önce uygulamanızdan aboneliğini iptal ettikten sonra kaydolduğunda veya aboneliğini yükselttiğinde ya da düşürdüğünde eski abonelik geçersiz kılınır ve yeni bir satın alma jetonuyla yeni bir abonelik oluşturulur.

Ayrıca, Google Play Developer API'den döndürülen abonelik kaynağı, kullanıcının yükselttiği, düşürdüğü veya yeniden abone olduğu eski satın alma işlemini belirten bir linkedPurchaseToken alanı içerir. Eski aboneliği aramak ve mevcut kullanıcı hesabını belirlemek için bu alandaki satın alma jetonunu kullanabilirsiniz. Böylece yeni satın alma işlemini aynı hesapla ilişkilendirebilirsiniz.

Uygulamanızda bir kullanıcıya yükseltme, düşürme veya yeniden abone olma seçenekleri sunmadan önce mevcut aboneliği onaylamanız gerekir. Mevcut abonelik için onay bekleniyorsa plan değişikliği veya yeniden abone olma işlemi engellenir.

Kullanıcı yükseltme, eski sürüme geçme veya yeniden abone olma işlemini başarıyla gerçekleştirirse bu yeni bir satın alma işlemi olur ve bunu onaylamanız gerekir. Bunu yapmanın önerilen yolu Google Play Developer API'yi kullanmaktır. Abonelik kaynağı aşağıdaki örneğe benzer:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "linkedPurchaseToken": old_purchase_token,
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Fiyat değişiklikleri

Otomatik yenilenen abonelik fiyatlarını değiştirme ve uygun durumlarda kullanıcıları bilgilendirme hakkında bilgi edinmek için fiyat değişikliğiyle ilgili en iyi uygulamalar kılavuzuna göz atın.

Fiyat değişikliği eklendiğinde ve fiyat değişikliği durumunda yapılan güncellemelerde SUBSCRIPTION_PRICE_CHANGE_UPDATED RTDN'yi alırsınız. Abonelikteki her öğe için fiyat değişikliği ayrıntılarını içeren bir abonelik kaynağı almak üzere purchases.subscriptionsv2.get uç noktasını sorgulayabilirsiniz.

Fiyat değişiklikleri mevcut abonelere kullanıcı onayı isteme olarak uygulandığında, kullanıcı yeni fiyatı onaylamak veya reddetmek için işlem yaparsa RTDN alırsınız.

Kullanıcıların etkinleştirme fiyat değişikliğini onaylamasını işleme

Bir kullanıcı abonelik fiyatı artışınızı kabul ettiğinde, türü SUBSCRIPTION_PRICE_CHANGE_UPDATED olan bir SubscriptionNotification mesajı alırsınız.

Fiyat değişikliği uygulandıktan sonra yenilemeleri işleme

Fiyat düşüşü olduğunda veya abonelik fiyatı artışı yenilendiğinde, SubscriptionNotification türünde bir SUBSCRIPTION_RENEWED mesajı alırsınız. Bu bildirimi diğer yenilemeler gibi değerlendirin.

Kullanıcı onayı istenen fiyat artışının kabul edilmediği durumları ele alma

Kullanıcı, daha yüksek fiyattan yenileme yapması gerekmeden önce isteğe bağlı fiyat artışınızı kabul etmezse otomatik olarak abonelikten çıkarılır ve SUBSCRIPTION_CANCELED türünde bir SubscriptionNotification mesajı alırsınız. Bu etkinliği İptaller bölümünde açıklandığı şekilde ele alın.

Kullanıcılar, aynı mekanizmayı kullanarak kapsam dışında kalmayı seçtikleri fiyat artışları için aboneliklerini de iptal edebilir.

Güney Kore'deki yeni yasal düzenlemeler nedeniyle, Güney Kore bölgesindeki abonelik kullanıcılarının ücretsiz deneme veya tanıtım dönemleri sona erdikten sonra yapılacak fiyat artışlarını onaylamaları gerekir.

Play, düzenlemeye uymanıza yardımcı olmak için Kore Cumhuriyeti'ndeki kullanıcıları rıza koşulu hakkında bilgilendirir ve kullanıcılardan alınan rıza yanıtını saklar. Daha yüksek fiyat geçerli olmadan önce izin vermeyen kullanıcıların abonelikleri otomatik olarak iptal edilir. Play'den gönderilen bildirimlere ek olarak, kullanıcılarınıza özel fiyat artışı bildirimleri de gönderebilir ve bildirimlerinizde belirli yönetim sayfalarına bağlantı sağlayabilirsiniz.

İzin dönemi başladığında veya kullanıcı izin verdiğinde SUBSCRIPTION_PRICE_STEP_UP_CONSENT_UPDATED türünde bir SubscriptionNotification mesajı alırsınız.

Fiyat artışı ve fiyat değişikliği arasındaki fark

price step-up, bir teklif aşamasından diğerine geçiş nedeniyle abonelik fiyatındaki artışı ifade eder. Örneğin, ücretsiz denemeden normal fiyatlı aboneliğe geçiş yapan bir abonelik.

Ancak price change, bir aboneliğin temel plan fiyatı için sizin (geliştirici) başlattığınız fiyat güncellemelerini ifade eder. Örneğin, kullanıcı onayı istenen fiyat artışı veya kullanıcı onayı istenmeyen fiyat artışı.

Ön ödemeli planların yaşam döngüsünü yönetme

Otomatik yenilenen aboneliklerde olduğu gibi, her yeni satın alma işleminden sonra ön ödemeli planları onaylamanız gerekir. Ön ödemeli planlarda, kullanıcının her seferinde satın alma sürecinden geçmesi gerektiğinden hem ilk satın alma işlemini hem de para ekleme işlemlerini tamamen işlemeniz gerekir.

Kısa süreli ön ödemeli planlar olabileceğinden satın alma işlemini mümkün olan en kısa sürede onaylamanız önemlidir. Bir hafta veya daha uzun süreli ön ödemeli planlar 3 gün içinde onaylanmalıdır. Süresi bir haftadan kısa olan ön ödemeli planlar, plan süresinin yarısı içinde onaylanmalıdır. Örneğin, geliştiricilerin üç günlük ön ödemeli plan satın alma işlemini onaylamak için 1,5 günü vardır.

Şekil 8. Abonelik satın alma işlemleri için yaşam döngüsü durumları ve geçiş etkinlikleri.

Ön ödemeli plan aboneliği satın alındığında (para ekleme işlemleri dahil) RTDN istemcinize SUBSCRIPTION_PURCHASED türünde bir SubscriptionNotification mesajı gönderilir. En son ön ödemeli plan aboneliği durumunu kontrol etmek için purchases.subscriptionsv2.get yöntemini çağırın.

Para ekleme satın alma işlemleri için yeni bir satın alma jetonu verilir ve yeni abonelik satın alma durumu kapsamında linkedPurchaseToken alanında önceki satın alma jetonunu alırsınız. Satın alma jetonu, abonelik kaydından itibaren geçerlilik süresi sona erdikten sonraki 60 güne kadar geçerlidir. Bu tarihten sonra, satın alma jetonu Google Play Geliştirici API'sini çağırmak için kullanılamaz.

Ön ödemeli plan satın alma işlemine ait abonelik kaynağı, aşağıdaki örneğe benzer:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "prepaid_plan01",
      "expiryTime": expiry_date,
      "prepaidPlan": {
        "allowExtendAfterTime": timestamp_after_which_topups_are_allowed
      }
    }
  ]
}

Hak süresinin ne zaman sona ereceğini expiryTime alanında görebilirsiniz. Yükleme işlemleri, biriktirerek hak süresini uzatır. Bu nedenle, kullanıcı orijinal hakkı sona ermeden önce yükleme yaparsa yeni süre, önceki son kullanma tarihine eklenir.

Uygulamanızda, kullanıcıyı ön ödemeli aboneliklerinin yükleme yapılarak uzatılabileceği konusunda bilgilendiren bir mesaj görüntüleyebilirsiniz. Kullanıcının ne zaman yükleme yapabileceğini öğrenmek için abonelik kaynağındaki allowExtendAfterTime alanını kontrol edin.

Ön ödemeli planlar otomatik olarak yenilenmediği için iptal edilemez. Bir kullanıcı ön ödemeli planı iptal etmek isterse planın son kullanma tarihine ulaşmasını bekleyebilir.

Ön ödemeli planlar için SubscriptionPurchaseV2 alanları

Otomatik olarak yenilenmek yerine kullanıcı tarafından uzatılan ön ödemeli planları desteklemek için yeni alanlar eklendi. Aşağıdaki istisnalar dışında, tüm alanlar otomatik yenilenen aboneliklerde olduğu gibi ön ödemeli planlar için de geçerlidir:

  • [Yeni alan] lineItems[0].prepaid_plan.allowExtendAfterTime: Kullanıcının, ön ödemeli planını uzatmak için başka bir yükleme satın almasına ne zaman izin verileceğini belirtir. Kullanıcıların aynı anda yalnızca bir kullanılmamış yüklemesi olabilir.
  • [Yeni alan] SubscriptionState: Abonelik nesnesinin durumunu belirtir. Ön ödemeli planlarda bu değer her zaman ACTIVE, PENDING veya CANCELED olur.
  • lineItems[0].expiryTime: Bu alan, ön ödemeli planlarda her zaman bulunur.
  • paused_state_context: Bu alan, ön ödemeli planlar duraklatılamadığından hiçbir zaman mevcut değildir.
  • lineItems[0].auto_renewing_plan: Ön ödemeli planlarda mevcut değildir.
  • canceled_state_context: Bu alan yalnızca aboneliği etkin bir şekilde iptal eden kullanıcılar için geçerli olduğundan ön ödemeli planlarda mevcut değildir.
  • lineItems[0].productId: Bu alan, önceki sürümlerdeki subscriptionId öğesinin yerini alır.