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.
Integrasi langganan cicilan
Langganan cicilan adalah jenis langganan yang memungkinkan pengguna membayar langganan dengan beberapa kali cicilan selama jangka waktu tertentu, bukan membayar seluruh biaya langganan di awal.
Pertimbangan tambahan untuk langganan cicilan:
- Ketersediaan negara: Fitur langganan cicilan hanya tersedia di Brasil, Prancis, Italia, dan Spanyol (periksa ketersediaan terbaru di Konsol).
- Menetapkan harga: Saat menetapkan harga untuk langganan cicilan di Konsol, harga menunjukkan jumlah pembayaran bulanan. Digabungkan dengan periode komitmen yang ditetapkan, akan menghasilkan jumlah total untuk langganan di layar pembelian.
- Periode komitmen: Total durasi komitmen langganan awal, yang memerlukan pembayaran bulanan. Misalnya, jika paket dasar memiliki periode komitmen 15 bulan, pengguna akan melakukan 15 pembayaran bulanan selama periode ini.
- Perpanjangan: Dalam konteks langganan cicilan, "perpanjangan" menandakan akhirnya periode komitmen, baik periode komitmen awal maupun periode komitmen berikutnya. Setelah pendaftaran awal, perpanjangan pertama akan dilakukan setelah seluruh periode komitmen awal selesai. Perpanjangan berikutnya terjadi setelah setiap periode komitmen berikutnya terpenuhi. Jenis perpanjangan untuk langganan cicilan dapat berupa "diperpanjang otomatis setiap bulan" atau "diperpanjang otomatis untuk durasi yang sama". Untuk "diperpanjang otomatis setiap bulan", tidak ada komitmen berikutnya dan paket berperilaku seperti langganan bulanan dengan setiap tagihan langganan bulanan merupakan perpanjangan.
- Periode penagihan: Dalam konteks langganan cicilan, hal ini mengacu pada interval berulang saat setiap pembayaran dilakukan, seperti yang ditentukan dalam paket dasar.
- Perilaku perubahan paket vs. perubahan harga: Untuk perubahan dan pembatalan harga, komitmennya pasti. Artinya, jika pengguna ingin membatalkan atau developer ingin mengubah harga, perubahan tersebut akan berlaku di akhir periode komitmen. Untuk perubahan paket, komitmennya tidak pasti. Artinya, perubahan paket tidak perlu menunggu hingga akhir periode komitmen. Perubahan tersebut akan langsung diterapkan atau pada tanggal pembayaran berikutnya berdasarkan mode penggantian yang ditetapkan.
- Perubahan paket langganan yang sama: Perubahan paket dari paket dasar cicilan menjadi paket dasar tanpa cicilan untuk produk langganan yang sama tidak diizinkan.
Notifikasi developer real time (RTDN): RTDN
SUBSCRIPTION_CANCELLATION_SCHEDULED
dikirim langsung setelah pembatalan yang dimulai oleh pengguna, saat pembayaran tersisa selama periode komitmen. Pembatalan ini tertunda dan hanya akan berlaku di akhir periode komitmen. Kemudian, jika tidak dipulihkan oleh pengguna, RTDNSUBSCRIPTION_CANCELED
danSUBSCRIPTION_EXPIRED
akan dikirim pada akhir periode komitmen.Pembayaran / Realisasi pendapatan: Pembayaran developer akan terjadi saat pengguna melakukan pembayaran bulanan, dengan tunduk pada persyaratan yang sama seperti semua langganan lainnya. Developer tidak dibayar di muka saat pengguna mendaftar untuk langganan cicilan.
Tagihan pembayaran yang terlewat: Jika pengguna gagal melakukan pembayaran langganan cicilan, baik Google maupun Developer tidak akan berupaya menagih pembayaran yang terlewat atau terutang tersebut dari pengguna, kecuali bahwa Google dapat secara berkala mencoba lagi pembayaran selama Masa Tenggang atau Periode Penangguhan Akun yang berlaku sesuai dengan praktik percobaan ulang pembayaran normalnya. Google tidak akan bertanggung jawab kepada Developer atas sisa pembayaran cicilan yang belum dibayar.
Ketersediaan Play Billing Library: Kolom
installmentDetails
hanya tersedia untuk PBL 7 atau yang lebih baru. Untuk PBL 5 dan yang lebih baru, langganan cicilan ditampilkan menggunakanqueryProductDetails()
, tetapi langganan tidak akan menyertakan informasi cicilan yang mendetail seperti jumlah komitmen pembayaran paket.
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.
Menautkan ke pusat langganan
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.](https://developer.android.com/static/images/google/play/billing/sub_center_general.png?authuser=19&hl=id)
![Ketuk langganan untuk melihat detail lainnya.](https://developer.android.com/static/images/google/play/billing/sub_management_mock_general.png?authuser=19&hl=id)
Deep link ini dapat berguna untuk membantu pengguna memulihkan langganan yang telah dibatalkan dari pusat langganan Play Store.
Menautkan ke halaman pengelolaan langganan tertentu (direkomendasikan)
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.](https://developer.android.com/static/images/google/play/billing/plan_change_inapp.png?authuser=19&hl=id)
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, contoh penggunaan, serta jumlah pembayaran yang dianggap berbayar.
Mode penggantian |
Deskripsi |
Contoh penggunaan |
Pembayaran abonemen dicatat sebagai telah dibayar (Untuk penggantian langganan cicilan) |
|
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. |
0 |
|
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. |
1 |
|
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. |
1 (Catatan: 0 jika langganan baru memiliki uji coba gratis.) |
|
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. |
0 |
|
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. Catatan: Untuk langganan cicilan, perubahan paket terjadi pada awal tanggal pembayaran berikutnya. |
Mendowngrade ke tingkatan yang lebih murah. |
1 |
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 memulai pengalihan langganan yang sama ke
paket prabayar dari paket prabayar, paket perpanjangan otomatis, atau paket cicilan, satu-satunya
mode penggantian yang diizinkan adalah
CHARGE_FULL_PRICE
. Jika Anda menentukan mode penggantian 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
danWITHOUT_PRORATION
. Jika Anda menentukan mode penghitungan prorata lainnya, pembelian akan gagal, dan error akan ditampilkan kepada pengguna. - Beralih paket dalam produk langganan yang sama dari paket dasar cicilan ke paket dasar tanpa cicilan tidak diizinkan.
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) |
Hak untuk paket yang lama berlanjut hingga tanggal perpanjangan berikutnya. Untuk memastikan bahwa aplikasi memberikan hak yang tepat, Token pembelian yang baru tidak ditampilkan, sehingga tidak dapat diproses pada saat ini. |
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:
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) |
Token pembelian yang baru kini ditampilkan, sehingga token tersebut harus diproses. |
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.
|
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:
|
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](https://developer.android.com/static/images/google/play/billing/resubscribe.jpg?authuser=19&hl=id)
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](https://developer.android.com/static/images/google/play/billing/resubscribe-remove.jpg?authuser=19&hl=id)
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](https://developer.android.com/static/images/google/play/billing/subscriptions-in-app-messaging-snackbar.png?authuser=19&hl=id)
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. } } });
Menangani transaksi langganan yang tertunda
Transaksi yang tertunda dapat terjadi dalam pembelian awal, penambahan saldo, upgrade, atau
downgrade. Pembelian langganan dimulai dengan
status SUBSCRIPTION_STATE_PENDING
sebelum beralih ke
SUBSCRIPTION_STATE_ACTIVE
. Jika transaksi telah berakhir atau dibatalkan oleh
pengguna, transaksi akan masuk ke SUBSCRIPTION_STATE_PENDING_PURCHASE_EXPIRED
. Anda hanya boleh memperbarui hak pengguna setelah transaksi selesai.
Perubahan status langganan untuk pembelian awal dengan transaksi yang tertunda
mudah. Aplikasi Anda menerima Purchase
dengan status PENDING
saat pengguna memulai transaksi yang tertunda. Setelah transaksi selesai, aplikasi
Anda akan menerima kembali Purchase
dengan status yang diperbarui menjadi PURCHASED
. Pesan
SubscriptionNotification
dengan jenis SUBSCRIPTION_PURCHASED
dikirim
ke klien RTDN Anda. Ikuti proses normal untuk memverifikasi pembelian, beri
pengguna akses ke konten, dan konfirmasi pembelian. Jika transaksi telah berakhir atau dibatalkan, pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_PENDING_PURCHASE_CANCELED
akan dikirim ke klien RTDN Anda. Dalam kasus
tersebut, pengguna seharusnya tidak mendapatkan akses ke konten.
Isi ulang, upgrade, atau downgrade dengan transaksi yang tertunda melibatkan perubahan status
untuk langganan lama dan baru. Saat pengguna memulai transaksi
penambahan, upgrade, atau downgrade yang tertunda, aplikasi Anda akan menerima Purchase
untuk
langganan lama dengan objek PendingPurchaseUpdate
. Untuk saat ini, pengguna masih memiliki langganan lama dan belum mendapatkan
langganan baru. Memanggil getProducts()
dan getPurchaseToken()
pada
objek PendingPurchaseUpdate
akan menampilkan ID produk dan token pembelian
langganan baru. Setelah transaksi selesai, aplikasi Anda akan menerima
Purchase
dengan token pembelian level teratas yang ditetapkan untuk langganan baru dan
status yang ditetapkan ke PURCHASED
. Pesan SubscriptionNotification
dengan jenis
SUBSCRIPTION_PURCHASED
dikirim ke klien RTDN Anda. Untuk saat ini, Anda
harus mengganti token pembelian yang lama dengan token pembelian baru dan memperbarui
akses pengguna ke konten. Jika transaksi berakhir atau dibatalkan, pesan SubscriptionNotification
dengan jenis
SUBSCRIPTION_PENDING_PURCHASE_CANCELED
akan dikirim ke klien RTDN Anda. Dalam kasus
tersebut, pengguna masih memiliki akses ke konten langganan lama.