Tentang langganan

Topik ini menjelaskan cara menangani peristiwa siklus proses langganan, seperti perpanjangan dan berakhirnya masa berlaku. Topik ini juga menjelaskan fitur langganan lainnya, seperti menawarkan promosi dan memungkinkan pengguna mengelola langganan sendiri.

Jika Anda belum mengonfigurasi produk langganan untuk aplikasi, lihat Membuat dan mengonfigurasi produk.

Ringkasan langganan

Langganan memberikan serangkaian manfaat yang dapat diakses pengguna selama jangka waktu tertentu. Misalnya, langganan dapat memberikan hak kepada pengguna untuk mengakses layanan streaming musik.

Anda dapat memiliki beberapa langganan dalam satu aplikasi, baik untuk memberikan serangkaian manfaat yang berbeda, maupun tingkat yang berbeda dari serangkaian manfaat tunggal (misalnya, tingkat "Silver" dan "Gold").

Melalui paket dasar dan penawaran, Anda dapat membuat beberapa konfigurasi untuk produk langganan yang sama. Misalnya, Anda dapat membuat penawaran perkenalan untuk pengguna yang belum pernah berlangganan ke aplikasi Anda. Demikian pula, Anda dapat membuat penawaran upgrade untuk pengguna yang sudah berlangganan.

Untuk ringkasan mendetail tentang produk langganan, paket dasar, dan penawaran, lihat dokumentasi di Pusat Bantuan Konsol Play.

Integrasi paket prabayar

Paket prabayar tidak diperpanjang secara otomatis setelah masa berlakunya habis. Untuk memperpanjang hak langganan tanpa hambatan, pengguna harus menambah saldo paket prabayar untuk langganan yang sama.

Untuk menambah saldo, luncurkan alur penagihan seperti yang Anda lakukan dengan pembelian asli. Anda tidak perlu menunjukkan bahwa pembelian merupakan penambahan saldo.

Penambahan saldo paket prabayar selalu menggunakan mode penggantian CHARGE_FULL_PRICE, dan Anda tidak perlu menetapkan mode ini secara eksplisit. Pengguna akan langsung ditagih untuk periode penagihan penuh, dan hak mereka diperpanjang menurut durasi yang telah ditentukan dalam penambahan saldo.

Setelah menambah saldo, kolom berikut di objek hasil Purchase diupdate untuk menunjukkan pembelian penambahan saldo terbaru:

  • Id pesanan
  • Waktu pembelian
  • Tanda Tangan
  • Token pembelian
  • Dikonfirmasi

Kolom Purchase berikut selalu berisi data yang sama dengan yang ada dalam pembelian asli:

  • Nama paket
  • Status pembelian
  • Produk
  • Perpanjangan otomatis

Konfirmasi pembelian prabayar

Serupa dengan perpanjangan langganan secara otomatis, Anda harus mengonfirmasi paket prabayar setelah pembelian. Pembelian awal maupun penambahan saldo apa pun harus dikonfirmasi. Untuk mengetahui informasi selengkapnya, lihat Memproses pembelian.

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 paket prabayar tiga hari.

Menggunakan deep link untuk memungkinkan pengguna mengelola langganan

Aplikasi Anda harus menyertakan link pada layar setelan atau preferensi, yang memungkinkan pengguna untuk mengelola langganan mereka, dan juga dapat Anda gabungkan ke dalam tampilan dan nuansa alami aplikasi Anda.

Anda dapat menyertakan deep link dari aplikasi Anda ke pusat langganan Google Play untuk langganan yang masih berlaku, yang dapat ditentukan menggunakan kolom subscriptionState pada resource langganan. Berdasarkan hal ini, ada beberapa cara untuk melakukan deep link ke pusat langganan Play Store.

Gunakan URL berikut ini untuk mengarahkan pengguna ke halaman yang menampilkan semua langganan mereka, seperti yang ditunjukkan pada gambar 1 dan 2:

https://play.google.com/store/account/subscriptions
Layar langganan Play Store menampilkan status untuk semua langganan pengguna yang ditagih oleh Google Play.
Gambar 1. Layar langganan Play Store menampilkan status untuk semua langganan pengguna yang ditagih oleh Google Play.


Ketuk langganan untuk melihat detail lainnya.
Gambar 2. Ketuk langganan untuk melihat detail lainnya.

Deep link ini dapat berguna untuk membantu pengguna memulihkan langganan yang telah dibatalkan dari pusat langganan Play Store.

Untuk menautkan langsung ke halaman pengelolaan langganan yang masih berlaku, tunjukkan nama paket dan productId yang terkait dengan langganan yang telah dibeli. Untuk menentukan productId langganan secara terprogram, buat kueri backend aplikasi Anda, atau panggil BillingClient.queryPurchasesAsync() untuk mendapatkan daftar langganan yang terkait dengan pengguna tertentu. Setiap langganan berisi productId yang sesuai sebagai bagian dari informasi status langganan. Setiap objek SubscriptionPurchaseLineItem yang terkait dengan pembelian langganan berisi nilai productId yang terkait dengan langganan yang telah dibeli oleh pengguna di item baris tersebut.

Gunakan URL berikut untuk mengarahkan pengguna ke layar pengelolaan tertentu, dengan mengganti "your-sub-product-id" dan "your-app-package" dengan productId dan nama paket aplikasi:

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

Kemudian, pengguna dapat mengelola metode pembayaran dan mengakses berbagai fitur, termasuk pembatalan, berlangganan lagi, dan penjedaan.

Mengizinkan pengguna mengupgrade, mendowngrade, atau mengubah langganan

Anda dapat memberi pelanggan lama berbagai macam opsi untuk mengubah paket langganan agar mereka dapat memenuhi kebutuhan dengan lebih baik:

  • Jika Anda menjual beberapa tingkat langganan, seperti langganan "dasar" dan "premium", Anda dapat mengizinkan pengguna untuk beralih tingkatan dengan membeli paket dasar atau penawaran langganan yang berbeda.
  • Anda dapat mengizinkan pengguna mengubah periode penagihan saat ini, seperti beralih dari paket bulanan ke tahunan.
  • Anda juga dapat mengizinkan pengguna beralih antar-paket perpanjangan otomatis dan prabayar.

Anda dapat mendorong perubahan ini dengan memberikan penawaran langganan untuk memberikan diskon kepada pengguna yang memenuhi syarat. Misalnya, Anda dapat membuat penawaran yang memberikan diskon 50% pada tahun pertama saat beralih dari paket bulanan ke paket tahunan, dan membatasi penawaran ini untuk pengguna yang berlangganan paket bulanan yang belum pernah membeli penawaran ini. Informasi selengkapnya tentang kriteria kelayakan penawaran tersedia di Pusat Bantuan

Gambar 3 menunjukkan aplikasi contoh dengan tiga paket yang berbeda:

Aplikasi ini memiliki tiga tingkat langganan.
Gambar 3. Aplikasi ini memiliki tiga tingkat langganan.

Aplikasi Anda dapat menampilkan layar yang serupa dengan gambar 3, yaitu memberi pengguna opsi untuk mengubah langganan mereka. Biasanya, pengguna harus mengetahui dengan jelas paket langganan yang saat ini mereka miliki, dan opsi yang mereka miliki untuk mengubahnya.

Saat pengguna memutuskan untuk mengupgrade, mendowngrade, atau mengubah langganan mereka, Anda menentukan mode penggantian yang menentukan cara penerapan nilai prorata dari periode penagihan berbayar saat ini, dan ketika terjadinya perubahan terhadap hak bagi pengguna.

Mode penggantian

Tabel berikut ini mencantumkan mode penggantian yang tersedia, serta contoh penggunaannya.

Mode penggantian

Deskripsi

Contoh penggunaan

WITH_TIME_PRORATION

Langganan ini langsung diupgrade atau didowngrade. Semua sisa waktu disesuaikan berdasarkan perbedaan harga, dan dikreditkan ke langganan yang baru dengan memajukan tanggal penagihan berikutnya. Ini merupakan perilaku default.

Upgrade ke tingkatan yang lebih mahal, tanpa adanya pembayaran tambahan langsung.

CHARGE_PRORATED_PRICE

Langganan ini langsung diupgrade, dan siklus penagihannya tetap sama. Perbedaan harga untuk periode yang tersisa akan ditagihkan kepada pengguna.

Catatan: Opsi ini hanya tersedia untuk upgrade langganan, dengan harga per unit waktu yang dinaikkan.

Upgrade ke tingkatan yang lebih mahal, tanpa mengubah tanggal penagihan.

CHARGE_FULL_PRICE

Langganan ini langsung diupgrade atau didowngrade, dan pengguna akan langsung dikenai biaya penuh untuk hak baru. Nilai yang tersisa dari langganan sebelumnya akan dipindahkan ke hak yang sama, atau diproporsionalkan sesuai waktu saat beralih ke hak yang berbeda.

Catatan: Jika langganan baru memiliki uji coba gratis atau penawaran perkenalan, pengguna akan ditagih sebesar $0 atau harga penawaran perkenalan, mana saja yang berlaku, pada saat upgrade atau downgrade.

Upgrade dari periode penagihan yang lebih singkat ke periode penagihan yang lebih lama.

WITHOUT_PRORATION

Langganan ini langsung diupgrade atau didowngrade, dan harga yang baru akan dikenakan saat langganan diperpanjang. Siklus penagihan tetap sama.

Upgrade ke tingkat langganan yang lebih tinggi, sekaligus mempertahankan periode gratis yang tersisa.

DEFERRED

Langganan diupgrade atau didowngrade hanya saat langganannya diperpanjang, tetapi pembelian yang baru akan segera diberikan dengan tanggal mulai pada masa mendatang untuk hak yang baru, sehingga developer dapat mengizinkan pengguna melakukan perubahan tambahan jika mereka menginginkannya. Misalnya, mereka dapat kembali ke paket awal atau memulai perubahan baru pada paket yang ditangguhkan.

Mendowngrade ke tingkatan yang lebih murah.

Untuk mempelajari lebih lanjut berbagai aplikasi upsell dan menarik kembali pelanggan dari penawaran mengupgrade atau mendowngrade, baca panduan penawaran dan promosi.

Menetapkan mode penggantian untuk pembelian

Anda dapat menggunakan mode penggantian yang berbeda untuk berbagai jenis transisi langganan, berdasarkan preferensi dan logika bisnis Anda. Bagian ini menjelaskan cara menyetel mode penggantian untuk perubahan dalam langganan dan batasan yang berlaku.

Berlangganan lagi, atau beralih paket dalam langganan yang sama

Anda dapat menentukan mode penggantian default di Konsol Google Play. Setelan ini memungkinkan Anda untuk memilih kapan Anda harus menagih pelanggan saat ini jika mereka membeli paket dasar atau penawaran yang berbeda untuk langganan yang sama, atau berlangganan lagi setelah pembatalan. Opsi yang tersedia adalah Tagih secara langsung, yang setara dengan CHARGE_FULL_PRICE, dan Tagih pada tanggal penagihan berikutnya, yang setara dengan WITHOUT_PRORATION. Mode penggantian ini adalah satu-satunya mode penggantian yang relevan saat beralih paket dasar dalam langganan yang sama.

Misalnya, jika Anda menerapkan penawaran agar dapat menarik kembali pelanggan untuk paket yang sama setelah pengguna membatalkan sebelum langganannya berakhir, Anda dapat memproses pembelian yang baru sebagai pembelian reguler tanpa menunjukkan nilai apa pun di SubscriptionUpdateParams. Sistem menggunakan mode penggantian default yang telah Anda konfigurasi dalam langganan, dan secara otomatis menangani transisi paket dari pembelian lama ke pembelian baru.

Beralih paket dari berbagai macam langganan, atau mengganti mode penggantian default

Jika pengguna mengubah produk langganan—membeli langganan yang berbeda—atau jika Anda ingin mengganti mode penggantian default karena alasan apa pun, tentukan tarif penghitungan prorata saat runtime sebagai bagian dari parameter alur pembelian.

Untuk menyediakan SubscriptionUpdateParams sebagai bagian dari konfigurasi alur pembelian runtime Anda dengan benar, perhatikan batasan berikut ini:

  • Saat mengupgrade, mendowngrade, atau melakukan pengalihan langganan yang sama ke paket prabayar dari paket prabayar atau paket perpanjangan otomatis, satu-satunya mode penghitungan prorata yang diizinkan adalah CHARGE_FULL_PRICE. Jika Anda menentukan mode penghitungan prorata lainnya, pembelian akan gagal, dan error akan ditampilkan kepada pengguna.
  • Saat beralih paket dalam langganan yang sama ke paket perpanjangan otomatis dari paket prabayar atau paket perpanjangan otomatis, mode penghitungan prorata yang valid adalah CHARGE_FULL_PRICE dan WITHOUT_PRORATION. Jika Anda menentukan mode penghitungan prorata lainnya, pembelian akan gagal, dan error akan ditampilkan kepada pengguna.

Contoh dan perilaku penggantian

Untuk memahami cara kerja setiap mode penghitungan prorata, perhatikan skenario berikut:

Sandra memiliki langganan konten online dari aplikasi Country Gardener. Dia memiliki langganan bulanan di versi konten Tingkat 1 yang kontennya hanya berisi teks. Biaya langganan ini sebesar $2 per bulan dan diperpanjang pada tanggal 1 setiap bulan.

Pada tanggal 15 April, Sandra memilih untuk mengupgrade langganannya ke versi tahunan Tingkat 2 yang berisi pembaruan video, dan biayanya adalah $36 per tahun.

Saat mengupgrade langganan, developer memilih mode penghitungan prorata. Daftar berikut ini menjelaskan pengaruh dari setiap mode penghitungan prorata terhadap langganan Sandra:

WITH_TIME_PRORATION

Langganan Tingkat 1 milik Sandra akan langsung berakhir. Karena dia sudah membayar untuk sebulan penuh (1-30 April), tetapi diupgrade di pertengahan masa berlaku langganannya maka biaya langganan setengah bulan ($1) akan diterapkan ke langganan yang baru. Namun, karena langganan baru tersebut berbiaya $36 per tahun, saldo kredit $1 hanya mencakup 10 hari (16-25 April); sehingga pada 26 April, dia dikenai biaya $36 untuk langganan yang baru, dan $36 lagi pada 26 April setiap tahun berikutnya.

Anda harus memanggil PurchasesUpdatedListener aplikasi Anda pada saat pembeliannya berhasil, dan dapat mengambil pembelian yang baru sebagai bagian dari panggilan queryPurchasesAsync(). Backend Anda akan segera menerima Notifikasi Developer Real Time SUBSCRIPTION_PURCHASED.

CHARGE_PRORATED_PRICE

Mode ini dapat digunakan karena harga langganan Tingkat 2 per unit waktu ($36/tahun = $3/bulan) itu lebih besar daripada harga langganan Tingkat 1 per unit waktu ($2/bulan). Langganan Tingkat 1 milik Sandra akan langsung berakhir. Karena dia sudah membayar untuk sebulan penuh namun hanya memakai separuhnya, biaya langganan setengah bulan ($1) akan diterapkan ke langganan yang baru. Namun, karena biaya langganan baru tersebut adalah $36/tahun, biaya langganan untuk 15 hari yang tersisa adalah $1,50 sehingga dia dikenai selisih biaya $0,50 untuk langganan barunya. Pada 1 Mei, Sandra dikenakan biaya $36 untuk tingkat langganan barunya, dan $36 lagi pada tanggal 1 Mei setiap tahun berikutnya.

Anda harus memanggil PurchasesUpdatedListener aplikasi Anda pada saat pembelian berhasil dilakukan, dan dapat mengambil pembelian yang baru sebagai bagian dari panggilan queryPurchasesAsync(). Backend Anda akan segera menerima Notifikasi Developer Real Time SUBSCRIPTION_PURCHASED.

WITHOUT_PRORATION

Langganan Tingkat 1 milik Sandra akan langsung diupgrade ke Tingkat 2 tanpa adanya biaya tambahan, serta pada 1 Mei dia dikenai biaya sebesar $36 untuk tingkat langganan barunya, dan $36 lagi pada 1 Mei setiap tahun berikutnya.

Anda harus memanggil PurchasesUpdatedListener aplikasi Anda pada saat pembelian berhasil dilakukan, dan dapat mengambil pembelian yang baru sebagai bagian dari panggilan queryPurchasesAsync(). Backend Anda akan segera menerima Notifikasi Developer Real Time SUBSCRIPTION_PURCHASED.

DEFERRED

Langganan Tingkat 1 milik Sandra berlanjut hingga habis masa berlakunya, yaitu pada 30 April. Pada 1 Mei, langganan Tingkat 2 mulai berlaku, dan Sandra dikenai biaya $36 untuk tingkat langganan barunya.

Anda harus memanggil PurchasesUpdatedListener aplikasi Anda pada saat pembelian berhasil dilakukan, dan dapat mengambil pembelian yang baru sebagai bagian dari panggilan queryPurchasesAsync(). Backend Anda akan segera menerima Notifikasi Developer Real Time SUBSCRIPTION_PURCHASED. Anda harus memproses pembelian dengan cara yang sama seperti saat Anda memproses pembelian baru lainnya pada saat itu. Secara khusus, pastikan Anda mengonfirmasi pembelian yang baru. Perlu diketahui bahwa startTime dari langganan yang baru diisi saat penggantiannya berlaku, yang terjadi ketika langganan lama telah berakhir masa berlakunya. Pada saat itu, Anda akan menerima RTDN SUBSCRIPTION_RENEWED untuk paket langganan yang baru. Baca selengkapnya tentang perilaku ReplacementMode.DEFERRED melalui Menangani penggantian yang ditangguhkan.

CHARGE_FULL_PRICE

Langganan Tingkat 1 milik Sandra akan langsung berakhir. Langganan Tingkat 2 miliknya dimulai hari ini, dan dia dikenai biaya $36. Karena dia sudah membayar untuk sebulan penuh tetapi hanya memakai separuhnya, biaya langganan setengah bulan ($1) akan diterapkan ke langganan yang baru. Karena biaya langganan barunya sebesar $36/tahun, dia akan mendapatkan 1/36 dari setahun yang ditambahkan ke periode langganannya (~10 hari). Oleh karena itu, tagihan Sandra yang berikutnya adalah 1 tahun 10 hari dari hari ini, yakni sebesar $36. Setelah itu, Sandra akan dikenai biaya $36 setiap tahun berikutnya.

Saat memilih mode penghitungan prorata, pastikan untuk meninjau rekomendasi penggantian kami.

Memicu perubahan langganan dalam aplikasi

Aplikasi Anda dapat menawarkan untuk mengupgrade atau mendowngrade kepada pengguna menggunakan langkah yang sama seperti meluncurkan alur pembelian. Namun, saat mengupgrade atau mendowngrade, Anda harus memberikan detail untuk langganan saat ini, langganan berikutnya (setelah upgrade atau downgrade), dan mode penggantian yang digunakan, seperti yang ditunjukkan dalam contoh berikut ini:

Kotlin

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

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

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

Java

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

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

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

Rekomendasi penggantian

Tabel berikut menunjukkan berbagai skenario penghitungan prorata serta rekomendasi kami untuk setiap skenario:

Skenario Mode penggantian yang direkomendasikan Hasil
Melakukan upgrade ke tingkat yang lebih mahal CHARGE_PRORATED_PRICE Pengguna akan langsung menerima akses dengan tetap memiliki periode penagihan yang sama.
Melakukan downgrade ke tingkat yang lebih murah DEFERRED Pengguna sudah membeli tingkatan yang lebih mahal, sehingga mereka tetap memiliki akses hingga tanggal penagihan berikutnya.
Melakukan upgrade saat sedang dalam uji coba gratis dan tetap memiliki akses ke uji coba WITHOUT_PRORATION Pengguna tetap memiliki akses uji coba gratis, tetapi melakukan upgrade ke tingkat yang lebih tinggi selama sisa periode uji coba tersebut.
Melakukan upgrade saat sedang dalam uji coba gratis, tetapi mengakhiri akses ke uji coba gratis CHARGE_PRORATED_PRICE Pengguna akan langsung menerima akses ke tingkat baru, tetapi tidak lagi memiliki akses uji coba gratis.

Menangani pembelian perubahan langganan

Perubahan paket adalah pembelian yang baru untuk semua persyaratan dan tujuan, serta harus diproses dan dikonfirmasi sedemikian rupa setelah alur penagihan berhasil diselesaikan. Selain memproses pembelian baru dengan tepat, Anda harus menghentikan pembelian yang telah diganti.

Perilaku dalam aplikasi tersebut sama seperti pembelian baru apa pun. Aplikasi Anda akan menerima hasil pembelian yang baru di dalam PurchasesUpdatedListener Anda, dan pembelian barunya tersedia di dalam queryPurchasesAsync.

Google Play Developer API menampilkan linkedPurchaseToken dalam resource langganan pada saat pembelian menggantikan resource yang sudah ada. Pastikan untuk membatalkan validasi token yang diberikan dalam linkedPurchaseToken guna memastikan bahwa token lama tidak digunakan untuk mendapatkan akses ke layanan Anda. Lihat Upgrade, downgrade, dan pendaftaran ulang untuk mendapatkan informasi tentang penanganan pembelian upgrade dan downgrade.

Saat Anda menerima token pembelian, ikuti proses verifikasi yang sama seperti saat memverifikasi token pembelian yang baru. Pastikan untuk mengonfirmasi pembelian ini dengan BillingClient.acknowledgePurchase() dari Google Play Billing Library, atau Purchases.subscriptions:acknowledge dari Google Play Developer API.

Menangani penggantian yang ditangguhkan

Dengan Mode penggantian yang ditangguhkan, Anda dapat memungkinkan seorang pengguna untuk menggunakan sisa hak dalam paket lamanya, sebelum memulai paket baru.

Saat Anda menggunakan ReplacementMode.DEFERRED untuk pembelian baru, queryPurchasesAsync() menampilkan token pembelian baru setelah alur pembelian yang tetap terkait dengan produk yang lama hingga penggantian yang ditangguhkan dilakukan pada tanggal perpanjangan berikutnya, setelahnya, produk baru akan ditampilkan.

Sebelumnya, Anda dapat memperoleh pengalaman pengguna ini dengan ProrationMode.DEFERRED yang tidak digunakan lagi, tetapi ProrationMode.DEFERRED tidak digunakan lagi dengan Play Billing Library 6. Lihat tabel berikut ini untuk memahami perbedaan perilaku tersebut:

Waktu

ProrationMode.DEFERRED (tidak digunakan lagi)

ReplacementMode.DEFERRED

Segera setelah alur pembeliannya berhasil (aplikasi)

PurchasesUpdatedListener dipanggil setelah pembelian dengan status upgrade atau downgrade berhasil.

Hak untuk paket yang lama berlanjut hingga tanggal perpanjangan berikutnya. Untuk memastikan bahwa aplikasi memberikan hak yang tepat, queryPurchasesAsync() menampilkan objek Purchase dengan token pembelian asli, serta hak asli hingga penggantiannya terjadi.

Token pembelian yang baru tidak ditampilkan, sehingga tidak dapat diproses pada saat ini.

PurchasesUpdatedListener dipanggil setelah pembelian dengan status upgrade atau downgrade berhasil.

queryPurchasesAsync() langsung mengembalikan pembelian dengan token pembelian yang baru, dan hak asli yang terkait dengannya.

Token pembelian yang baru ditampilkan, sehingga harus diproses pada tahap ini dengan mempertimbangkan kapan penggantiannya akan dilakukan.

Tepat setelah alur pembeliannya berhasil (backend)

SUBSCRIPTION_PURCHASED RTDN tidak dikirim setelah alur pembelian. Backend belum mengetahui pembelian yang baru.

SUBSCRIPTION_PURCHASED RTDN dengan product_id lama dikirim segera setelah alur pembelian untuk token pembelian yang baru.

Memanggil metode purchases.subscriptionsv2.get dengan token pembelian yang baru akan menampilkan pembelian yang memiliki 'startTime' yang menunjukkan waktu pembelian dengan dua item baris:

  • Satu item baris mewakili hak lama dan memiliki 'expiryTime' pada masa mendatang. Hak lama tidak akan diperpanjang dan memiliki DeferredItemReplacement yang berisi produk dari hak baru. Hal ini menunjukkan penggantian hak lama yang tertunda setelah masa berlakunya habis.
  • Satu lagi mewakili hak yang baru dibeli. Kolom ini tidak memiliki nilai yang ditetapkan untuk 'expiryTime'.

SUBSCRIPTION_EXPIRED dikirimkan untuk token pembelian yang lama. Saat memanggil metode purchases.subscriptionsv2.get dengan token pembelian yang lama, metode tersebut akan ditampilkan sebagai sudah tidak berlaku (hak untuk paket yang lama ditransfer ke pembelian baru untuk sisa waktu yang ada).

Saat penggantian - perpanjangan pertama setelah alur pembelian (aplikasi)

queryPurchasesAsync() menampilkan objek Purchase baru dengan hak dan token pembelian yang baru.

Token pembelian yang baru kini ditampilkan, sehingga token tersebut harus diproses.

queryPurchasesAsync() langsung mengembalikan pembelian dengan token pembelian yang baru, dan hak baru yang terkait dengannya.

Pembelian yang baru seharusnya sudah diproses saat alur pembelian berhasil, sehingga aplikasi tidak boleh melakukan tindakan khusus apa pun selain memastikan hak yang tepat diberikan.

Saat penggantian - perpanjangan pertama setelah alur pembelian (backend)

Pembelian yang baru kini dapat diproses dan dikonfirmasi saat SUBSCRIPTION_RENEWED RTDN pertama telah dikirim.

linkedPurchaseToken dalam resource langganan dapat digunakan untuk menentukan pengguna mana di dalam backend langganan Anda yang harus diperbarui haknya dengan yang baru, jika berlaku.

Pembelian yang baru telah diproses dan dikonfirmasi saat SUBSCRIPTION_PURCHASED RTDN dikirim untuk token pembelian yang baru dan dicatat sebagai 'startTime'.

Dengan ReplacementMode.DEFERRED, perpanjangan pertama akan mengikuti perilaku standar perpanjangan lainnya dan Anda tidak perlu menangani logika khusus untuk penggantian saat peristiwa ini terjadi.

Saat memanggil metode purchases.subscriptionsv2.get dengan token pembelian yang baru akan menampilkan pembelian dengan dua item baris:

  • Satu item baris mewakili hak lama, dengan `expiryTime` di masa lalu dan tidak ada nilai yang ditetapkan untuk DeferredItemReplacement.
  • Satu lagi mewakili hak baru, dengan `expiryTime` pada masa mendatang dan tanda auto_renew_enabled diaktifkan.

Mulai sekarang, ReplacementMode.DEFERRED harus digunakan dan bukan ProrationMode.DEFERRED, yang sudah tidak digunakan lagi, karena menampilkan perilaku yang sama terkait perubahan hak, tetapi menawarkan cara untuk mengelola pembelian yang lebih konsisten dengan perilaku untuk pembelian baru lainnya.

Pengelolaan pelanggan

Dengan menggunakan Notifikasi developer real time, Anda dapat mendeteksi secara real time saat pengguna memutuskan untuk melakukan pembatalan. Saat pengguna melakukan pembatalan sebelum masa berlaku langganannya berakhir, Anda dapat mengirimkan notifikasi push atau pesan dalam aplikasi untuk meminta mereka berlangganan lagi.

Setelah pengguna membatalkan langganannya, Anda dapat mencoba menarik kembali mereka, baik di aplikasi maupun melalui Play Store. Tabel berikut ini menjelaskan berbagai skenario langganan beserta tindakan menarik kembali pelanggan dan persyaratan aplikasi terkait.

Sebelum akhir masa berlaku langganan Setelah akhir masa berlaku langganan
Dalam aplikasi Di Play Store Dalam aplikasi Di Play Store
Fitur menarik kembali pelanggan Langganan dalam aplikasi Pulihkan Langganan dalam aplikasi Berlangganan lagi
Pengguna melalui alur pembayaran Ya Tidak Ya Ya
Langganan pengguna tetap terkait dengan SKU yang sama Pengguna dapat mendaftar untuk SKU yang sama maupun berbeda Ya Pengguna dapat mendaftar untuk SKU yang sama maupun berbeda Ya
Membuat token pembelian baru Ya Tidak Ya Ya
Diaktifkan secara default Tidak Ya, semua developer perlu mendukungnya Tidak

Aplikasi tanpa Library Penagihan 2.0 atau yang lebih tinggi: Tidak

Aplikasi dengan Library Penagihan 2.0 atau yang lebih tinggi: Ya. Developer dapat memilih untuk tidak ikut di Konsol.

Saat pengguna ditagih

Jika menggunakan SKU yang sama: akhir periode penagihan saat ini.

Jika menggunakan SKU yang berbeda: bergantung pada mode penghitungan prorata.

Akhir periode penagihan saat ini Segera Segera
Perlu implementasi Sediakan UI pendaftaran ulang di aplikasi Anda

Deteksi perubahan dalam status langganan

Sediakan deep link ke Play Store

Sediakan UI pendaftaran ulang di aplikasi Anda Tangani pembelian di luar aplikasi

Sebelum akhir masa berlaku langganan - dalam aplikasi

Untuk langganan yang telah dibatalkan tetapi masa berlakunya belum habis, Anda dapat mengizinkan pelanggan memulihkan langganan di aplikasi dengan menerapkan alur pembelian produk dalam aplikasi yang sama seperti alur untuk pelanggan baru. Pastikan UI menunjukkan bahwa pengguna sudah memiliki langganan. Misalnya, Anda mungkin ingin menampilkan tanggal habis masa berlaku saat ini dan harga berulang kepada pengguna dengan tombol Aktifkan kembali.

Biasanya, Anda mungkin menawarkan harga dan SKU yang sama dengan langganan saat ini, sebagai berikut:

  • Memulai pembelian langganan baru dengan SKU yang sama.
  • Langganan baru akan menggantikan langganan yang lama dan akan diperpanjang pada tanggal habis masa berlaku yang sama. Langganan lama akan langsung ditandai sebagai sudah tidak berlaku.
  • Misalnya, Ardian memiliki langganan Aplikasi Musik Contoh dan langganan ini akan habis masa berlakunya pada 1 Agustus. Pada 10 Juli, ia berlangganan lagi selama satu bulan dengan harga yang sama setiap bulannya. Langganan baru akan dihitung secara prorata dengan sisa kredit, langsung diaktifkan, dan masih diperpanjang pada 1 Agustus.

Jika Anda ingin menawarkan harga yang berbeda, misalnya uji coba gratis baru atau diskon untuk menarik kembali pelanggan, Anda dapat menawarkan SKU yang berbeda kepada pengguna:

  • Mulai mengupgrade atau mendowngrade dengan SKU yang berbeda menggunakan mode penggantian WITHOUT_PRORATION.
  • Langganan baru akan menggantikan langganan yang lama dan akan diperpanjang pada tanggal habis masa berlaku yang sama. Pengguna dikenai harga SKU baru, termasuk harga perkenalan, pada tanggal habis masa berlaku semula. Jika langganan lama dibuat menggunakan ID akun yang di-obfuscate, ID yang sama tersebut harus diteruskan ke BillingFlowParams untuk upgrade dan downgrade.
  • Misalnya, Ardian memiliki langganan Aplikasi Musik Contoh dan langganan ini akan habis masa berlakunya pada 1 Agustus. Pada 10 Juli, ia berlangganan lagi ke langganan tahunan dengan harga perkenalan. Langganan baru akan segera aktif, dan pengguna akan dikenai harga perkenalan pada 1 Agustus.
  • Jika Anda memutuskan untuk menyertakan uji coba gratis atau harga perkenalan dalam SKU penarikan kembali pelanggan, pastikan pengguna memenuhi syarat dengan menghapus centang pada kotak Izinkan satu uji coba gratis per aplikasi di Konsol Google Play, yang membatasi pengguna agar hanya menerima satu uji coba gratis per aplikasi.

Setelah menerima token pembelian, proses pembelian seperti yang biasa Anda lakukan pada langganan baru. Selain itu, Google Play Developer API akan menampilkan linkedPurchaseToken di resource langganan. Pastikan untuk membatalkan validasi token yang disediakan di linkedPurchaseToken guna memastikan bahwa token yang lama tidak digunakan untuk mendapatkan akses ke layanan Anda.

Sebelum akhir masa berlaku langganan - di Play Store

Saat langganan telah dibatalkan, tetapi masih aktif, pengguna dapat memulihkannya di pusat langganan Google Play dengan mengklik Berlangganan lagi (sebelumnya Pulihkan). Tindakan ini akan mempertahankan token langganan dan pembelian yang sama.

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

Untuk informasi selengkapnya tentang pemulihan langganan, lihat Pemulihan.

Setelah akhir masa berlaku langganan - dalam aplikasi

Anda dapat mengizinkan pelanggan yang sudah habis masa berlakunya untuk berlangganan lagi dalam aplikasi dengan menerapkan alur pembelian produk dalam aplikasi yang sama seperti untuk pelanggan baru. Perhatikan hal berikut:

  • Untuk menawarkan diskon kepada pengguna, Anda dapat menawarkan ID produk dengan harga khusus untuk langganan Anda, yang juga disebut SKU penarikan kembali pelanggan. Anda dapat memberikan penawaran dalam aplikasi, atau memberi tahu pengguna tentang penawaran tersebut di luar aplikasi, seperti di 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 yang tersedia untuk pengguna.
  • Jika Anda memutuskan untuk menyertakan uji coba gratis atau harga perkenalan dalam SKU penarikan kembali pelanggan, pastikan pengguna memenuhi syarat dengan menghapus centang pada kotak Izinkan satu uji coba gratis per aplikasi di Konsol Google Play, yang membatasi pengguna agar hanya menerima satu uji coba gratis per aplikasi.
  • Jika pengguna berlangganan lagi dengan SKU yang sama, mereka tidak lagi memenuhi syarat untuk uji coba gratis atau harga perkenalan. Pastikan UI menunjukkan hal tersebut.

Setelah menerima token pembelian, proses pembelian seperti yang biasa Anda lakukan pada langganan baru. Anda tidak akan menerima linkedPurchaseToken di resource langganan.

Setelah akhir masa berlaku langganan - di Play Store

Jika diaktifkan, pengguna dapat berlangganan kembali ke SKU yang sama hingga satu tahun setelah masa berlaku berakhir dengan mengklik Berlangganan lagi di pusat langganan Google Play. Tindakan ini akan menghasilkan token pembelian dan langganan baru.

bagian langganan di aplikasi Google Play Store yang menampilkan
            langganan yang dibatalkan dan yang habis masa berlakunya dengan tombol
            berlangganan lagi dan hapus
Gambar 9. Bagian Akun > Langganan di aplikasi Google Play Store yang menampilkan langganan yang dibatalkan dan yang habis masa berlakunya dengan tombol Berlangganan lagi dan Hapus.

Berlangganan lagi dianggap sebagai pembelian di luar aplikasi, jadi pastikan untuk mengikuti praktik terbaik dalam menangani pembelian yang dilakukan dari luar aplikasi.

Mempromosikan langganan

Anda dapat membuat kode promosi untuk memberikan uji coba gratis yang diperpanjang ke langganan yang sudah ada kepada pengguna terpilih. Untuk mempelajari lebih lanjut, lihat Kode promo.

Untuk uji coba gratis, Google Play memverifikasi bahwa pengguna memiliki metode pembayaran yang valid sebelum memulai uji coba gratis. Beberapa pengguna mungkin mengira verifikasi ini sebagai penangguhan atau penagihan pada metode pembayaran mereka. Penangguhan atau penagihan ini bersifat sementara dan akan dibatalkan atau dikembalikan dananya.

Setelah periode uji coba berakhir, metode pembayaran pengguna akan ditagih sebesar biaya langganan penuh.

Jika pengguna membatalkan langganan kapan saja selama periode uji coba gratis, langganan akan tetap aktif hingga periode uji coba berakhir dan pengguna tidak dikenai biaya saat periode uji coba gratis berakhir.

Membatalkan, mengembalikan dana, atau mencabut

Anda dapat menggunakan Google Play Developer API untuk membatalkan, mengembalikan dana, atau mencabut langganan. Fungsi ini juga tersedia di Konsol Google Play.

  • Batal: Pengguna dapat membatalkan langganan di Google Play. Anda juga dapat memberikan opsi bagi pengguna untuk membatalkan langganan di aplikasi atau situs Anda. Aplikasi harus menangani pembatalan ini seperti yang dijelaskan dalam Pembatalan.
  • Kembalikan dana: Saat Anda melakukan pengembalian dana, pengguna dapat tetap menggunakan langganan. Pengembalian dana dapat digunakan, misalnya, jika ada kesalahan teknis yang mengakibatkan pengguna tidak dapat mengakses produk Anda, tetapi kesalahan tersebut telah diperbaiki. Untuk mengembalikan dana yang lebih besar dari pembayaran terakhir atau melakukan pengembalian dana sebagian, Anda harus menggunakan Konsol Google Play.
  • Cabut: Jika Anda mencabut langganan, pengguna akan langsung kehilangan akses ke langganan. Tindakan ini dapat digunakan, misalnya, jika terdapat kesalahan teknis yang mengakibatkan pengguna tidak dapat mengakses produk Anda dan pengguna tidak ingin melanjutkan penggunaan produk tersebut. Aplikasi harus menangani pembatalan ini seperti yang dijelaskan di Pencabutan.

Tabel berikut menjelaskan perbedaan antara pembatalan, pengembalian dana, dan pencabutan.

Menghentikan perpanjangan Kembalikan dana Cabut akses
Batal Ya Tidak Tidak
Kembalikan dana Tidak Ya Tidak
Cabut Ya Ya Ya

Menunda penagihan untuk pelanggan

Anda dapat memajukan tanggal penagihan berikutnya untuk pelanggan yang memperpanjang otomatis menggunakan Purchases.subscriptions:defer dari Google Play Developer API. 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.

Penagihan yang ditunda memungkinkan Anda melakukan hal berikut:

  • Memberikan akses gratis kepada pengguna sebagai penawaran spesial, seperti memberikan satu minggu pembelian film secara gratis.
  • Memberikan akses gratis kepada pelanggan sebagai bentuk kepedulian.

Penagihan dapat ditunda selama minimal satu hari dan maksimal satu tahun per panggilan API. Untuk menunda penagihan lebih lama lagi, Anda dapat memanggil ulang API sebelum tanggal penagihan baru tiba.

Misalnya, Dessy memiliki langganan bulanan konten online untuk aplikasi Fishing Quarterly. Ia biasanya ditagih £1,25 pada tanggal 1 setiap bulan. Pada bulan Maret, ia mengikuti survei online untuk penerbit aplikasi. Penerbit memberinya bonus enam minggu gratis dengan menunda pembayaran berikutnya hingga 15 Mei, yaitu enam minggu setelah tanggal penagihan terjadwal sebelumnya pada 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 sebesar £1,25 untuk bulan tersebut. Tanggal perpanjangan langganan berikutnya adalah 15 Juni.

Saat menunda, Anda mungkin ingin memberi tahu pengguna melalui email atau dalam aplikasi untuk memberi tahu bahwa tanggal penagihan mereka telah berubah.

Menangani penolakan pembayaran

Jika ada masalah pembayaran dengan perpanjangan langganan, Google akan mencoba memperpanjang langganan secara berkala selama beberapa waktu sebelum membatalkan. Periode pemulihan ini dapat terdiri dari masa tenggang, yang diikuti dengan masa penangguhan akun. Selama jangka waktu ini, Google akan mengirimkan email dan notifikasi kepada pengguna yang meminta mereka memperbarui metode pembayaran.

Setelah pembayaran ditolak, langganan akan memasuki masa tenggang jika ada konfigurasi. Selama masa tenggang, Anda harus memastikan pengguna masih memiliki akses ke hak langganan.

Setelah masa tenggang berakhir, langganan memasuki periode penangguhan akun. Selama penangguhan akun, Anda harus memastikan pengguna tidak memiliki akses ke hak langganan.

Anda dapat menentukan durasi masa tenggang dan penangguhan akun untuk setiap paket dasar yang diperpanjang otomatis di Konsol Google Play. Menentukan durasi yang kurang dari nilai default dapat mengurangi jumlah langganan yang dipulihkan dari penolakan pembayaran.

Untuk memaksimalkan kemungkinan pemulihan langganan selama penolakan pembayaran, Anda dapat memberi tahu pengguna tentang masalah pembayaran dan meminta mereka untuk memperbaikinya.

Anda dapat melakukannya sendiri, seperti yang dijelaskan di bagian masa tenggang dan penangguhan akun, atau Anda dapat menerapkan in-app messaging API, tempat Google menampilkan pesan kepada pengguna di aplikasi Anda.

In-app messaging

Jika Anda telah mengaktifkan in-app messaging dengan InAppMessageCategoryId.TRANSACTIONAL, Google Play akan menampilkan pesan kepada pengguna selama masa tenggang dan penangguhan akun sekali per hari dan memberi mereka peluang untuk memperbaiki pembayaran tanpa keluar dari aplikasi.

Snackbar yang memberi tahu pengguna untuk memperbaiki pembayarannya
Gambar 20. Snackbar yang memberi tahu pengguna untuk memperbaiki pembayarannya.

Sebaiknya Anda memanggil API ini setiap kali pengguna membuka aplikasi untuk menentukan apakah pesan harus ditampilkan.

Jika pengguna berhasil memulihkan langganannya, Anda akan menerima kode respons SUBSCRIPTION_STATUS_UPDATED beserta token pembelian. Kemudian Anda harus menggunakan token pembelian ini untuk memanggil Google Play Developer API dan memperbarui status langganan di aplikasi Anda.

Mengintegrasikan in-app messaging

Untuk menampilkan in-app messaging kepada pengguna, gunakan BillingClient.showInAppMessages().

Berikut adalah contoh yang memicu alur in-app messaging:

Kotlin

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

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

Java

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

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