Abonelik yaşam döngüsü

Abonelik satın alma işlemleri; otomatik yenileme davranışı, ödeme reddi durumları ve geliştirici yönetim işlemleri gibi birçok faktöre bağlı olarak yaşam döngüleri boyunca birkaç farklı durumdan 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
Şekil 1. Otomatik yenilenen abonelik satın alma işlemleri için yaşam döngüsü durumları ve geçiş etkinlikleri.

Arka ucunuzdaki durumu güncellemek için bildirimde yer alan satın alma jetonuyla purchases.subscriptionsv2.get API'yi ç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 kaynağı olarak kabul edilir.

Satın alma jetonu, abonelik kaydından itibaren geçerlidir ve abonelik süresi dolduktan sonra 60 gün boyunca geçerliliğini korur. Bu tarihten sonra, Google Play Developer API'yi çağırmak için satın alma jetonu artık geçerli olmayacaktır.

Yeni otomatik yenilenen abonelik satın alma işlemleri

Kullanıcı bir abonelik satın aldığında RTDN istemcinize SUBSCRIPTION_PURCHASED türünde bir SubscriptionNotification mesajı gönderilir. Bu bildirimi aldığınızda veya uygulamanızın onResume() yönteminde PurchasesUpdatedListener ya da satın alma işlemlerini manuel olarak getirme aracılığıyla yeni bir uygulama içi satın alma işlemi kaydettiğinizde yeni satın alma işlemini güvenli arka ucunuzda işlemeniz gerekir. Bunu yapmak için aşağıdaki 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.

SubscriptionPurchaseLineItem içindeki offerPhase alanı, aboneliğin mevcut aşaması (ör. ücretsiz deneme veya tanıtım fiyatı) hakkında ayrıntılı bilgi sağlar.

Google Play Faturalandırma Kitaplığı'nda abonelik 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
      },
      "offerPhase": {
        "freeTrial": {}
      }
    }
  ],
}

Abonelik yenilemeleri

Taksitli olmayan, otomatik yenilenen aboneliklerde, abonelik yenilendiğinde SUBSCRIPTION_RENEWED bildirimi gönderilir. Taksitli aboneliklerde, abonelik fatura tarihinde her ücretlendirildiğinde bir SUBSCRIPTION_RENEWED bildirimi gönderilir. Kullanıcının abonelikten yararlanmaya devam ettiğinden emin olun ve ardından abonelik durumunu, Google Play Developer API'den döndürülen abonelik kaynağında sağlanan yeni expiryTime ile 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
      },
      "offerPhase": {
        "basePrice": {}
      }
    }
  ]
}

Abonelik yenilemelerini onaylamanız gerekmez.

Ek süre

Abonelik yenilemeyle 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çindeki satın alma işlemlerini döndürmeye devam eder. Uygulamanız, bir kullanıcının abonelik hakkı olup olmadığını kontrol etmek için yalnızca queryPurchasesAsync kullanıyorsa ek süreleri otomatik olarak yönetmelidir. Çünkü bu abonelikler, Google Play Faturalandırma Kitaplığı aracılığıyla etkin olarak gösterilir.

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 kaynağı autoRenewEnabled = true değerini içerir. Google Play, expiryTime değerini ek süre sona erene kadar dinamik olarak uzatır. Bunun nedeni, yararlanma hakkının kullanıcı iptal edene veya ek süre maksimum uzunluğuna ulaşana kadar devam etmesi gerektiğidir. 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
      }
    }
  ],
}

Google Play, ek süre içinde olan kullanıcılara ödemelerinin reddedildiğini bildirir ve Google Play Store'da ödeme yöntemiyle ilgili sorunları düzeltmelerini ister. Kullanıcı ek süreye girdiğinde, ödeme yöntemini düzeltmeye de teşvik etmelisiniz. Böylece, ödeme hatası istemsiz olarak gerçekleştiyse kullanıcı bunu düzeltebilir. Bunu yapmanın basit bir yolu, In-App Messaging API'yi kullanmaktır. Kullanıcı uygulamanızı açtığında bu API'yi ç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üzeltir düzeltmez abonelik, orijinal yenileme tarihiyle yenilenir ve yenileme işlemini Yenilemeler bölümünde açıklandığı şekilde gerçekleştirebilirsiniz.

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

Ek süre 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ı, abonelik avantajlarını kaybeder ve hesabı askıya alınır.

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

Aşağıdaki noktaları unutmamanız önemlidir:

  • 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 değiştirirseniz şu anda ek süre içinde olan kullanıcılar bu değişiklikten etkilenmez. Değişiklikten sonra ek süreye giren abonelik yenilemelerinde yeni ek süre geçerli olur. Örneğin, ek süreyi 7 günden 14 güne değiştirirseniz değişiklikten sonra ek süreye giren kullanıcılar yeni 14 günlük ek süreye sahip olur.
  • 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

Ek süreyi 0 gün olarak ayarlayabilirsiniz ancak Google Play, ödeme yeniden denemeleri için yeterli süre tanımak amacıyla en az 1 gün bekler. Bu sessiz ödeme süresi, ödeme işleme için bir güvenlik ağı sunar. Bu 24 saatlik süre boyunca abonelik ACTIVE durumunda kalır.

Abonelik durumu değişiklikleriyle senkronize kalmanın en iyi yolu, gerçek zamanlı geliştirici bildirimlerini (RTDN) dinlemek ve bunlara tepki vermektir. Aboneliğin daha doğru bir durumunu öğrenmek için süre sonu yerine RTDN zamanında purchases.subscriptionsv2.get() yöntemini çağırın.

24 saatlik sessiz ek sürenin ardından abonelik durumuna bağlı olarak aşağıdaki bildirimlerden birini alırsınız:

  • SUBSCRIPTION_ON_HOLD (etkinleştirilmişse)
  • SUBSCRIPTION_CANCELED (iptal edilirse)
  • SUBSCRIPTION_EXPIRED (süresi dolduysa)
  • SUBSCRIPTION_RENEWED (başarıyla yenilendiyse)

Aboneliğin en son durumunu öğrenmek için 24 saatlik sessiz ek süreden sonra istediğiniz zaman subscriptionV2.get() yöntemini de çağırabilirsiniz.

Hesabı askıya alma

Abonelik yenileme işleminde ödeme sorunları varsa ek süre sona erdikten sonra hesabın askıya alınma süresi başlar. Bir abonelik, hesabın askıya alınması durumuna girdiğinde abonelikten yararlanma hakkına erişimi engellemeniz gerekir.

Hesabın askıya alınması süresi boyunca, aboneliklerinizle ilgili iptal, geri yükleme veya yeniden satın alma işlemlerini gerektiği gibi yapmaya devam etmeniz gerekir. Kullanıcı, abonelik bekletmedeyken bu değişiklikleri yapabilir.

RTDN'ler, kullanıcı hesabın askıya alınması dönemine girdiğinde sizi bilgilendirir. Böylece, kullanıcının aboneliğe erişiminin 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 bulunur.

Kullanıcılarınız abonelik içeriğine uygulamanızın dışında erişebiliyorsa farklı platformlarda erişimlerini kaybettiklerini fark edebilirler. Kullanıcıya push bildirimi veya e-posta göndererek ödemenin reddedilmesi nedeniyle aboneliğinin artık etkin olmadığını bildirebilirsiniz.

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 hesabın askıya alınması 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ın askıya alınması sırasında subscription resource kaynağının 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üzeltmesi gerekir. Google Play, hesabı askıya alınmış kullanıcılara ödemelerinin reddedildiğini bildirir. Sizin de kullanıcıları ödeme yöntemlerini düzeltmeye teşvik etmeniz gerekir.

Kullanıcı ödeme yöntemini düzelttikten sonra abonelik tekrar etkin duruma geçer ve abone olunan içeriğe erişimi geri yüklemeniz gerekir. Bu durumda, aynı satın alma işlemi kurtarıldığı için satın alma jetonu, hesabın askıya alınması başlamadan öncekiyle aynıdır ve SUBSCRIPTION_RECOVERED türünde bir RTDN alırsınız.

Taksitli aboneliklerde, her bir ö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 abonelik hakkı olup olmadığını belirlemek için bu yöntemi kullanıyorsanız uygulamanız, aboneliğin hesabın askıya alınması 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 SubscriptionNotification türünde bir SUBSCRIPTION_RECOVERED mesajı dinleyin. Bu bildirimi aldıktan sonra bir abonelik için sorgu gönderirseniz expiryTime alanı gelecekteki bir zaman damgasına, subscriptionState alanı ise tekrar SUBSCRIPTION_STATE_ACTIVE değerine ayarlanır:

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

Kullanıcı, hesabın askıya alınma süresi sona ermeden önce ödeme yöntemini düzeltmezse SUBSCRIPTION_CANCELED türünde bir RTDN alırsınız. İptal işlemleriyle ilgili talimatlar için İptaller bölümüne bakın. Bu şekilde iptal edilen bir abonelik için sorgu gönderdiğinizde döndürülen expiryTime alanı geçmiş bir zaman damgasına ayarlanır:

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

Hesabın askıya alınması sırasında iptal bildirimi aldıktan hemen sonra, kullanıcı ücretli kullanım hakkını kaybettiği ve abonelik iptal edildiği için SUBSCRIPTION_EXPIRED türünde bir RTDN de alırsınız. Bu sürenin dolmasıyla ilgili işlemleri normalde yaptığınız gibi gerçekleştirebilirsiniz.

Kullanıcı, hesabının askıya alındığı süre boyunca aynı abonelik planını veya uygulamanızda sunduğunuz başka bir planı 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ın askıya alınması durumunda erişim ve kurtarma

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

Şekil 3. Hesap askıya alınma durumuna giren ve sona ermeden kurtarılan bir aboneliğin zaman çizelgesi

Önceki örneğe benzer şekilde, Şekil 4'te önce ek süreye, ardından hesabın askıya alınması durumuna giren ve askıya alınmış durumdayken kurtarılan bir aboneliğin zaman çizelgesi gösterilmektedir.

Şekil 4. Ek süreye giren, ardından hesabı askıya alınan ve son olarak hesabı askıya alma süresi sona ermeden kurtarılan bir aboneliğin zaman çizelgesi.

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

  • Abonelik, hesabın askıya alınması durumuna girmeden önce Google Play, ödeme yönteminden ödeme almak için 48 saate kadar ek denemeler yapar. Kullanıcı bu süre boyunca abonelik avantajlarından yararlanmaya devam eder. Bu yeniden deneme süresi sona erdikten sonra abonelik, hesabın askıya alınması durumuna girer ve kullanıcı, abonelik avantajlarına erişimini kaybeder.
  • Abonelik, duraklatılmış durumdan başarısız bir ödeme şekliyle devam ettirildiğinde doğrudan hesabın askıya alınması durumuna girer.
  • Bir abonelik, hesap askıya alınma durumundan kurtarıldığında yenileme tarihi sıfırlanır.

Süre sonları

Aboneliğin süresi dolduğunda kullanıcı aboneliğe erişimi kaybetmelidir. 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 öğesinin 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ı, Play abonelik merkezinden bir aboneliği kendi isteğiyle iptal edebilir veya hesabın askıya alınması durumundan kurtulamazsa aboneliği otomatik olarak iptal edilir. Geliştiriciler, purchases.subscriptionsv2.cancel ile de iptal işlemini tetikleyebilir. Bir abonelik iptal edildiğinde kullanıcı, mevcut 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, otomatik yenilenen bir aboneliğin iptal edilmesi SUBSCRIPTION_CANCELED bildirimini tetikler. 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 kaybetmesi gereken tarihi içerir. Bu tarih geçmişteyse kullanıcı, haklarını hemen kaybeder. Örneğin, bir kullanıcı ödeme reddi nedeniyle hesabın askıya alınması durumundayken aboneliğini iptal ederse bu durum gerçekleşebilir.

İptal edilen bir satın alma işleminin 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, taahhüt süresi için ödemeler devam ederken kullanıcı tarafından başlatılan bir iptal işlemi üzerine SUBSCRIPTION_CANCELLATION_SCHEDULED bildirimi gönderilir. İptal işlemi beklemededir ve mevcut taahhüt süresinin sonunda geçerli olur. 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, taksitli aboneliğin taahhüt süresinin sonuna kadar etkin kalmasıdır. Ancak boş bir pendingCancellation nesnesi mevcut. Taahhüt süresinin sonunda SUBSCRIPTION_CANCELED bildirimi ve ardından SUBSCRIPTION_EXPIRED bildirimi gönderilir.

İptal edilmeyi bekleyen taksitli abonelik satın alma işlemi için 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 (ör. aboneliğin kullanıcı, sistem veya sizin tarafınızdan iptal edilip edilmediği) öğrenmek için abonelik kaynağındaki canceledStateContext alanına bakabilirsiniz. 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 sayede iletişim stratejilerinizi belirleyebilirsiniz.

İptal edilen ancak henüz süresi dolmamış abonelikler queryPurchasesAsync() tarafından döndürülmeye devam eder. Uygulamanızda, kullanıcıya aboneliğinin iptal edildiğini bildiren ve sona erme tarihini belirten bir mesaj gösterebilirsiniz.

İptaller

Abonelik, arka ucunuzun purchases.subscriptionsv2.revoke kullanarak aboneliği iptal etmesi veya satın alma işleminin ters ibraz edilmesi gibi çeşitli nedenlerle iptal edilebilir. Bu durumda kullanıcının yararlanma hakkını hemen iptal edin. Bu durumda, SUBSCRIPTION_REVOKED türünde 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şleminin abonelik kaynağı aşağıdaki örneğe benzer:

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

Ertelenen abonelikler

Kullanıcı yetkisini uzatmak istemenizin çeşitli nedenleri olabilir. Örneğin, özel bir promosyon olarak kullanıcılara ü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.

Aboneliklerin (eklentili abonelikler dahil) fatura tarihini ertelemek için purchases.subscriptionsv2.defer API'yi kullanabilirsiniz. Eklenti içeren bir aboneliği ertelediğinizde, abonelikteki tüm öğeler aynı süre boyunca ertelenir.

Aboneliği ertelediğinizde SubscriptionNotification türünde bir SUBSCRIPTION_DEFERRED mesajı gönderilir. Erteleme süresi boyunca kullanıcı, içeriğinize tam erişimle abone olur ancak kendisinden ödeme alınmaz. 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.

Ertelenen bir aboneliğin abonelik kaynağı aşağıdaki örneğe benzer:

{
  "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 isteğe bağlı kullanıcı kaybını azaltabilirsiniz. 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. Bu işlem, aboneliği geçici olarak askıya alır.

Abonelik yenileme sıklığı 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
1 ay
2 ay
3 ay
*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 hesabın askıya alınması durumuna girer:

Şekil 5. Kullanıcı, aboneliğini duraklatıp yeniden başlattığında
Şekil 6. Kullanıcı aboneliğini duraklatır ve ardından hesap askıya alınır.

Kullanıcı, Şekil 6'da gösterildiği gibi duraklatma dönemi sırasında istediği zaman aboneliği manuel olarak devam ettirmeyi de seçebilir. Kullanıcı aboneliği 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, Google Play Faturalandırma Kitaplığı, QueryPurchasesParams içinde includeSuspendedSubscriptions parametresi "true" olarak ayarlanmadığı sürece aboneliği queryPurchasesAsync() yöntemiyle döndürmez. Abonelik devam ettirilirse queryPurchasesAsync() yöntemi aboneliği tekrar döndürür.

Kullanıcıların aboneliklerini ne zaman duraklattığını öğrenmek için RTDN'leri dinleyin. Bu bildirimler, uygulamanızda kullanıcılarınıza aboneliklerini duraklattıklarını ve aboneliğe erişimleri olmadığını bildirmenize de olanak tanır. Ayrıca, Google Play'e yönlendiren bir derin bağlantı kullanarak kullanıcının aboneliğini istediği zaman manuel olarak devam ettirmesine olanak tanıyan bir yöntem de sunmanız gerekir.

Kullanıcınız aboneliğini duraklatma işlemini başlattığında SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED türünde bir SubscriptionNotification mesajı gönderilir. Bu aşamada, kullanıcının bir sonraki yenileme tarihine kadar aboneliğine erişimi devam etmelidir ve abonelik kaynağı autoRenewEnabled = true değerini içerir. subscriptionState alanının değeri bu noktada SUBSCRIPTION_STATE_ACTIVE'dir.

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

Abonelik, duraklatma döneminin sonunda otomatik olarak veya kullanıcı tarafından manuel olarak devam ettirilirse SUBSCRIPTION_RECOVERED türünde bir SubscriptionNotification mesajı gönderilir.

Abonelik duraklatıldıktan sonra devam ettirilmeye çalışılırken ödeme başarısız olursa SUBSCRIPTION_ON_HOLD türünde bir SubscriptionNotification mesajı gönderilir.

Her iki durum da Hesabın askıya alınması bölümünde açıklandığı şekilde ele alınmalıdır.

Yeniden abone olma

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 bir aboneliğe yeniden erişmesine olanak tanır. Aboneliğin süresinin uzun zaman önce dolması gibi çeşitli nedenlerle görünmeyebilir.

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

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

Bir abonelik iptal edildiğinde ancak süresi henüz dolmadığında 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, Google 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, Google Play geliştirici belgelerinde ve API'lerinde yeniden abone olma olarak adlandırılır. Bu seçeneği Play Console'da her temel plan için veya API'yi kullanarak yapılandırabilirsiniz.

Süre dolmadan önce geri yükleme

Uygulamanız, bir kullanıcının abonelik hakkı olup olmadığını belirlemek için yalnızca queryPurchasesAsync() yöntemini kullanıyorsa geri yükleme işlemlerini otomatik olarak yapmalıdır. Bunun nedeni, queryPurchasesAsync() yönteminin iptal edilen satın alma işlemlerini geçerlilik bitiş tarihlerinden önce döndürmeye devam etmesidir. 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 yenilenecek şekilde ayarlandığını kaydedebilir ve uygulamanızda geri yükleme 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
      ...
    }
  ],
}

Aboneliği geri yüklemek yeni bir sipariş oluşturmaz. Kullanıcının daha önce iptal ettiği bir abonelik için 0, 00 TL tutarında bir sipariş görürseniz kullanıcı muhtemelen abonelik süresi dolmadan önce uygulamanızdan tekrar kaydolmuştur. Daha fazla bilgi için Yükseltme, eski sürüme geçme ve yeniden abone olma başlıklı makaleyi inceleyin.

Süre dolduktan sonra yeniden abone olma

Otomatik yenilenen bir temel plan, Google Play Console veya API kullanılarak yeniden abone olmaya izin verecek şekilde yapılandırılmışsa 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şlemlerinin satın alma durumu, orijinal abonelik tamamen sona erdiği için orijinal satın alma işlemiyle ilişkili bir linkedPurchaseToken içermez.

Yeniden satın alınan aboneliklerin doğru kullanıcıyla ilişkilendirilmesini sağlamak ve onaylanmamış satın alma işlemleri için otomatik geri ödemeleri önlemek amacıyla, yeniden satın alma işlemini arka uç sunucunuzda onaylamanız gerekir:

  1. RTDN'den alınan yeni satın alma jetonuyla purchases.subscriptionsv2.get yöntemini çağırın. Bu tür uygulama dışı satın alma işlemlerinin yanıtında, yalnızca onaylanmamış yeniden abonelik satın alma işlemlerinde bulunan outOfAppPurchaseContext alanı yer alır. Bu alan şunları sağlar:

    • expiredExternalAccountIdentifiers: ExternalAccountIdentifiers, önceki süresi dolmuş abonelik için yapılandırılan obfuscatedAccountId ve obfuscatedProfileId alanlarını içeren bir nesne (ayarlanmışsa).
    • expiredPurchaseToken: Süresi dolan son aboneliğin satın alma jetonu.

    Yeni satın alma işlemini arka uçtaki doğru kullanıcı hesabıyla aramak ve bağlamak için bu tanımlayıcılardan birini kullanın.

  2. Satın alma işlemini onaylamak için purchases.subscriptions.acknowledge numaralı telefonu arayın.

    • İsteğe bağlı olarak, uygulama içi faturalandırma akışı sırasında setObfuscatedAccountId ve setObfuscatedProfileId kullanarak yapılandırdıysanız kullanıcının obfuscatedAccountId ve obfuscatedProfileId değerlerini gönderebilirsiniz.

Bu sunucu tarafı yaklaşımı, kullanıcı uygulamanızı açmasa bile satın alma işlemini satın alma tarihinden itibaren üç gün içinde onaylamanıza olanak tanır.

Yükseltme, düşürme ve yeniden abone olma

Kullanıcı aboneliği yükselttiğinde, düşürdüğünde veya abonelik süresi dolmadan önce uygulamanızdan iptal ettikten sonra kaydolduğunda 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ükseltme, düşürme veya yeniden abone olma işlemlerini hangi eski satın alma işleminden yaptığını gösteren 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.

Bir kullanıcı, aboneliğinin süresi dolmadan önce uygulamanızdan aynı temel plan için tekrar kaydolduğunda Google Play, yeni satın alma işlemi için 0,00 ABD doları tutarında bir sipariş oluşturur. Kullanıcı, mevcut fatura dönemi için ödeme yaptığından kaydolurken ücretlendirilmez. Normal faturalandırma, orijinal yenileme tarihinde devam eder. 0,00 ABD doları tutarındaki sipariş, Play Console'daki Sipariş yönetimi bölümünde ve finansal raporlarınızda görünür. Bu, kullanıcının ücretsiz deneme veya promosyon indirimi aldığı anlamına gelmez.

Uygulamanızda bir kullanıcıya yükseltme, düşürme veya yeniden abone olma seçeneklerini 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, düşürme veya yeniden abone olma işlemini başarıyla tamamlarsa bu, onaylamanız gereken yeni bir satın alma işlemidir. Bunu yapmak için önerilen yöntem, 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 gerektiğinde kullanıcıları bilgilendirme hakkında bilgi edinmek için fiyat değişikliğiyle ilgili en iyi uygulamalar kılavuzuna bakın.

Fiyat değişikliği eklendiğinde ve fiyat değişikliği durumunda yapılan güncellemeler için SUBSCRIPTION_PRICE_CHANGE_UPDATED RTDN'si 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ının onay gerektiren fiyat değişikliğini onaylamasını işleme

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

Fiyat değişikliği uygulandıktan sonra yenilemeleri yönetme

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 yenileme bildirimleri gibi değerlendirin.

Onaylı fiyat artışının kabul edilmediği durumları ele alma

Kullanıcı, daha yüksek fiyattan yenileme yapması gerekmeden önce fiyat artışı onayı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, onay istenmeyen fiyat artışı için de aynı mekanizmayı kullanarak aboneliklerini iptal edebilirler.

Güney Kore'deki yeni yasal düzenlemeler nedeniyle, bu bölgedeki 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.

Google Play, tüzüğe uymanıza yardımcı olmak için Güney Kore'deki kullanıcıları rıza koşulu hakkında bilgilendirir ve kullanıcılardan gelen rıza yanıtlarını saklar. Daha yüksek fiyat geçerli olmadan önce izin vermeyen kullanıcıların abonelikleri otomatik olarak iptal edilir. Google Play'den gönderilen bildirimlere ek olarak, kullanıcılarınıza özel fiyat artışı bildirimlerinizi gönderebilir ve bildirimlerinizde belirli bir yönetim sayfasının bağlantısını sağlayabilirsiniz.

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

Fiyat artışı ile 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 fiyata geçen bir abonelik. Aboneliğin mevcut aşamasını belirlemek için abonelik kaynağındaki offerPhase alanını kullanabilirsiniz.

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, fiyat artışı onayı veya 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 akışından geçmesi gerektiğinden hem ilk satın alma işlemini hem de para ekleme işlemlerini tamamen işlemeniz gerekir.

Ön ödemeli plan sürelerinin kısa olma olasılığı nedeniyle, 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 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 (her para ekleme işlemi 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 durumunun bir parçası olarak 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 Developer API'yi çağırmak için artık geçerli değildir.

Ön ödemeli plan satın alma işlemi için 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. Ek satın alma işlemleri, kullanım hakkı süresini biriktirerek artırır. Bu nedenle, kullanıcı orijinal hak süresi sona ermeden önce yükleme yaparsa yeni süre, önceki son kullanma tarihine eklenir.

Uygulamanızda, kullanıcıya ön ödemeli aboneliklerinin para ekleme işlemiyle uzatılabileceğini bildiren bir mesaj göstermek isteyebilirsiniz. Kullanıcının ne zaman ekleme yapabileceğini öğrenmek için abonelik kaynağındaki allowExtendAfterTime alanını kontrol edin.

Ön ödemeli planlar otomatik olarak yenilenmediğinden iptal edilemez. Kullanıcılar ön ödemeli planı iptal etmek isterse planın geçerlilik bitiş 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 ek ödeme satın almasına ne zaman izin verileceğini belirtir. Kullanıcının aynı anda yalnızca bir adet kullanılmamış ek ödemesi 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: Ön ödemeli planlar duraklatılamadığı için bu alan hiçbir zaman gösterilmez.
  • lineItems[0].auto_renewing_plan: Ön ödemeli planlarda yoktur.
  • 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 alanının yerini alır.