Menambahkan fitur khusus langganan

Langganan dikonfigurasi menggunakan Konsol Play Android. Setelah langganan dikonfigurasi, Anda dapat menambahkan Layanan Penagihan Google Play ke aplikasi Anda untuk mengaktifkan alur pembelian untuk langganan. Langganan memiliki banyak karakteristik yang disebutkan dalam Ringkasan Layanan Penagihan Google Play, seperti periode penagihan, masa tenggang, uji coba gratis, dan sebagainya. Anda harus mengenal konsep ini sebelum membaca bagian ini.

Lihat video langganan terbaru untuk mengetahui informasi lebih lanjut.

Selain itu, sebelum membaca bagian lainnya dari halaman ini, Anda harus mengaktifkan notifikasi developer real-time. Notifikasi Developer Real-time memungkinkan Anda untuk menindaklanjuti perubahan status secara proaktif, meningkatkan interaksi, dan mengurangi pergantian pengguna. Untuk mengaktifkan notifikasi ini, lihat Notifikasi Developer Real-time.

Ada beberapa kasus penggunaan langganan yang harus Anda coba untuk mengakomodasi solusi Layanan Penagihan Google Play secara menyeluruh.

Anda dapat menggunakan kombinasi Library Layanan Penagihan Google Play, Google Play Developer API, dan Notifikasi Developer Real-time untuk mengatasi kasus penggunaan ini.

Menangani status terkait langganan menggunakan Notifikasi Developer Real-time

Notifikasi developer real-time adalah notifikasi push server yang memberi Anda kapabilitas untuk memantau perubahan status, seperti SUBSCRIPTION_PURCHASED atau SUBSCRIPTION_RECOVERED, untuk langganan. Notifikasi Developer Real-time memungkinkan Anda untuk menindaklanjuti perubahan status secara proaktif, meningkatkan interaksi, dan mengurangi pergantian pengguna. Untuk mengaktifkan notifikasi ini, lihat Notifikasi Developer Real-time.

Jika Anda mengaktifkan Notifikasi Developer Real-time, server backend aman Anda menerima notifikasi yang hanya memberi tahu perubahan status langganan. Anda harus memanggil API developer setelah menerima Notifikasi Developer Real-time untuk mendapatkan status lengkap dan memperbarui status backend Anda sendiri. Notifikasi ini hanya memberi tahu Anda bahwa status langganan berubah; tidak memberikan informasi lengkap status langganan.

Saat memeriksa API developer, Anda harus selalu melakukan hal berikut:

  • Jika expiryTimeMillis belum berakhir, selalu berikan hak.
  • Jika autoRenewing = false, coba minta pengguna mendaftar ulang, karena langganan akan berakhir saat habis masa berlakunya.
  • Jika paymentState = 0, arahkan pengguna ke pusat langganan menggunakan deep link pusat langganan untuk memperbaiki masalah pembayaran pengguna.

Di masa mendatang, kami mungkin menambahkan perubahan status tambahan yang memengaruhi hak pengguna, seperti mengaktifkan ulang langganan setelah habis masa berlakunya. Agar integrasi Anda siap menerapkan fitur-fitur ini, pastikan untuk menangani notifikasi yang tidak ditentukan dengan memanggil API developer dan mengambil tindakan sebagaimana dijelaskan di atas.

Pengguna dalam masa tenggang - SUBSCRIPTION_IN_GRACE_PERIOD

Masa tenggang berlangsung selama jangka waktu tertentu berdasarkan setelan produk dalam aplikasi Anda di Konsol Google Play. Google Play mencoba memperpanjang langganan selama masa tenggang. Untuk memberi tahu pengguna tentang masalah pembayaran, berikan pesan di aplikasi Anda yang memberitahukan cara memperbaiki metode pembayaran mereka. Jika tidak, pengguna akan kehilangan akses ke langganannya. Misalnya, "Untuk mencegah gangguan pada akun, buka setelan langganan Google Play untuk memperbaiki pembayaran Anda di Google Play". Pesan ini akan ditautkan ke setelan langganan Google Play sehingga pengguna dapat memperbaiki metode pembayarannya.

Untuk menentukan sisa waktu yang dimiliki pengguna dalam masa tenggang, panggil Google Play Developer API. Google Play memperpanjang nilai expiryTimeMillis secara dinamis hingga masa tenggang berakhir. Selama jangka waktu ini, Anda harus memeriksa apakah langganan pengguna telah dibatalkan, diperpanjang, atau ditangguhkan. Anda harus memeriksa status langganan pengguna saat ini setelah expiryTimeMillis telah terlampaui untuk mendapatkan status langganan terbaru.

Isi respons JSON bervariasi bergantung pada status langganan, seperti yang ditunjukkan dalam cuplikan berikut. Misalnya, jika Anda membuat kueri langganan selama masa tenggang (metode pembayaran bermasalah), expiryTimeMillis diupdate secara dinamis ke stempel waktu yang akan datang dan paymentState disetel ke 0:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 0  # Payment pending
}

Jika Anda membuat kueri langganan setelah langganan berhasil diperpanjang (metode pembayaran diperbarui), expiryTimeMillis disetel ke stempel waktu yang akan datang dan paymentState disetel ke 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

Jika Anda membuat kueri langganan setelah masa tenggang berakhir, langganan akan ditangguhkan (jika Anda mengaktifkan Penangguhan Akun di Konsol Google Play) atau dibatalkan (jika Anda tidak mengaktifkan Penangguhan Akun di Konsol Google Play). Untuk contoh respons JSON bagi SUBSCRIPTION_ON_HOLD dan SUBSCRIPTION_CANCELLED, lihat bagian Penangguhan Akun - SUBSCRIPTION_ON_HOLD.

Penangguhan Akun - SUBSCRIPTION_ON_HOLD

Masa penangguhan akun berlangsung selama 30 hari. Selama penangguhan akun, sebaiknya periksa apakah langganan pengguna telah dibatalkan, dipulihkan, atau diperpanjang. Selama penangguhan akun, beri tahu pengguna alasan ditangguhkannya akses ke langganan. Untuk memberi tahu pengguna, berikan pesan di aplikasi Anda yang memberitahukan petunjuk tentang cara memperbaiki metode pembayaran mereka dan mendapatkan kembali akses ke langganan. Misalnya, "Ada masalah dengan langganan Anda. Buka setelan langganan Google Play untuk memperbaiki pembayaran Anda di Google Play". Pesan ini akan ditautkan ke setelan langganan Google Play sehingga pengguna dapat memperbaiki metode pembayarannya. Sebaiknya Anda juga mengambil beberapa tindakan lain, seperti:

  • Jika pengguna memperbarui metode pembayaran dan langganan dipulihkan, aplikasi Anda harus memulihkan akses ke konten langganan. Untuk informasi selengkapnya, buka Langganan dipulihkan - SUBSCRIPTION_RECOVERED. Akan tetapi, jika langganan tidak dipulihkan selama masa penangguhan, langganan akan dibatalkan dan pengguna harus membeli langganan baru.
  • Jika pengguna ingin aplikasi mengakses langganan di luar aplikasi, Anda mungkin perlu mengirimkan notifikasi push atau email kepada pengguna untuk memberi tahu bahwa langganan mereka tidak aktif lagi. Jika langganan hanya dapat diakses saat pengguna membuka aplikasi, Anda cukup memberi tahu mereka tentang gangguan langganan saat pengguna membuka aplikasi untuk kedua kalinya.

Untuk memverifikasi bahwa akun masih ditangguhkan, Anda harus memeriksa status langganan pengguna saat ini setiap kali pengguna tersebut mencoba mengakses konten langganan di aplikasi Anda.

Isi respons JSON bervariasi bergantung pada status langganan, seperti yang ditunjukkan dalam cuplikan berikut. Misalnya, jika Anda membuat kueri langganan selama penangguhan akun (metode pembayaran bermasalah), expiryTimeMillis disetel ke stempel waktu yang lalu dan paymentState disetel ke 0:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_past,
  "autoRenewing": true,
  ...
  "paymentState": 0  # Payment pending
}

Jika Anda membuat kueri langganan setelah langganan dipulihkan (metode pembayaran diperbarui), expiryTimeMillis disetel ke stempel waktu yang akan datang dan paymentState disetel ke 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_future,
  "autoRenewing": true,
  ...
  "paymentState": 1  # Payment received
}

Jika Anda membuat kueri langganan setelah penangguhan berlangsung selama 30 hari dan langganan dibatalkan, expiryTimeMillis disetel ke stempel waktu yang lalu dan cancelReason disetel ke 1:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": timestamp_in_past,
  "autoRenewing": false,
  ...
  "cancelReason": 1  # The system canceled the subscription
}

Pemulihan langganan- SUBSCRIPTION_RECOVERED

Setelah memulihkan langganan, biasanya token pembelian akan tetap sama seperti sebelum penangguhan akun pengguna dimulai. Namun, ada kemungkinan pengguna mendapatkan kembali akses ke konten langganan dengan membeli kembali langganan selama periode penangguhan. Dalam hal ini, nilai token pembelian baru ditampilkan untuk mewakili instance langganan yang baru.

Setelah mendaftarkan data langganan baru di server, Anda dapat menampilkan pesan di aplikasi Anda yang memberi tahu pengguna bahwa langganan mereka dipulihkan. Misalnya, "Metode pembayaran Anda yang baru telah disimpan dan langganan Anda telah dipulihkan".

Pembatalan langganan - SUBSCRIPTION_CANCELLED

Pengguna dapat membatalkan langganan secara sukarela dari Play Store atau langganan mereka akan dibatalkan secara otomatis jika mereka tidak memulihkannya setelah ditangguhkan. Jika server backend aman Anda menerima Notifikasi Developer Real-time SUBSCRIPTION_CANCELLED:

  • Tampilkan pesan di aplikasi untuk memberi tahu pengguna bahwa langganan mereka dibatalkan, seperti "Langganan Anda akan berakhir pada **tanggal_tertentu**. Buka setelan langganan Google Play untuk memulihkan langganan Anda." Pesan ini harus ditautkan ke setelan langganan Google Play, sehingga pengguna dapat memperpanjang langganan mereka.
  • Sebaiknya berikan opsi untuk mengabaikan pesan ini secara permanen.

Saat Anda menerima token pembelian baru, ikuti langkah-langkah dalam Memverifikasi token pembelian.

Catatan: Pesan pembatalan mungkin menjengkelkan bagi pengguna, terutama pengguna yang membatalkan langganan secara manual (bukan pembatalan yang disebabkan oleh metode pembayaran yang sudah habis masa berlakunya). Anda dapat memilih untuk tidak memberi tahu pengguna yang membatalkan langganannya secara manual.

Pengguna telah menghentikan langganan mereka - SUBSCRIPTION_PAUSED

Saat membuat kueri langganan yang saat ini dijeda, jika expiryTimeMillis adalah tanggal yang telah lalu, dan autoResumeTimeMillis adalah tanggal di masa mendatang, Anda harus menangguhkan akses pengguna ke konten dan menganggap hak pengguna sebagai dijeda:

{
  "kind": "androidpublisher#subscriptionPurchase",
  ...
  "expiryTimeMillis": $subscription_entitlement_end_time (in the past)
  "autoRenewing": true,
  "paymentState": 1  # Payment received
  ...
  "autoResumeTimeMillis": $subscription_auto_resume_time (in the future)
}

Mengubah harga langganan

Peringatan: Anda tidak boleh mengubah harga langganan Berlangganan dengan Google.

Konsol Google Play memungkinkan Anda untuk mengubah harga langganan yang Anda tawarkan dalam aplikasi Anda. Fungsi ini akan sangat membantu jika Anda mengubah jumlah konten atau tingkat manfaat dalam aplikasi yang terkait dengan langganan yang diberikan.

Untuk memperbarui harga langganan, lakukan langkah-langkah berikut di Konsol Google Play:

  1. Buka aplikasi yang berisi langganan yang harganya ingin diubah.
  2. Pilih Keberadaan toko > Produk dalam aplikasi, lalu buka tab Langganan.
  3. Pilih link Edit di sebelah harga yang ingin diubah, seperti yang ditunjukkan pada Gambar 1:

    Link 'Edit' di samping harga langganan
    Gambar 1. Mengedit kolom harga langganan
  4. Masukkan harga baru yang Anda inginkan untuk langganan.

    Saat mengubah harga, dialog peringatan akan muncul, seperti yang ditunjukkan pada Gambar 2. Dialog ini menjelaskan bahwa perubahan harga Anda akan segera diterapkan untuk pelanggan baru dan akan diterapkan dalam periode 30 hari untuk pelanggan yang sudah ada yang menyetujui perubahan harga.

    Dialog peringatan perubahan harga langganan
    Gambar 2. Peringatan tentang waktu diterapkannya perubahan harga langganan

Menyampaikan perubahan harga kepada pengguna

Anda memiliki waktu minimal 7 hari untuk menghubungi pelanggan yang ada terkait perubahan harga sebelum Google Play mulai memberi tahu mereka. Google Play memberi tahu pengguna dengan menampilkan dialog seperti yang ditampilkan pada Gambar 3. Dialog ini menampilkan harga lama, harga baru, dan tanggal diterapkannya harga baru.

Dialog perubahan harga langganan umum
Gambar 3. Dialog umum yang memberi tahu pengguna tentang perubahan harga langganan

Anda dapat menampilkan dialog ini dalam aplikasi dengan cara berikut:

Meluncurkan alur konfirmasi perubahan harga

Untuk menampilkan dialog saat aplikasi diluncurkan, tambahkan logika berikut ke class klien penagihan Anda:

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
        .setSkuDetails(changedPriceSubscriptionSkuDetails)
        .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                if (responseCode == BillingResponse.OK) {
                    // User has confirmed the price change.
                } else if (responseCode == BillingResponse.USER_CANCELED) {
                    // User hasn't confirmed the price change.
                }
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
        .setSkuDetails(changedPriceSubscriptionSkuDetails)
        .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                if (responseCode == BillingResponse.OK) {
                    // User has confirmed the price change.
                } else if (responseCode == BillingResponse.USER_CANCELED) {
                    // User hasn't confirmed the price change.
                }
            }
        });

Sebelum menampilkan dialog perubahan harga Google Play, Anda dapat menampilkan pesan atau dialog Anda sendiri yang menjelaskan alasan yang mendasari perubahan harga. Jika Anda membuat dan menampilkan jenis pesan kustom ini, kemungkinan pengguna akan memilih untuk memperpanjang langganan mereka dengan harga baru.

Setelah pengguna merespons dialog kustom, aplikasi Anda akan kembali aktif dan menerima responseCode jenis BillingClient.BillingResponse dari Library Layanan Penagihan Google Play.

Anda dapat membalas respons pengguna dalam implementasi PriceChangeConfirmationListener Anda. Misalnya, dengan menampilkan pesan kustom terima kasih jika pengguna menyetujui perubahan harga.

Menangani konfirmasi pengguna tentang perubahan harga

Jika pengguna menyetujui harga langganan baru, library juga mengirimkan notifikasi ke server penagihan Anda. Anda dapat menerima notifikasi tentang respons pengguna terhadap dialog dari kapabilitas Notifikasi Developer Real-time Google. Jika pengguna menyetujui perubahan harga, Anda akan menerima notifikasi jenis SUBSCRIPTION_PRICE_CHANGE_CONFIRMED.

Menangani kasus saat perubahan harga ditolak

Pengguna bisa jadi tidak menyetujui perubahan harga di PriceChangeConfirmationListener aplikasi Anda. Dalam situasi ini, buat pelanggan tetap berlangganan ke produk lama, yang habis masa berlakunya pada tanggal perpanjangan berikutnya. Jika pengguna belum menerima perubahan harga saat langganan lama mereka habis masa berlakunya, langganan akan dihentikan dan Anda menerima notifikasi developer real-time jenis SUBSCRIPTION_CANCELED.

Jika aplikasi Anda mendukung langganan, sertakan link pada layar preferensi atau setelan yang memungkinkan pengguna untuk mengelola langganan mereka. Contoh penyertaan link ditunjukkan pada Gambar 4. Pada pengendali klik link ini, tambahkan logika untuk menentukan apakah pengguna memiliki langganan yang belum habis masa berlakunya untuk aplikasi Anda (yang dalam hal ini expiryTimeMillis di masa mendatang atau autoRenewing disetel ke true):

  • Jika pengguna tidak memiliki langganan semacam itu dalam aplikasi Anda, arahkan mereka ke halaman yang menampilkan semua langganan mereka, seperti yang ditunjukkan pada Gambar 5, menggunakan URL berikut:

    http://play.google.com/store/account/subscriptions
    
  • Jika, di sisi lain, pengguna memiliki langganan yang belum habis masa berlakunya, Anda dapat mengarahkan mereka langsung ke langganan mereka, seperti yang ditunjukkan pada Gambar 6, dengan menggunakan URL berikut:

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

Setiap SKU langganan cocok dengan ID produk yang Anda tetapkan saat membuatnya di Konsol Play. Untuk menentukan SKU langganan yang ada secara terprogram, buat kueri backend aplikasi Anda untuk daftar langganan terkait pengguna tertentu. Untuk contoh logika sistem-server yang diperlukan, lihat metode queryCurrentSubscriptions() dalam aplikasi contoh ClassyTaxi.

Layar Setelan yang menyertakan tombol yang disebut 'Langganan Google Play'
Gambar 4. Tombol Langganan Google Play dalam gambar ini memberikan contoh link "kelola langganan".
Layar detail langganan yang menampilkan langganan pengguna di semua aplikasi
Gambar 5. Layar menampilkan semua langganan pengguna yang telah dibeli di luar aplikasi yang mengarahkan mereka ke layar ini.
Layar detail langganan yang menampilkan langganan tertentu yang dibeli pengguna di aplikasi tertentu
Gambar 6. Layar menampilkan detail untuk langganan tertentu yang telah dibeli pengguna dari aplikasi yang mengarahkan mereka ke layar ini.

Mengizinkan upgrade atau downgrade langganan

Anda dapat menawarkan tingkat langganan yang berbeda kepada pengguna, seperti tingkat dasar dan tingkat premium. Gambar 7 menampilkan layar yang menawarkan dua tingkat langganan:

Gambar 7. Tingkat langganan.

Pengguna harus dapat mengakses layar serupa untuk mengupgrade atau mendowngrade langganan dengan membeli tingkat langganan yang berbeda. Aplikasi Anda harus menangani kasus ini menggunakan alur pembelian produk dalam aplikasi yang sama dengan yang digunakan untuk membeli langganan asli dalam Mengaktifkan pembelian produk dalam aplikasi. Akan tetapi, saat melakukan upgrade atau downgrade, Anda meneruskan ID produk langganan saat ini dan langganan yang akan datang (diupgrade atau didowngrade) ke object BillingFlowParams menggunakan metode setOldSku() . Misalnya:

Kotlin

val flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(newSkuDetails)
        .setOldSku(currentId)
        .build()
val responseCode = billingClient.launchBillingFlow(activity, flowParams)

Java

BillingFlowParams flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(newSkuDetails)
        .setOldSku(currentId)
        .build();
int responseCode = billingClient.launchBillingFlow(flowParams);

Saat Anda menerima token pembelian, ikuti proses verifikasi yang sama dengan yang digunakan untuk token pembelian baru. Untuk informasi lebih lanjut, lihat Memverifikasi pembelian. Google Play Developer API akan menampilkan linkedPurchaseToken di resource langganan. Pastikan untuk tidak memvalidasi token yang disediakan di linkedPurchaseToken untuk memastikan bahwa token lama tidak digunakan untuk mendapatkan akses ke layanan Anda.

Saat pengguna melakukan upgrade atau downgrade, status SUBSCRIPTION_PURCHASED dikirimkan ke server backend Anda yang aman. Untuk menangani SUBSCRIPTION_PURCHASED, lihat Menangani SUBSCRIPTION_PURCHASED.

Menyiapkan mode penghitungan prorata

Saat mengupgrade atau mendowngrade langganan, Anda dapat menetapkan replaceSkusProrationMode di class BillingFlowParams untuk memberikan detail tentang penghitungan prorata yang akan diterapkan saat langganan diubah.

Kotlin

val flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .setOldSku(oldSku)
        .setReplaceSkusProrationMode(replaceSkusProrationMode)
        .build()
val responseCode = billingClient.launchBillingFlow(activity, flowParams)

Java

BillingFlowParams flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .setOldSku(oldSku)
        .setReplaceSkusProrationMode(replaceSkusProrationMode)
        .build()
int responseCode = billingClient.launchBillingFlow(activity, flowParams);

Tabel berikut mencantumkan semua mode penghitungan prorata.

IMMEDIATE_WITH_TIME_PRORATION Penggantian akan langsung diterapkan, dan waktu habis masa berlaku yang baru akan dihitung secara prorata dan dikreditkan atau ditagihkan kepada pengguna. Ini merupakan perilaku default saat ini.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE Penggantian akan langsung diterapkan, dan siklus penagihan tetap sama. Harga untuk periode yang tersisa akan ditagih.

Catatan: Opsi ini hanya tersedia untuk upgrade langganan.

IMMEDIATE_WITHOUT_PRORATION Penggantian akan langsung diterapkan, dan harga baru akan ditagih pada waktu pengulangan berikutnya. Siklus penagihan tetap sama.
DEFERRED Penggantian diterapkan pada waktu pengulangan berikutnya.

Untuk memahami cara kerja setiap mode, perhatikan skenario berikut:

Sandra memiliki langganan konten online dari aplikasi Country Gardener. Saat ini, ia memiliki langganan bulanan di versi konten Tingkat 1, yang kontennya hanya berisi teks. Biaya langganan ini adalah $2/bulan, dan akan diperpanjang setiap bulan pada tanggal satu.

Pada tanggal 15 April, Sandra memilih untuk mengupgrade langganan ke Tingkat 2, yang berisi pembaruan video, yang biayanya $3/bulan.

Saat mengupgrade langganan, developer memilih mode penghitungan prorata. Daftar berikut mengidentifikasi pengaruh mode penghitungan terhadap langganan Sandra.

  • IMMEDIATE_WITH_TIME_PRORATION - Dengan menggunakan mode ini, langganan Tingkat 1 Sandra langsung diakhiri. Karena ia membayar untuk sebulan penuh (1-30 April), tetapi hanya memakai separuhnya, separuh dari nilai langganan sebulan penuh ($1) akan diterapkan pada langganan barunya. Namun, karena langganan baru dikenai biaya $3/bulan, saldo kredit $1 hanya cukup untuk membayar langganan untuk sepuluh hari. Dengan demikian, kredit Sandra hanya bisa digunakan untuk membayar langganannya dari tanggal 15 sampai 25 April. Pada tanggal 26 April, ia dikenai biaya $3 untuk langganan barunya, dan $3 lagi pada tanggal 26 setiap bulan berikutnya.
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE - Dengan menggunakan mode ini, langganan Tingkat 1 Sandra langsung diakhiri. Karena ia membayar untuk sebulan penuh (1-30 April), tetapi hanya memakai separuhnya, separuh dari nilai langganan sebulan penuh ($1) akan diterapkan pada langganan barunya. Namun, karena langganan baru dikenai biaya $3/bulan, 15 hari sisanya dikenai biaya $1,50. Sehingga ia dikenai selisih biaya $0,50 untuk langganan barunya, dan $3 lagi pada tanggal satu setiap bulan berikutnya.
  • IMMEDIATE_WITHOUT_PRORATION - Dengan menggunakan mode ini, langganan Tingkat 1 Sandra langsung diupgrade ke Tingkat 2, tanpa biaya tambahan, dan pada tanggal 1 Mei ia dikenai biaya $3 untuk tingkat langganan barunya, dan $3 lagi pada tanggal satu setiap bulan berikutnya.
  • DEFERRED - Dengan menggunakan mode ini, langganan Tingkat 1 Sandra berlanjut hingga habis masa berlakunya, yaitu pada tanggal 30 April. Pada tanggal 1 Mei, langganan Tingkat 2 mulai diterapkan, dan Sandra dikenakan $3 untuk tingkat langganan barunya.

Menjeda langganan

Anda dapat mencegah churn sukarela dengan memungkinkan pengguna untuk menjeda langganan mereka. Saat Anda mengaktifkan fitur jeda, pengguna dapat memilih untuk menjeda langganan mereka untuk jangka waktu antara satu minggu dan tiga bulan, bergantung pada periode pengulangannya. Setelah diaktifkan, opsi jeda akan muncul di pusat langganan dan di alur pembatalan. Perhatikan bahwa batas jeda satu minggu dan tiga bulan dapat berubah setiap saat. Perhatikan juga bahwa langganan tahunan tidak dapat dijeda.

Penting: Untuk mengaktifkan jeda, Anda juga harus mengaktifkan penangguhan akun.

Agar pengguna dapat menjeda langganan mereka, lakukan langkah-langkah berikut:

  1. Login ke Konsol Google Play.
  2. Pilih aplikasi Anda, lalu buka Keberadaan toko > Produk dalam aplikasi > Langganan.
  3. Luaskan bagian Setelan langganan.
  4. Centang Aktifkan Jeda.

Jeda langganan hanya berlaku setelah periode penagihan saat ini berakhir. Selama periode dijeda, langganan tidak dapat diakses oleh pengguna. 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 8:

Diagram transisi dari status dijeda ke status penangguhan akun.
Gambar 8. Pengguna menjeda langganannya, lalu memasuki penangguhan akun.

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

Diagram transisi dari status dijeda ke status dilanjutkan.
Gambar 9. Pengguna menjeda, lalu melanjutkan langganannya.

Ketika langganan dijeda, sebaiknya Anda memberi tahu pengguna saat mereka menggunakan aplikasi bahwa langganan tidak dapat diakses karena mereka telah menjedanya. Anda juga perlu menyediakan cara agar pengguna dapat melanjutkan langganan secara manual dengan menggunakan deep link ke Google Play.

Anda dapat mendeteksi kapan langganan dijeda dan dilanjutkan melalui salah satu metode berikut:

  • Menggunakan Google Play Developer API, cari kolom expiryTimeMillis dan autoResumeTimeMillis dalam respons Purchases.subscriptions :

    • Jika status langganan pengguna adalah jeda tertunda, maka expiryTimeMillis dan autoResumeTimeMillis berisi tanggal mendatang.
    • Jika status langganan pengguna adalah saat ini dijeda, maka autoResumeTimeMillis berisi tanggal mendatang, dan expiryTimeMillis berisi tanggal yang telah lalu .
    • Jika pengguna melanjutkan langganannya, maka respons ini berisi data langganan aktif.
    • Jika pengguna memasuki penangguhan akun, maka respons ini berisi data penangguhan akun.
  • Menggunakan notifikasi developer real-time (RTDN). Untuk memastikan bahwa Anda mendapatkan informasi jeda langganan terbaru, Anda harus memanggil Google Play Developer API sebagai respons terhadap semua jenis notifikasi RTDN, termasuk jenis yang tidak dikenal. Jenis notifikasi yang relevan dengan jeda langganan adalah sebagai berikut:

    • SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED: Pengguna memilih untuk menjeda atau melanjutkan langganan sebelum jeda diberlakukan.
    • SUBSCRIPTION_PAUSED: Langganan saat ini dijeda.
    • SUBSCRIPTION_RENEWED: Langganan berhasil dilanjutkan.
    • SUBSCRIPTION_ON_HOLD: Upaya untuk melanjutkan langganan tidak berhasil, dan langganan saat ini dalam penangguhan akun.
  • Pada perangkat Android, gunakan Library Layanan Penagihan Google Play untuk memanggil queryPurchases() setiap kali aplikasi dimulai. Gunakan PurchasesUpdatedListener untuk menerima pembaruan selama aplikasi berjalan. Daftar objek Purchase di onPurchasesUpdated() tidak berisi langganan yang dijeda.

Mengizinkan langganan untuk berlangganan kembali

Pengguna dapat berlangganan kembali ke langganan yang dibatalkan meski langganan belum habis masa berlakunya. Anda dapat mengizinkan pengguna untuk berlangganan kembali dalam aplikasi dengan menerapkan alur pembelian produk dalam aplikasi yang sama dengan langganan yang dibatalkan dengan menggunakan ID produk yang sama.

Berlangganan kembali akan menggantikan langganan aktif dan mempertahankan tanggal habis masa berlaku yang sama dengan langganan yang digantikan. Misalnya, Anita memiliki langganan Aplikasi Musik Contoh. Langganannya saat ini akan habis masa berlakunya pada tanggal 1 Agustus. Pada tanggal 10 Juli, dia berlangganan kembali ke langganan 1 bulanan dengan harga yang sama. Langganan baru akan dihitung secara prorata dengan sisa kredit dari langganan sebelumnya. Langganan baru kemudian segera aktif dan diperpanjang pada 1 Agustus.

Anda harus menampilkan UI yang sesuai untuk langganan berlangganan kembali:

  • Jika pengguna tidak memiliki langganan aktif, aplikasi akan memiliki tombol "beli".
  • Jika pengguna memiliki langganan yang dibatalkan (SUBSCRIPTION_CANCELLED), mungkin memiliki tombol “berlangganan kembali”. Untuk informasi lebih lanjut, lihat Menangani SUBSCRIPTION_CANCELLED.

Saat Anda menerima token pembelian, ikuti proses verifikasi yang sama dengan yang digunakan untuk token pembelian baru. Untuk informasi lebih lanjut, lihat Memverifikasi pembelian. Google Play Developer API akan menampilkan linkedPurchaseToken di resource langganan. Pastikan untuk tidak memvalidasi token yang disediakan di linkedPurchaseToken untuk memastikan bahwa token lama tidak digunakan untuk mendapatkan akses ke layanan Anda.

Menawarkan kode promosi untuk langganan

Promosi, atau kode promosi, memungkinkan Anda memberikan produk sekali beli atau uji coba langganan secara gratis kepada sejumlah kecil pengguna. Untuk menerapkan kode promosi untuk uji coba langganan, lihat Menerapkan promosi.

Mengembalikan dana biaya berlangganan

Google Play tidak menyediakan jendela pengembalian dana untuk langganan. Sebagai gantinya, pengguna harus meminta pengembalian dana langsung dari Anda. Pengguna dapat meminta pengembalian dana menggunakan halaman Pesanan Saya di Play Store, atau dengan menghubungi Anda secara langsung.

Jika Anda menerima permintaan untuk pengembalian dana, Anda dapat menggunakan Google Play Developer API atau Merchant Center untuk:

  1. Membatalkan langganan (Purchases.subscription: cancel).
  2. Memverifikasi bahwa langganan telah dibatalkan (menampilkan kode respons HTTP 200) (Purchases.subscription: cancel).
  3. Mengembalikan dana pengguna tanpa membatalkan langganan (Purchases.subscription: refund).

Jika Anda ingin mengembalikan dana selain pembayaran yang terakhir, Anda dapat memproses pengembalian dana lainnya melalui Merchant Center.

Jika langganan dibatalkan, status SUBSCRIPTION_CANCELLED dikirim ke server backend aman Anda. Untuk menangani SUBSCRIPTION_CANCELLED, lihat Menangani SUBSCRIPTION_CANCELLED.

Mencabut langganan

Dengan Google Play Developer API, Anda dapat mencabut langganan menggunakan Purchases.subscriptions:revoke. Mencabut langganan akan dengan seketika menghapus akses ke langganan dan biasanya dilakukan ketika Anda atau Google mencurigai adanya penipuan.

Membatalkan langganan

Pengguna juga dapat membatalkan langganan melalui aplikasi Play Store. Dengan Google Play Developer API, Anda juga dapat membatalkan langganan menggunakan Purchases.subscriptions:cancel.

Catatan: API ini biasanya digunakan saat pengguna meminta pengembalian dana dari halaman Pesanan Saya. Untuk informasi lebih lanjut, lihat Mengembalikan dana biaya berlangganan

Pengguna mempertahankan akses ke konten hingga akhir siklus penagihan saat ini. Saat siklus penagihan berakhir, akses akan dicabut.

Penting: Anda tidak boleh menghapus langganan dari Google Play saat pengguna masih berhak mengakses konten tersebut. Menghapus konten yang dibayar pengguna dapat dikenai hukuman. Untuk informasi lebih lanjut, lihat bagian Pembatalan di Membuat langganan.

Memulihkan langganan

Catatan: Untuk memastikan pengalaman pengguna yang konsisten di semua aplikasi, mulai tanggal 15 April 2019, Google mengaktifkan fitur pemulihan secara default untuk semua developer yang memiliki langganan. Kami sangat merekomendasikan agar Anda menguji fungsionalitas pemulihan sebelum tanggal ini untuk memastikan bahwa Anda dapat menangani pemulihan dengan baik. Untuk mempermudah proses transisi ini, Google telah mengaktifkan pemulihan untuk semua akun uji lisensi. Untuk informasi lebih lanjut tentang pengujian langganan, lihat Menguji fitur khusus langganan.

Jika Anda perlu mengubah kode dan tidak dapat menyelesaikannya sebelum tanggal 15 April 2019, Anda boleh memilih tidak ikut di Konsol Google Play dengan membuka Keberadaan toko > Produk dalam aplikasi > Setelan langganan dan menghapus centang Izinkan pengguna untuk memulihkan langganan di Google Play. Perhatikan juga bahwa Anda boleh memilih tidak ikut setelah perubahan diterapkan pada tanggal 15 April 2019.

Langganan yang dibatalkan tetap terlihat di aplikasi Play Store sampai tanggal habis masa berlakunya. Pengguna dapat memulihkan langganan yang dibatalkan sebelum habis masa berlakunya dengan mengklik RESTORE pada bagian Langganan di aplikasi Play Store, seperti ditampilkan di gambar 10:

Gambar 10. Bagian Akun > Langganan di aplikasi Play Store

Ada dua cara untuk mendeteksi kapan langganan dipulihkan:

  1. Aplikasi Anda akan menerima notifikasi SUBSCRIPTION_RESTARTED. Lihat detail selengkapnya di sini: Notifikasi Developer Real-time.
  2. Anda dapat memanggil metode getPurchases()setiap kali aplikasi dibuka. Perlu diperhatikan bahwa setelah langganan dipulihkan, purchaseToken akan tetap sama seperti sebelum langganan dibatalkan.

Agar pengguna dapat memulihkan langganan yang dibatalkan:

  1. Login ke Konsol Google Play.
  2. Pilih aplikasi Anda, lalu buka Keberadaan toko > Produk dalam aplikasi.
  3. Pilih tab Langganan, lalu luaskan bagian Setelan langganan.
  4. Centang kotak Izinkan pengguna untuk memulihkan langganan di Google Play, seperti yang ditunjukkan pada Gambar 5, lalu klik Simpan.
    Gambar 11. Kotak centang Aktifkan pemulihan langganan di Konsol Google Play

Menangguhkan penagihan

Dengane Google Play Developer API, Anda dapat memajukan tanggal penagihan berikutnya untuk pelanggan menggunakan Purchases.subscriptions:defer. Pengguna masih tetap berlangganan konten, dan memiliki akses penuh, tetapi tidak dikenai biaya selama periode penangguhan. Tanggal perpanjangan langganan akan diperbarui untuk merefleksikan tanggal yang baru. Tagihan yang ditangguhkan memungkinkan Anda untuk:

  • Memberikan akses gratis kepada pengguna sebagai bagian dari paket atau penawaran spesial, misalnya memberikan akses gratis ke konten web kepada pengguna yang berlangganan majalah cetak.
  • Memberikan akses gratis kepada pelanggan sebagai bentuk kepedulian.

Tagihan dapat ditangguhkan selama minimal satu hari dan maksimal satu tahun per panggilan API. Anda dapat memanggil API lagi sebelum tanggal penagihan baru tiba untuk menunda penagihan lagi.

Misalnya, Dessy memiliki langganan bulanan konten online untuk aplikasi Fishing Quarterly. Ia biasanya ditagih £1,25 pada tanggal satu setiap bulan. Pada bulan Maret, ia mengikuti survei online untuk penerbit aplikasi. Penerbit memberinya bonus enam minggu gratis dengan menangguhkan pembayaran berikutnya hingga 15 Mei (enam minggu setelah, tanggal penagihan terjadwal sebelumnya, 1 April). Dessy tidak ditagih untuk bulan April atau awal Mei, dan masih dapat mengakses konten. Pada tanggal 15 Mei, ia ditagih dengan biaya langganan normal £ 1,25 untuk bulan tersebut. Tanggal perpanjangan langganan berikutnya dimulai tanggal 15 Juni.

Anda perlu memberi tahu pengguna (menggunakan email atau dalam aplikasi) bahwa tanggal penagihan mereka telah ditangguhkan (diubah).

Menarik kembali pelanggan

Jika pelanggan setia meninggalkan layanan setelah sekian lama, Anda mungkin ingin menawarkan ID produk yang mewakili harga khusus untuk langganan Anda, yang disebut juga winback SKU. Anda dapat memberikan penawaran di aplikasi, atau memberi tahu pengguna tentang penawaran tersebut melalui email. Untuk mulai menarik kembali pelanggan, luncurkan alur pembelian di aplikasi Android Anda menggunakan Library Layanan Penagihan Google Play. Ini adalah proses yang sama dengan langganan baru, bedanya Anda dapat menentukan SKU mana yang tersedia untuk pengguna.

Berita dan referensi terbaru

Langkah berikutnya

Setelah Anda menambahkan fitur khusus langganan, lanjutkan ke Praktik Terbaik.