Siklus proses langganan

Pembelian langganan dapat melalui beberapa status yang berbeda selama siklus prosesnya, bergantung pada banyak faktor termasuk perilaku perpanjangan otomatis, situasi penolakan pembayaran, dan tindakan pengelolaan developer.

Menangani siklus proses langganan yang diperpanjang otomatis

Saat status langganan pengguna berubah, server backend Anda akan menerima pesan SubscriptionNotification

Gambar 1. Status siklus proses dan peristiwa transisi untuk pembelian langganan yang diperpanjang otomatis.

Untuk memperbarui status di backend Anda, panggil purchases.subscriptionsv2.get API dengan token pembelian yang disertakan dalam notifikasi. Endpoint ini memberikan status langganan terbaru berdasarkan token pembelian dan dianggap sebagai sumber kebenaran untuk pengelolaan langganan.

Token pembelian valid sejak pendaftaran langganan hingga 60 hari setelah masa berlaku habis. Setelah tanggal ini, token pembelian tidak lagi valid untuk digunakan memanggil Google Play Developer API.

Pembelian langganan baru yang diperpanjang otomatis

Saat pengguna membeli langganan, pesan SubscriptionNotification dengan jenis SUBSCRIPTION_PURCHASED akan dikirim ke klien RTDN Anda. Baik Anda menerima notifikasi ini atau mendaftarkan pembelian baru dalam aplikasi melalui PurchasesUpdatedListener atau mengambil pembelian secara manual di metode onResume() aplikasi, Anda harus memproses pembelian baru di backend yang aman. Untuk melakukannya, ikuti langkah berikut:

  1. Buat kueri endpoint purchases.subscriptionsv2.get untuk mendapatkan resource langganan yang berisi status langganan terbaru.
  2. Pastikan nilai kolom subscriptionState adalah SUBSCRIPTION_STATE_ACTIVE.
  3. Verifikasi pembelian.
  4. Beri pengguna akses ke konten. Akun pengguna yang terkait dengan pembelian dapat diidentifikasi dengan objek ExternalAccountIdentifiers dari resource langganan jika ID ditetapkan pada waktu pembelian menggunakan setObfuscatedAccountId dan setObfuscatedProfileId.

Library Layanan Penagihan Play juga menyertakan metode untuk mengonfirmasi langganan, acknowledgePurchase(), dan metode untuk memeriksa status konfirmasi, isAcknowledged(). Namun, sebaiknya Anda menangani pemrosesan pembelian di backend untuk keamanan yang lebih baik.

Resource langganan untuk pembelian baru terlihat mirip dengan contoh berikut:

{
  "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
      }
    }
  ],
}

Perpanjangan langganan

Notifikasi SUBSCRIPTION_RENEWED dikirim saat langganan dengan perpanjangan otomatis diperpanjang. Pastikan pengguna masih berhak menikmati langganan, lalu perbarui status langganan dengan expiryTime baru yang disediakan di resource langganan yang ditampilkan dari Google Play Developer API. Resource langganan terlihat mirip dengan contoh berikut:

{
  "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
      }
    }
  ]
}

Anda tidak perlu mengonfirmasi perpanjangan langganan.

Masa tenggang

Jika ada masalah pembayaran dengan perpanjangan langganan, Google akan memberi tahu pengguna dan secara berkala mencoba memperpanjang langganan selama beberapa waktu sebelum langganan berakhir. Masa pemulihan ini dapat terdiri dari masa tenggang yang diikuti dengan masa penangguhan akun. Selama masa tenggang, pengguna masih memiliki akses ke hak langganan mereka.

Metode queryPurchasesAsync() akan terus menampilkan pembelian yang berada dalam masa tenggang. Jika hanya mengandalkan queryPurchasesAsync untuk memeriksa apakah pengguna berhak berlangganan, aplikasi harus otomatis menangani masa tenggang, karena langganan ini ditampilkan sebagai aktif melalui Library Layanan Penagihan Play.

Menyinkronkan status langganan dengan backend memungkinkan Anda lebih mengetahui tentang penolakan pembayaran dan memberi Anda lebih banyak konteks saat mencoba mengurangi churn yang tidak disengaja. Proses pesan SubscriptionNotification dengan jenis SUBSCRIPTION_IN_GRACE_PERIOD yang akan menerima notifikasi saat pengguna memasuki masa tenggang. Saat pengguna berada dalam masa tenggang, resource langganan berisi autoRenewEnabled = true. Google Play memperpanjang nilai expiryTime secara dinamis hingga masa tenggang berakhir karena hak harus berlaku hingga pengguna membatalkannya atau masa tenggang berlangsung selama panjang maksimumnya. Nilai kolom subscriptionState selama periode ini adalah SUBSCRIPTION_STATE_IN_GRACE_PERIOD. Resource langganan terlihat mirip dengan contoh berikut:

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

Play memberi tahu pengguna yang berada dalam masa tenggang bahwa pembayaran mereka ditolak dan meminta mereka memperbaiki masalah metode pembayaran di Play Store. Saat pengguna memasuki masa tenggang, sebaiknya Anda juga menyarankan pengguna tersebut untuk memperbaiki metode pembayaran jika kegagalannya tidak disengaja. Cara mudah untuk melakukannya adalah dengan menggunakan In-App Messaging API. Jika Anda memanggil API ini saat pengguna membuka aplikasi, pengguna akan melihat pesan Play di snackbar sementara yang memberi tahu pengguna bahwa pembayaran mereka telah ditolak. Pesan ini juga menyertakan deep link bagi pengguna untuk memperbaiki metode pembayarannya di Google Play.

Segera setelah pengguna memperbaiki metode pembayaran, langganan akan diperpanjang dengan tanggal perpanjangan aslinya, dan Anda dapat menangani perpanjangan seperti yang dijelaskan dalam Perpanjangan.

Jika pengguna tidak memperbaiki metode pembayaran selama masa tenggang, langganan akan memasuki penangguhan akun, dan pengguna akan kehilangan haknya.

Akses dan pemulihan masa tenggang

Gambar 2 menunjukkan linimasa untuk langganan yang memasuki masa tenggang, lalu melakukan pemulihan saat pengguna memperbaiki metode pembayaran. Setelah masa tenggang berakhir, pengguna akan kehilangan manfaat langganan dan memasuki penangguhan akun.

Gambar 2. Linimasa untuk langganan yang memasuki masa tenggang dan dipulihkan sebelum berakhir.

Penting untuk mengingat poin-poin berikut:

  • Selama masa tenggang, pengguna masih memiliki akses ke manfaat langganan.
  • Jika langganan dipulihkan selama masa tenggang, tanggal perpanjangan tidak direset.
  • Jika Anda memperpanjang masa tenggang, misalnya, dari 7 hari menjadi 14 hari, pengguna yang berada dalam masa tenggang akan mendapatkan perpanjangan akses ke manfaat langganan.
  • Jika Anda mengurangi masa tenggang, manfaat langganan bagi pengguna dengan masa tenggang lama yang hampir habis dan melebihi masa tenggang baru akan segera dicabut. Misalnya, jika Anda mengurangi masa tenggang dari 14 hari menjadi 7 hari, pengguna yang berada pada hari ke-8-14 masa tenggang lama akan segera dicabut manfaat langganannya.
  • Langganan tetap dalam status aktif dan Anda tidak akan menerima RTDN masa tenggang hingga masa tenggang senyap berakhir

Masa tenggang senyap

Anda dapat menetapkan masa tenggang 0 hari, tetapi Play akan menunggu minimal 1 hari untuk memastikan waktu yang cukup bagi percobaan ulang pembayaran. Masa tenggang senyap ini menawarkan jaring pengaman untuk pemrosesan pembayaran. Selama periode 24 jam ini, langganan tetap dalam status ACTIVE.

Cara terbaik agar Anda tetap sinkron dengan perubahan status langganan adalah dengan memproses dan bereaksi terhadap notifikasi developer real-time (RTDN). Panggil metode purchases.subscriptionsv2.get() pada waktu RTDN, bukan waktu masa berakhir, untuk mendapatkan status langganan yang lebih akurat.

Bergantung pada status langganan setelah masa tenggang diam 24 jam, Anda akan menerima salah satu notifikasi berikut:

  • SUBSCRIPTION_ON_HOLD (jika diaktifkan)
  • SUBSCRIPTION_CANCELED (jika dibatalkan)
  • SUBSCRIPTION_EXPIRED (jika masa berlaku habis)
  • SUBSCRIPTION_RENEWED (jika berhasil diperpanjang)

Anda juga dapat memanggil metode subscriptionV2.get() kapan saja setelah masa tenggang senyap 24 jam untuk mendapatkan status langganan terbaru.

Penangguhan akun

Jika ada masalah pembayaran terkait perpanjangan langganan, setelah masa tenggang berakhir, periode penangguhan akun akan dimulai. Saat langganan memasuki penangguhan akun, Anda harus memblokir akses ke hak langganan.

Selama penangguhan akun, Anda harus terus menangani pembatalan, pemulihan, atau pembelian ulang langganan sesuai kebutuhan, karena pengguna dapat melakukan perubahan ini saat langganan ditangguhkan.

RTDN memberi tahu Anda saat pengguna memasuki periode penangguhan akun, sehingga Anda dapat memberi tahu mereka sesegera mungkin mengapa akses mereka ke langganan ditangguhkan. Cara mudah untuk melakukannya adalah dengan menggunakan In-App Messaging API. Memanggil API ini saat pengguna membuka aplikasi akan menampilkan pesan di snackbar sementara yang memberi tahu pengguna bahwa pembayaran mereka telah ditolak. Pesan ini juga menyertakan deep link bagi pengguna untuk memperbaiki metode pembayarannya di Google Play.

Jika pengguna dapat mengakses konten langganan di luar aplikasi, mereka mungkin mengetahui bahwa mereka kehilangan akses di platform yang berbeda. Sebaiknya Anda mengirimkan notifikasi push atau email kepada pengguna untuk memberi tahu bahwa langganan mereka tidak lagi aktif karena penolakan pembayaran.

Langganan tidak ditampilkan oleh metode queryPurchasesAsync() selama penangguhan akun. Jadi, jika aplikasi Anda mengandalkan metode ini untuk menampilkan pembelian yang ada, Anda harus mendukung penangguhan akun secara default.

Dengan notifikasi developer real time, Anda akan menerima pesan SubscriptionNotification dengan jenis SUBSCRIPTION_ON_HOLD saat langganan memasuki status penangguhan akun. Panggil metode purchases.subscriptionsv2.get dari server backend yang aman untuk mengambil informasi langganan baru. Selama penangguhan akun, kolom expiryTime dari resource langganan disetel ke stempel waktu yang lalu, dan kolom subscriptionState disetel ke SUBSCRIPTION_STATE_ON_HOLD:

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

Untuk memulihkan akses, pengguna harus memperbaiki metode pembayaran. Play memberi tahu pengguna tentang penangguhan akun terkait penolakan pembayaran mereka, dan Anda juga harus mendorong mereka untuk memperbaiki metode pembayaran.

Setelah pengguna memperbaiki metode pembayaran, langganan akan dikembalikan ke status aktif, lalu Anda harus memulihkan akses ke konten langganan. Dalam hal ini, token pembelian sama dengan yang ada sebelum penangguhan akun dimulai karena pembelian yang sama dipulihkan, dan Anda menerima RTDN dengan jenis SUBSCRIPTION_RECOVERED.

Setelah pemulihan, Play Billing Library akan menampilkan langganan lagi melalui metode queryPurchasesAsync(). Jika Anda menggunakan metode ini untuk menentukan apakah pengguna berhak menikmati langganan, aplikasi Anda harus otomatis menangani pemulihan langganan dari penangguhan akun.

Proses pesan SubscriptionNotification dengan jenis SUBSCRIPTION_RECOVERED untuk mendapatkan notifikasi saat langganan dipulihkan dan pengguna akan mendapatkan akses kembali. Jika Anda membuat kueri langganan setelah menerima notifikasi ini, kolom expiryTime akan disetel ke stempel waktu di masa mendatang dan kolom subscriptionState akan disetel ke SUBSCRIPTION_STATE_ACTIVE lagi:

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

Jika pengguna tidak memperbaiki metode pembayaran sebelum masa penangguhan akun berakhir, Anda akan menerima RTDN dengan jenis SUBSCRIPTION_CANCELED. Untuk petunjuk tentang cara menangani pembatalan, lihat Pembatalan. Jika Anda membuat kueri langganan yang dibatalkan dengan cara ini, kolom expiryTime yang ditampilkan akan disetel ke stempel waktu yang lalu:

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

Segera setelah Anda menerima notifikasi terkait pembatalan selama penangguhan akun, Anda juga akan menerima RTDN dengan jenis SUBSCRIPTION_EXPIRED karena pengguna tidak lagi memiliki hak berbayar dan langganannya telah dihentikan dengan pembatalan. Anda dapat menangani masa berlaku ini seperti biasa.

Pengguna dapat memperoleh kembali akses dengan membeli kembali paket langganan yang sama atau paket lain apa pun yang Anda tawarkan melalui aplikasi selama periode penangguhan akun sejak pembelian awal mereka. Dalam hal ini, token pembelian baru akan dikeluarkan dan nilai yang baru akan ditampilkan sebagai bagian dari peristiwa SUBSCRIPTION_PURCHASED yang mewakili instance baru ini.

Akses dan pemulihan penangguhan akun

Gambar 3 menunjukkan linimasa untuk langganan yang memasuki penangguhan akun, lalu melakukan pemulihan saat pengguna memperbaiki metode pembayaran.

Gambar 3. Linimasa untuk langganan yang memasuki penangguhan akun dan dipulihkan sebelum berakhir.

Serupa dengan contoh sebelumnya, Gambar 4 menunjukkan linimasa untuk langganan yang pertama kali memasuki masa tenggang sebelum memasuki penangguhan akun, lalu dipulihkan ketika ditangguhkan.

Gambar 4. Linimasa untuk langganan yang memasuki masa tenggang, lalu memasuki penangguhan akun, dan akhirnya dipulihkan sebelum penangguhan akun berakhir.

Penting untuk mengingat poin-poin berikut:

  • Sebelum langganan memasuki penangguhan akun, Google Play akan melakukan upaya tambahan untuk menagih metode pembayaran hingga 48 jam. Pengguna masih memiliki manfaat langganan selama periode ini. Setelah periode percobaan ulang ini berlalu, langganan akan memasuki penangguhan akun, dan pengguna akan kehilangan akses ke manfaat langganan.
  • Langganan memasuki penangguhan akun secara langsung saat langganan dilanjutkan dari status dijeda dengan metode pembayaran yang gagal.
  • Saat langganan dipulihkan dari penangguhan akun, tanggal perpanjangan akan direset.

Berakhirnya masa berlaku

Setelah masa berlaku langganan berakhir, pengguna akan kehilangan akses ke langganan. Dalam hal ini, pesan SubscriptionNotification dengan jenis SUBSCRIPTION_EXPIRED akan dikirim. Saat Anda menerima notifikasi ini, buat kueri Google Play Developer API untuk mendapatkan resource langganan terbaru. Setelah Anda mengonfirmasi bahwa subscriptionState adalah SUBSCRIPTION_STATE_EXPIRED, hapus hak dan daftarkan status pembelian sebagai tidak valid di backend Anda. Resource langganan terlihat mirip dengan contoh berikut:

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

Pembatalan

Pengguna dapat membatalkan langganan secara sukarela dari pusat langganan Play atau langganan mereka akan otomatis dibatalkan jika mereka tidak memulihkannya setelah memasuki penangguhan akun. Developer juga dapat memicu pembatalan dengan purchases.subscriptions.cancel Saat langganan dibatalkan, pengguna akan tetap memiliki akses ke konten tersebut hingga akhir siklus penagihan saat ini. Saat siklus penagihan berakhir, akses harus dicabut.

Membatalkan langganan akan memicu notifikasi SUBSCRIPTION_CANCELED. Saat notifikasi ini dikirim, resource langganan yang ditampilkan dari Google Play Developer API memiliki kolom subscriptionState yang ditetapkan ke SUBSCRIPTION_STATE_CANCELED, dan kolom expiryTime berisi tanggal saat pengguna akan kehilangan akses ke langganan. Jika tanggal tersebut sudah berlalu, pengguna akan segera kehilangan haknya. Hal ini dapat terjadi, misalnya, jika pengguna membatalkan langganan saat penangguhan akun karena penolakan pembayaran.

Resource langganan untuk pembelian yang dibatalkan terlihat mirip dengan contoh berikut:

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

Anda dapat melihat kolom canceledStateContext di resource langganan untuk mengetahui alasan langganan dibatalkan (misalnya, apakah langganan dibatalkan oleh pengguna, oleh sistem, atau oleh Anda). Jika langganan dibatalkan oleh pengguna, Anda dapat melihat kolom userInitiatedCancellation untuk mengetahui alasan pengguna membatalkan langganan. Hal ini dapat membantu menginformasikan strategi komunikasi.

Jika dibatalkan saat masa berlakunya belum berakhir, langganan masih ditampilkan dari queryPurchasesAsync(). Anda mungkin ingin menampilkan pesan di aplikasi yang memberi tahu pengguna bahwa langganan mereka dibatalkan, serta memberikan tanggal habis masa berlaku.

Pencabutan

Langganan dapat dicabut karena berbagai alasan, termasuk backend Anda mencabut langganan dengan menggunakan purchases.subscriptions.revoke atau pembelian tersebut ditagih kembali. Dalam situasi ini, segera cabut hak pengguna. Pesan SubscriptionNotification dengan jenis SUBSCRIPTION_REVOKED dikirim saat hal ini terjadi. Saat Anda menerima notifikasi ini, resource langganan yang ditampilkan dari Google Play Developer API memiliki kolom subscriptionState yang ditetapkan ke SUBSCRIPTION_STATE_EXPIRED.

Resource langganan untuk pembelian yang dicabut terlihat mirip dengan contoh berikut:

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

Langganan ditunda

Ada berbagai alasan mengapa Anda perlu memperpanjang hak pengguna. Misalnya, Anda mungkin ingin menawarkan akses gratis kepada pengguna sebagai promosi khusus, seperti memberikan satu minggu pembelian film secara gratis atau memberikan akses gratis kepada pelanggan sebagai bentuk niat baik. Anda dapat menggunakan metode purchases.subscriptions.defer dari Play Developer API guna melanjutkan tanggal penagihan berikutnya untuk langganan yang diperpanjang otomatis. Jika Anda melakukannya, pesan SubscriptionNotification dengan jenis SUBSCRIPTION_DEFERRED akan dikirim. Selama periode penundaan, pengguna berlangganan konten Anda dengan akses penuh tanpa dikenai biaya. Tanggal perpanjangan langganan akan diperbarui untuk menunjukkan tanggal yang baru.

Untuk paket prabayar, Anda dapat menggunakan defer billing API untuk menunda waktu habis masa berlaku.

Resource langganan untuk langganan yang ditunda terlihat mirip dengan contoh berikut:

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

Langganan dijeda

Anda dapat mencegah churn sukarela dengan memungkinkan pengguna menjeda langganan. Saat Anda mengaktifkan fitur jeda, pengguna dapat memilih untuk menjeda langganan untuk jangka waktu antara satu minggu hingga tiga bulan, bergantung pada periode pengulangannya.

Jeda langganan hanya berlaku setelah periode penagihan saat ini berakhir. Selama langganan dijeda, pengguna tidak memiliki akses ke langganan, dan mereka tidak membayar harga perpanjangannya. Pada akhir periode jeda, langganan dilanjutkan dan Google berupaya memperpanjang langganan tersebut. Jika dapat dilanjutkan, langganan akan aktif kembali. Jika langganan tidak dapat dilanjutkan karena masalah pembayaran, pengguna akan memasuki status penangguhan akun, seperti ditunjukkan pada gambar 5 dan 6:

Gambar 5. Pengguna menjeda langganan, lalu melanjutkannya.
Gambar 6. Pengguna menjeda langganannya, lalu masuk ke penangguhan akun.

Pengguna juga dapat memilih untuk melanjutkan langganan secara manual kapan saja selama periode jeda, seperti ditunjukkan pada gambar 6. Jika pengguna melanjutkan secara manual, tanggal penagihan berubah ke tanggal melanjutkan manual.

Saat langganan pengguna dijeda, Library Layanan Penagihan Play tidak akan menampilkan langganan melalui metode queryPurchasesAsync(). Jika langganan dilanjutkan, metode queryPurchasesAsync() akan menampilkannya lagi.

Proses RTDN untuk mengetahui kapan pengguna menjeda langganan mereka. Notifikasi ini juga memungkinkan Anda memberi tahu pengguna di aplikasi bahwa mereka telah menjeda langganan dan tidak memiliki akses ke langganan tersebut. Anda juga harus menyediakan cara bagi pengguna untuk melanjutkan langganan mereka secara manual kapan saja dengan menggunakan deep link ke Google Play.

Pesan SubscriptionNotification dengan jenis SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED dikirim saat pengguna mulai menjeda langganan. Untuk saat ini, pengguna dapat terus mengakses langganan hingga tanggal perpanjangan berikutnya, dan resource langganan berisi autoRenewEnabled = true. Nilai kolom subscriptionState adalah SUBSCRIPTION_STATE_ACTIVE pada tahap ini.

Pesan SubscriptionNotification dengan jenis SUBSCRIPTION_PAUSED dikirim saat langganan mulai dijeda. Jika hal ini terjadi, pengguna akan kehilangan akses ke langganannya, dan resource langganan berisi autoRenewEnabled = true, dan kolom subscriptionState disetel ke SUBSCRIPTION_STATE_PAUSED. Anda dapat melihat kapan langganan diperkirakan akan diperpanjang lagi dengan memeriksa objek PausedStateContext.

Pesan SubscriptionNotification dengan jenis SUBSCRIPTION_RENEWED dikirim jika langganan dilanjutkan secara otomatis pada akhir periode jeda atau jika pengguna memilih untuk melanjutkan langganan secara manual. Hal ini harus ditangani seperti yang dijelaskan dalam Perpanjangan.

Pesan SubscriptionNotification dengan jenis SUBSCRIPTION_ON_HOLD dikirim jika terjadi kegagalan pembayaran saat mencoba melanjutkan langganan setelah dijeda. Hal ini harus ditangani seperti yang dijelaskan di Penangguhan akun.

Berlangganan lagi

Untuk paket dasar langganan yang diperpanjang otomatis, Google Play Store dapat menampilkan tombol Berlangganan lagi. Dengan tombol ini, pengguna bisa mendapatkan kembali akses ke langganan. Langganan mungkin tidak muncul karena berbagai alasan, misalnya saat masa berlaku langganan sudah lama berakhir.

Gambar 7. Bagian Akun > Langganan di aplikasi Google Play Store yang menampilkan langganan yang dibatalkan dengan tombol Berlangganan lagi.

Meskipun tombol tersebut selalu berlabel Berlangganan lagi, fungsinya bergantung pada status langganan.

Saat langganan dibatalkan tetapi masa berlakunya belum habis, pengguna masih berlangganan dan menerima manfaat langganan. Jika pengguna mengetuk Berlangganan lagi, pembatalan akan langsung diurungkan dan langganan akan diperpanjang. Tindakan ini disebut sebagai pemulihan dalam API dan dokumentasi developer Play.

Setelah masa berlaku langganan dengan perpanjangan otomatis berakhir, Anda dapat mengizinkan pengguna untuk membeli paket dasar langganan yang sama. Tindakan ini disebut sebagai berlangganan lagi dalam API dan dokumentasi developer Play. Anda dapat mengonfigurasi opsi ini untuk setiap paket dasar di Konsol Play atau menggunakan API.

Memulihkan sebelum masa berlaku habis

Jika aplikasi hanya mengandalkan metode queryPurchasesAsync() untuk menentukan apakah pengguna berhak menikmati langganan, aplikasi harus otomatis menangani pemulihan karena metode queryPurchasesAsync() terus menampilkan pembelian yang dibatalkan sebelum tanggal habis masa berlakunya. Langganan yang dipulihkan akan terus diperpanjang seolah-olah tidak dibatalkan.

Jika aplikasi menyinkronkan status langganan dengan backend, Anda harus memproses pesan SubscriptionNotification dengan jenis SUBSCRIPTION_RESTARTED. Setelah Anda menerima RTDN ini, aplikasi Anda dapat merespons notifikasi, mencatat bahwa langganan kini disetel untuk diperpanjang, dan berhenti menampilkan pesan pemulihan di aplikasi Anda. Resource langganan terlihat mirip dengan contoh berikut:

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

Berlangganan lagi setelah masa berlaku habis

Jika paket dasar dengan perpanjangan otomatis dikonfigurasi menggunakan Konsol Google Play atau API untuk mengizinkan Berlangganan lagi, pengguna dapat membeli kembali langganan yang telah habis masa berlakunya di Google Play Store.

Ini adalah pembelian baru. Google Play mengeluarkan token pembelian baru, dan backend Anda menerima RTDN dengan jenis SUBSCRIPTION_PURCHASED. Status pembelian untuk jenis pembelian di luar aplikasi ini tidak mencakup linkedPurchaseToken yang terkait dengan pembelian asli karena masa berlaku langganan asli sudah habis sepenuhnya. Ini adalah pembelian baru yang harus diproses dan dikonfirmasi oleh backend Anda seperti pembelian lainnya.

Mengupgrade, mendowngrade, dan berlangganan lagi

Jika pengguna mengupgrade, mendowngrade, atau mendaftar setelah pembatalan dari aplikasi sebelum masa berlaku langganan berakhir, langganan lama akan menjadi tidak valid dan langganan baru akan dibuat dengan token pembelian baru.

Selain itu, resource langganan yang ditampilkan dari Google Play Developer API berisi kolom linkedPurchaseToken yang menunjukkan pembelian lama tempat pengguna mengupgrade, mendowngrade, atau berlangganan lagi. Anda dapat menggunakan token pembelian di kolom tersebut untuk mencari langganan lama dan mengidentifikasi akun pengguna yang ada sehingga Anda dapat mengaitkan pembelian baru dengan akun yang sama.

Sebelum menawarkan opsi upgrade, downgrade, atau berlangganan lagi kepada pengguna di aplikasi, Anda harus mengonfirmasi langganan yang ada. Perubahan paket atau berlangganan lagi akan diblokir jika langganan yang ada masih menunggu konfirmasi.

Jika pengguna berhasil membeli upgrade, downgrade, atau berlangganan lagi, ini adalah pembelian baru yang harus Anda konfirmasi. Cara yang direkomendasikan untuk melakukannya adalah dengan menggunakan Google Play Developer API. Resource langganan terlihat mirip dengan contoh berikut:

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

Perubahan harga

Lihat panduan praktik terbaik perubahan harga untuk mempelajari cara mengubah harga langganan yang diperpanjang otomatis dan memberi tahu pengguna jika perlu.

Saat perubahan harga diterapkan kepada pelanggan lama sebagai keikutsertaan, Anda akan menerima RTDN jika pengguna mengambil tindakan untuk mengonfirmasi atau menolak harga baru.

Menangani konfirmasi pengguna atas perubahan harga keikutsertaan

Saat pengguna menyetujui kenaikan harga langganan, Anda akan menerima pesan SubscriptionNotification dengan jenis SUBSCRIPTION_PRICE_CHANGED_CONFIRMED. Dengan penurunan harga ketidakikutsertaan, atau saat kenaikan harga langganan diperpanjang, Anda akan menerima pesan SubscriptionNotification dengan jenis SUBSCRIPTION_RENEWED. Perlakukan notifikasi ini seperti perpanjangan lainnya.

Menangani kasus kenaikan harga keikutsertaan yang tidak disetujui

Jika pengguna belum menyetujui kenaikan harga keikutsertaan sebelum mereka harus melakukan perpanjangan dengan harga yang lebih tinggi, mereka akan otomatis berhenti berlangganan, dan Anda akan menerima pesan SubscriptionNotification dengan jenis SUBSCRIPTION_CANCELED. Tangani peristiwa ini seperti yang dijelaskan dalam Pembatalan.

Pengguna juga dapat membatalkan langganan untuk kenaikan harga ketidakikutsertaan dengan mengikuti mekanisme yang sama.

Menangani siklus proses untuk paket prabayar

Seperti halnya langganan yang diperpanjang otomatis, Anda harus mengonfirmasi paket prabayar setelah setiap pembelian baru. Dalam kasus paket prabayar, Anda harus sepenuhnya memproses pembelian awal dan penambahan saldo apa pun, karena pengguna harus melalui alur pembelian setiap waktu.

Karena durasi paket prabayar cenderung pendek, penting untuk mengonfirmasi pembelian sesegera mungkin. Paket prabayar dengan durasi satu minggu atau lebih harus dikonfirmasi dalam waktu tiga hari. Paket prabayar dengan durasi kurang dari satu minggu harus dikonfirmasi dalam waktu setengah dari durasi paket. Misalnya, developer memiliki waktu 1,5 hari untuk mengonfirmasi pembelian paket prabayar tiga hari.

Gambar 8. Status siklus proses dan peristiwa transisi untuk pembelian langganan.

Pesan SubscriptionNotification dengan jenis SUBSCRIPTION_PURCHASED dikirim ke klien RTDN Anda setiap kali langganan paket prabayar dibeli, termasuk setiap penambahan saldo. Panggil metode purchases.subscriptionsv2.get untuk memeriksa status langganan paket prabayar terbaru.

Token pembelian baru dikeluarkan untuk pembelian penambahan saldo, dan Anda akan menerima token pembelian sebelumnya di kolom linkedPurchaseToken sebagai bagian dari status pembelian langganan baru. Token pembelian valid sejak pendaftaran langganan hingga 60 hari setelah masa berlaku habis. Setelah tanggal ini, token pembelian tidak lagi valid untuk digunakan memanggil Google Play Developer API.

Resource langganan untuk pembelian paket prabayar terlihat mirip dengan contoh berikut:

{
  "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
      }
    }
  ]
}

Anda dapat melihat kapan hak berakhir di kolom expiryTime. Pembelian penambahan saldo akan memperpanjang waktu hak dengan mengakumulasinya. Hal ini berarti bahwa jika pengguna menambah saldo sebelum hak aslinya berakhir, waktu baru akan ditambahkan di atas tanggal habis masa berlaku sebelumnya.

Anda mungkin ingin menampilkan pesan di aplikasi yang memberi tahu pengguna bahwa langganan prabayar mereka dapat diperpanjang dengan penambahan saldo. Untuk mengetahui kapan pengguna dapat melakukan penambahan saldo, periksa kolom allowExtendAfterTime di resource langganan.

Paket prabayar tidak diperpanjang secara otomatis, sehingga tidak dapat dibatalkan. Jika pengguna ingin membatalkan paket prabayar, mereka bisa membiarkan aplikasi mencapai tanggal habis masa berlakunya.