Pembelian langganan dapat melalui beberapa status yang berbeda selama siklus prosesnya, bergantung pada banyak faktor termasuk perilaku perpanjangan otomatis, situasi penolakan pembayaran, dan tindakan pengelolaan developer.
Menangani siklus proses langganan yang diperpanjang otomatis
Saat status langganan pengguna berubah, server backend Anda akan menerima
pesan SubscriptionNotification
Untuk memperbarui status di backend Anda, panggil
purchases.subscriptionsv2.get
API dengan token pembelian yang disertakan dalam notifikasi. Endpoint ini memberikan
status langganan terbaru berdasarkan token pembelian dan dianggap
sebagai sumber kebenaran untuk pengelolaan langganan.
Token pembelian valid sejak pendaftaran langganan hingga 60 hari setelah masa berlaku habis. Setelah tanggal ini, token pembelian tidak lagi valid untuk digunakan memanggil Google Play Developer API.
Pembelian langganan baru yang diperpanjang otomatis
Saat pengguna membeli langganan, pesan SubscriptionNotification
dengan
jenis SUBSCRIPTION_PURCHASED
akan dikirim ke klien RTDN Anda. Baik Anda menerima
notifikasi ini atau mendaftarkan pembelian baru dalam aplikasi melalui
PurchasesUpdatedListener
atau mengambil pembelian secara manual di
metode onResume()
aplikasi, Anda harus memproses pembelian baru di backend
yang aman. Untuk melakukannya, ikuti langkah berikut:
- Buat kueri
endpoint
purchases.subscriptionsv2.get
untuk mendapatkan resource langganan yang berisi status langganan terbaru. - Pastikan nilai kolom
subscriptionState
adalahSUBSCRIPTION_STATE_ACTIVE
. - Verifikasi pembelian.
- Beri pengguna akses ke konten. Akun pengguna yang terkait dengan
pembelian dapat diidentifikasi dengan
objek
ExternalAccountIdentifiers
dari resource langganan jika ID ditetapkan pada waktu pembelian menggunakansetObfuscatedAccountId
dansetObfuscatedProfileId
.
Library Layanan Penagihan Play juga menyertakan metode untuk mengonfirmasi langganan,
acknowledgePurchase()
,
dan metode untuk memeriksa status konfirmasi,
isAcknowledged()
.
Namun, sebaiknya Anda menangani pemrosesan pembelian di backend untuk
keamanan yang lebih baik.
Resource langganan untuk pembelian baru terlihat mirip dengan contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
"startTime": "2022-04-22T18:39:58.270Z",
"regionCode": "US",
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"latestOrderId": "GPA.3333-4137-0319-36762",
"acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
],
}
Perpanjangan langganan
Untuk langganan tanpa cicilan yang diperpanjang otomatis, SUBSCRIPTION_RENEWED
notifikasi akan dikirim saat langganan diperpanjang. Untuk cicilan
langganan, notifikasi SUBSCRIPTION_RENEWED
dikirim setiap kali
langganan ditagih pada tanggal penagihannya. Pastikan bahwa pengguna masih
yang berhak menikmati langganan, lalu memperbarui status langganan dengan
expiryTime
disediakan dalam langganan
resource yang ditampilkan dari Google Play
API Developer. Resource langganan terlihat mirip dengan contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
"startTime": "2022-04-22T18:39:58.270Z",
"regionCode": "US",
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"latestOrderId": "GPA.3333-4137-0319-36762",
"acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
]
}
Anda tidak perlu mengonfirmasi perpanjangan langganan.
Masa tenggang
Jika terjadi masalah pembayaran dengan perpanjangan langganan, Google akan memberi tahu pengguna dan secara berkala mencoba memperpanjang langganan selama beberapa waktu sebelum masa berlaku langganan berakhir. Masa pemulihan ini dapat terdiri dari masa tenggang yang diikuti dengan masa penangguhan akun. Selama masa tenggang, pengguna harus masih dapat mengakses hak langganannya.
Metode
queryPurchasesAsync()
akan terus menampilkan pembelian yang berada dalam masa tenggang. Jika hanya mengandalkan
queryPurchasesAsync
untuk memeriksa apakah pengguna berhak
berlangganan, aplikasi harus otomatis menangani masa tenggang, karena
langganan ini ditampilkan sebagai aktif melalui Library Layanan Penagihan Play.
Menyinkronkan status langganan dengan backend memungkinkan Anda lebih mengetahui
pembayaran ditolak dan memberikan lebih banyak konteks saat Anda mencoba mengurangi
terjadi churn. Proses
pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_IN_GRACE_PERIOD
yang akan menerima notifikasi saat pengguna memasuki
masa tenggang. Saat pengguna berada dalam masa tenggang, resource
langganan
berisi autoRenewEnabled = true
. Google Play memperpanjang nilai
expiryTime
secara dinamis hingga masa tenggang berakhir karena hak
harus berlaku hingga pengguna membatalkannya atau masa tenggang berlangsung selama
panjang maksimumnya. Nilai kolom subscriptionState
selama periode ini adalah
SUBSCRIPTION_STATE_IN_GRACE_PERIOD
. Resource langganan terlihat mirip dengan
contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_future,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
],
}
Play memberi tahu pengguna yang berada dalam masa tenggang bahwa pembayaran mereka ditolak dan meminta mereka memperbaiki masalah metode pembayaran di Play Store. Saat pengguna memasuki masa tenggang, sebaiknya Anda juga menyarankan pengguna tersebut untuk memperbaiki metode pembayaran jika kegagalannya tidak disengaja. Cara mudah untuk melakukannya adalah dengan menggunakan In-App Messaging API. Jika Anda memanggil API ini saat pengguna membuka aplikasi, pengguna akan melihat pesan Play di snackbar sementara yang memberi tahu pengguna bahwa pembayaran mereka telah ditolak. Pesan ini juga menyertakan deep link bagi pengguna untuk memperbaiki metode pembayarannya di Google Play.
Segera setelah pengguna memperbaiki metode pembayaran, langganan akan diperpanjang dengan tanggal perpanjangan aslinya, dan Anda dapat menangani perpanjangan seperti yang dijelaskan dalam Perpanjangan.
Jika pengguna tidak memperbaiki metode pembayaran selama masa tenggang, langganan akan memasuki penangguhan akun, dan pengguna akan kehilangan haknya.
Akses dan pemulihan masa tenggang
Gambar 2 menunjukkan linimasa untuk langganan yang memasuki masa tenggang, lalu melakukan pemulihan saat pengguna memperbaiki metode pembayaran. Setelah masa tenggang berakhir, pengguna akan kehilangan manfaat langganan dan memasuki penangguhan akun.
![](https://developer.android.com/static/images/google/play/billing/lifecycle/grace-period.png?authuser=6&hl=id)
Penting untuk mengingat poin-poin berikut:
- Selama masa tenggang, pengguna masih memiliki akses ke manfaat langganan.
- Jika langganan dipulihkan selama masa tenggang, tanggal perpanjangan tidak direset.
- Jika Anda memperpanjang masa tenggang, misalnya, dari 7 hari menjadi 14 hari, pengguna yang berada dalam masa tenggang akan mendapatkan perpanjangan akses ke manfaat langganan.
- Jika Anda mengurangi masa tenggang, manfaat langganan bagi pengguna dengan masa tenggang lama yang hampir habis dan melebihi masa tenggang baru akan segera dicabut. Misalnya, jika Anda mengurangi masa tenggang dari 14 hari menjadi 7 hari, pengguna yang berada pada hari ke-8-14 masa tenggang lama akan segera dicabut manfaat langganannya.
- Langganan tetap dalam status aktif dan Anda tidak akan menerima masa tenggang periode RTDN hingga masa tenggang senyap berakhir
Masa tenggang senyap
Anda dapat menetapkan masa tenggang 0 hari, tetapi Play akan menunggu minimal 1 hari untuk
memastikan waktu yang cukup untuk percobaan ulang pembayaran. Masa tenggang senyap ini menawarkan
jaring pengaman untuk
pemrosesan pembayaran. Selama periode 24 jam ini,
langganan tetap berada dalam
Negara bagian ACTIVE
.
Cara terbaik agar Anda tetap sinkron dengan perubahan status langganan adalah dengan
mendengarkan dan bereaksi terhadap notifikasi developer real-time (RTDN). Panggil
purchases.subscriptionsv2.get()
dengan waktu RTDN daripada waktu kedaluwarsa untuk mendapatkan
status langganan.
Bergantung pada status langganan setelah masa tenggang senyap 24 jam Anda akan menerima salah satu dari pemberitahuan berikut:
SUBSCRIPTION_ON_HOLD
(jika diaktifkan)SUBSCRIPTION_CANCELED
(jika dibatalkan)SUBSCRIPTION_EXPIRED
(jika sudah tidak berlaku)SUBSCRIPTION_RENEWED
(jika berhasil diperpanjang)
Anda juga dapat memanggil metode subscriptionV2.get()
kapan saja setelah
Masa tenggang senyap 24 jam untuk mendapatkan status langganan terbaru.
Penangguhan akun
Jika ada masalah pembayaran dengan perpanjangan langganan, setelah masa tenggang apa pun periode telah berakhir, masa penangguhan akun dimulai. Ketika seorang langganan memasuki penangguhan akun, Anda harus memblokir akses ke langganan yang sama.
Selama penangguhan akun, Anda harus terus menangani pembatalan, pemulihan, atau pembelian ulang langganan sesuai kebutuhan, karena pengguna dapat melakukan perubahan ini saat langganan ditangguhkan.
RTDN memberi tahu Anda saat pengguna memasuki periode penangguhan akun, sehingga Anda dapat memberi tahu mereka sesegera mungkin mengapa akses mereka ke langganan ditangguhkan. Cara mudah untuk melakukannya adalah dengan menggunakan In-App Messaging API. Memanggil API ini saat pengguna membuka aplikasi akan menampilkan pesan di snackbar sementara yang memberi tahu pengguna bahwa pembayaran mereka telah ditolak. Pesan ini juga menyertakan deep link bagi pengguna untuk memperbaiki metode pembayarannya di Google Play.
Jika pengguna dapat mengakses konten langganan di luar aplikasi, mereka mungkin mengetahui bahwa mereka kehilangan akses di platform yang berbeda. Sebaiknya Anda mengirimkan notifikasi push atau email kepada pengguna untuk memberi tahu bahwa langganan mereka tidak lagi aktif karena penolakan pembayaran.
Langganan tidak ditampilkan oleh metode
queryPurchasesAsync()
selama penangguhan akun. Jadi, jika aplikasi Anda mengandalkan metode ini untuk menampilkan
pembelian yang ada, Anda harus mendukung penangguhan akun secara default.
Dengan notifikasi developer
real time, Anda akan menerima
pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_ON_HOLD
saat langganan memasuki status penangguhan akun. Panggil
metode
purchases.subscriptionsv2.get
dari server backend yang aman untuk mengambil informasi
langganan baru. Selama penangguhan akun, kolom expiryTime
dari resource
langganan
disetel ke stempel waktu yang lalu, dan kolom subscriptionState
disetel ke
SUBSCRIPTION_STATE_ON_HOLD
:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_past,
...
}
],
}
Untuk memulihkan akses, pengguna harus memperbaiki metode pembayaran. Play memberi tahu pengguna tentang penangguhan akun terkait penolakan pembayaran mereka, dan Anda juga harus mendorong mereka untuk memperbaiki metode pembayaran.
Setelah pengguna memperbaiki metode pembayaran, langganan akan dikembalikan ke status
aktif, lalu Anda harus memulihkan akses ke konten langganan. Dalam hal ini,
token pembelian sama dengan yang ada sebelum penangguhan akun dimulai karena
pembelian yang sama dipulihkan, dan Anda menerima RTDN dengan jenis
SUBSCRIPTION_RECOVERED
.
Untuk langganan cicilan, penolakan pembayaran dan pemulihan dapat terjadi untuk setiap upaya pembayaran individual.
Setelah pemulihan, Play Billing Library akan menampilkan langganan lagi melalui
metode queryPurchasesAsync()
. Jika Anda menggunakan metode ini untuk menentukan apakah
pengguna berhak menikmati langganan, aplikasi Anda harus otomatis menangani
pemulihan langganan dari penangguhan akun.
Proses
pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_RECOVERED
untuk mendapatkan notifikasi saat langganan
dipulihkan dan pengguna akan mendapatkan akses kembali. Jika Anda membuat kueri langganan
setelah menerima notifikasi ini, kolom expiryTime
akan disetel ke stempel waktu
di masa mendatang dan kolom subscriptionState
akan disetel ke
SUBSCRIPTION_STATE_ACTIVE
lagi:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
...
}
],
}
Jika pengguna tidak memperbaiki metode pembayaran sebelum masa penangguhan akun
berakhir, Anda akan menerima RTDN dengan jenis SUBSCRIPTION_CANCELED
. Untuk
petunjuk tentang cara menangani pembatalan, lihat
Pembatalan. Jika Anda
membuat kueri langganan yang dibatalkan dengan cara ini, kolom
expiryTime
yang ditampilkan akan disetel ke stempel waktu yang lalu:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_past,
...
}
],
}
Segera setelah Anda menerima notifikasi terkait pembatalan selama penangguhan akun, Anda
juga akan menerima RTDN dengan jenis SUBSCRIPTION_EXPIRED
karena pengguna
tidak lagi memiliki hak berbayar dan langganannya telah dihentikan dengan pembatalan.
Anda dapat menangani masa berlaku ini seperti biasa.
Pengguna dapat memperoleh kembali akses dengan membeli kembali paket langganan yang sama atau
paket lain apa pun yang Anda tawarkan melalui aplikasi selama periode penangguhan akun sejak
pembelian awal mereka. Dalam hal ini, token pembelian baru akan dikeluarkan dan
nilai yang baru akan ditampilkan sebagai bagian dari peristiwa SUBSCRIPTION_PURCHASED
yang
mewakili instance baru ini.
Akses dan pemulihan penangguhan akun
Gambar 3 menunjukkan linimasa untuk langganan yang memasuki penangguhan akun, lalu melakukan pemulihan saat pengguna memperbaiki metode pembayaran.
![](https://developer.android.com/static/images/google/play/billing/lifecycle/acct-hold-1.png?authuser=6&hl=id)
Serupa dengan contoh sebelumnya, Gambar 4 menunjukkan linimasa untuk langganan yang pertama kali memasuki masa tenggang sebelum memasuki penangguhan akun, lalu dipulihkan ketika ditangguhkan.
![](https://developer.android.com/static/images/google/play/billing/lifecycle/acct-hold-2.png?authuser=6&hl=id)
Penting untuk mengingat poin-poin berikut:
- Sebelum langganan memasuki penangguhan akun, Google Play akan melakukan upaya tambahan untuk menagih metode pembayaran hingga 48 jam. Pengguna masih memiliki manfaat langganan selama periode ini. Setelah periode percobaan ulang ini berlalu, langganan akan memasuki penangguhan akun, dan pengguna akan kehilangan akses ke manfaat langganan.
- Langganan memasuki penangguhan akun secara langsung saat langganan dilanjutkan dari status dijeda dengan metode pembayaran yang gagal.
- Saat langganan dipulihkan dari penangguhan akun, tanggal perpanjangan akan direset.
Berakhirnya masa berlaku
Setelah masa berlaku langganan berakhir, pengguna akan kehilangan akses ke langganan. Dalam
hal ini, pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_EXPIRED
akan
dikirim. Saat Anda menerima notifikasi ini, buat kueri Google Play Developer
API untuk mendapatkan resource
langganan terbaru.
Setelah Anda mengonfirmasi bahwa subscriptionState
adalah SUBSCRIPTION_STATE_EXPIRED
,
hapus hak dan daftarkan status pembelian sebagai tidak valid di
backend Anda. Resource langganan terlihat mirip dengan contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": expiration_time_in_past,
...
}
],
}
Pembatalan
Pengguna dapat membatalkan langganan secara sukarela dari pusat langganan Play
atau langganan mereka akan otomatis dibatalkan jika mereka tidak memulihkannya setelah
memasuki penangguhan akun. Developer juga dapat memicu
pembatalan dengan
purchases.subscriptions.cancel
Saat langganan dibatalkan, pengguna akan tetap memiliki akses ke konten tersebut hingga
akhir siklus penagihan saat ini. Saat siklus penagihan berakhir, akses harus
dicabut.
Membatalkan langganan tanpa cicilan dan perpanjangan otomatis akan memicu
SUBSCRIPTION_CANCELED
notifikasi. Saat
notifikasi ini dikirim, resource
langganan
yang ditampilkan dari Google Play Developer API memiliki kolom subscriptionState
yang ditetapkan ke SUBSCRIPTION_STATE_CANCELED
, dan kolom expiryTime
berisi
tanggal saat pengguna akan kehilangan akses ke langganan. Jika tanggal tersebut
sudah berlalu, pengguna akan segera kehilangan haknya. Hal ini dapat terjadi,
misalnya, jika pengguna membatalkan langganan saat penangguhan
akun karena penolakan pembayaran.
Resource langganan untuk pembelian yang dibatalkan terlihat mirip dengan contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": expiration_time,
...
}
],
}
Untuk langganan cicilan, SUBSCRIPTION_CANCELLATION_SCHEDULED
notifikasi akan dikirim setelah pembatalan yang dimulai pengguna saat pembayaran tetap
selama periode komitmen. Pembatalan masih dalam proses dan berlaku di
akhir periode komitmen saat ini. Saat Anda menerima pemberitahuan ini,
yang ditampilkan dari Google Play Developer API memiliki
subscriptionState ditetapkan ke SUBSCRIPTION_STATE_ACTIVE
karena
langganan cicilan tetap aktif hingga akhir periode komitmen.
Namun, ada objek pendingcancel yang kosong.
Notifikasi SUBSCRIPTION_CANCELED
dikirim diikuti dengan
SUBSCRIPTION_EXPIRED
di akhir periode komitmen.
Resource langganan untuk pembelian langganan cicilan yang pembatalan yang tertunda terlihat mirip dengan contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_plan01",
"expiryTime": expiration_time,
"autoRenewingPlan": {
"autoRenewEnabled": true,
"recurringPrice": {
"currencyCode": "USD",
"units": "1",
"nanos": 990000000
},
"installmentDetails": {
"initialCommittedPaymentsCount": 6,
"remainingCommittedPaymentsCount": 5,
"pendingCancellation": {}
...
}
}
}
],
}
Anda dapat melihat kolom canceledStateContext
di resource langganan untuk
mengetahui alasan langganan dibatalkan (misalnya, apakah langganan
dibatalkan oleh pengguna, oleh sistem, atau oleh Anda). Jika langganan
dibatalkan oleh pengguna, Anda dapat melihat kolom userInitiatedCancellation
untuk
mengetahui alasan pengguna membatalkan langganan. Hal ini dapat membantu menginformasikan strategi
komunikasi.
Jika dibatalkan saat masa berlakunya belum berakhir, langganan
masih ditampilkan dari
queryPurchasesAsync()
.
Anda mungkin ingin menampilkan pesan di aplikasi yang memberi tahu pengguna bahwa langganan mereka
dibatalkan, serta memberikan tanggal habis masa berlaku.
Pencabutan
Langganan dapat dicabut karena berbagai alasan, termasuk backend Anda
mencabut langganan dengan menggunakan
purchases.subscriptionsv2.revoke
atau pembelian tersebut ditagih kembali. Dalam situasi ini, segera cabut hak
pengguna. Pesan SubscriptionNotification
dengan jenis
SUBSCRIPTION_REVOKED
dikirim saat hal ini terjadi. Saat Anda menerima notifikasi
ini, resource
langganan
yang ditampilkan dari Google Play Developer API memiliki kolom subscriptionState
yang ditetapkan ke SUBSCRIPTION_STATE_EXPIRED
.
Resource langganan untuk pembelian yang dicabut terlihat mirip dengan contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": expiration_time,
...
}
]
}
Langganan ditunda
Ada berbagai alasan mengapa Anda perlu memperpanjang hak
pengguna. Misalnya, Anda mungkin ingin menawarkan akses gratis kepada pengguna sebagai promosi
khusus, seperti memberikan satu minggu pembelian film secara gratis atau memberikan akses
gratis kepada pelanggan sebagai bentuk niat baik. Anda dapat menggunakan
metode purchases.subscriptions.defer
dari Play Developer API guna melanjutkan tanggal penagihan berikutnya untuk
langganan yang diperpanjang otomatis. Jika Anda melakukannya, pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_DEFERRED
akan dikirim. Selama periode penundaan,
pengguna berlangganan konten Anda dengan akses penuh tanpa dikenai biaya. Tanggal
perpanjangan langganan akan diperbarui untuk menunjukkan tanggal yang baru.
Untuk paket prabayar, Anda dapat menggunakan defer billing API untuk menunda waktu habis masa berlaku.
Resource langganan untuk langganan yang ditunda terlihat mirip dengan contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_future,
...
}
],
}
Langganan dijeda
Anda dapat mencegah churn sukarela dengan memungkinkan pengguna menjeda langganan. Saat Anda mengaktifkan fitur jeda, pengguna dapat memilih untuk menjeda langganan untuk jangka waktu antara satu minggu hingga tiga bulan, bergantung pada periode pengulangannya.
Pengulangan langganan | Mingguan | Bulanan | Tiga Bulan | Enam Bulan | Tahunan |
---|---|---|---|---|---|
Durasi jeda yang tersedia* | 1 minggu 2 minggu 3 minggu 4 minggu |
1 bulan 2 bulan 3 bulan |
1 bulan 2 bulan 3 bulan |
1 bulan 2 bulan 3 bulan |
T/A |
Jeda langganan hanya berlaku setelah periode penagihan saat ini berakhir. Selama langganan dijeda, pengguna tidak memiliki akses ke langganan, dan mereka tidak membayar harga perpanjangannya. Pada akhir periode jeda, langganan dilanjutkan dan Google berupaya memperpanjang langganan tersebut. Jika dapat dilanjutkan, langganan akan aktif kembali. Jika langganan tidak dapat dilanjutkan karena masalah pembayaran, pengguna akan memasuki status penangguhan akun, seperti ditunjukkan pada gambar 5 dan 6:
![](https://developer.android.com/static/images/google/play/billing/lifecycle/pause-1.png?authuser=6&hl=id)
![](https://developer.android.com/static/images/google/play/billing/lifecycle/pause-2.png?authuser=6&hl=id)
Pengguna juga dapat memilih untuk melanjutkan langganan secara manual kapan saja selama periode jeda, seperti ditunjukkan pada gambar 6. Jika pengguna melanjutkan secara manual, tanggal penagihan berubah ke tanggal melanjutkan manual.
Saat langganan pengguna dijeda, Library Layanan Penagihan Play tidak akan menampilkan
langganan melalui
metode
queryPurchasesAsync()
. Jika langganan dilanjutkan, metode queryPurchasesAsync()
akan menampilkannya lagi.
Proses RTDN untuk mengetahui kapan pengguna menjeda langganan mereka. Notifikasi ini juga memungkinkan Anda memberi tahu pengguna di aplikasi bahwa mereka telah menjeda langganan dan tidak memiliki akses ke langganan tersebut. Anda juga harus menyediakan cara bagi pengguna untuk melanjutkan langganan mereka secara manual kapan saja dengan menggunakan deep link ke Google Play.
Pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED
dikirim saat pengguna mulai
menjeda langganan. Untuk saat ini, pengguna dapat terus mengakses
langganan hingga tanggal perpanjangan berikutnya, dan resource
langganan
berisi autoRenewEnabled = true
. Nilai kolom subscriptionState
adalah SUBSCRIPTION_STATE_ACTIVE
pada tahap ini.
Pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_PAUSED
dikirim saat
langganan mulai dijeda. Jika hal ini terjadi, pengguna akan kehilangan akses ke
langganannya, dan resource langganan berisi autoRenewEnabled = true
,
dan kolom subscriptionState
disetel ke SUBSCRIPTION_STATE_PAUSED
. Anda dapat
melihat kapan langganan diperkirakan akan diperpanjang lagi dengan memeriksa
objek
PausedStateContext
.
Pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_RENEWED
dikirim jika
langganan dilanjutkan secara otomatis pada akhir periode jeda
atau jika pengguna memilih untuk melanjutkan langganan secara manual. Hal ini harus ditangani
seperti yang dijelaskan dalam Perpanjangan.
Pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_ON_HOLD
dikirim jika
terjadi kegagalan pembayaran saat mencoba melanjutkan langganan setelah dijeda.
Hal ini harus ditangani seperti yang dijelaskan di Penangguhan akun.
Berlangganan lagi
Untuk paket dasar langganan yang diperpanjang otomatis, Google Play Store dapat menampilkan tombol Berlangganan lagi. Dengan tombol ini, pengguna bisa mendapatkan kembali akses ke langganan. Foto mungkin tidak muncul karena berbagai alasan, misalnya saat masa berlaku langganan telah lama berakhir.
![](https://developer.android.com/static/images/google/play/billing/lifecycle/restoration.png?authuser=6&hl=id)
Meskipun tombol tersebut selalu berlabel Berlangganan lagi, fungsinya bergantung pada status langganan.
Saat langganan dibatalkan tetapi masa berlakunya belum habis, pengguna masih berlangganan dan menerima manfaat langganan. Jika pengguna mengetuk Berlangganan lagi, pembatalan akan langsung diurungkan dan langganan akan diperpanjang. Tindakan ini disebut sebagai pemulihan dalam API dan dokumentasi developer Play.
Setelah masa berlaku langganan dengan perpanjangan otomatis berakhir, Anda dapat mengizinkan pengguna untuk membeli paket dasar langganan yang sama. Tindakan ini disebut sebagai berlangganan lagi dalam API dan dokumentasi developer Play. Anda dapat mengonfigurasi opsi ini untuk setiap paket dasar di Konsol Play atau menggunakan API.
Memulihkan sebelum masa berlaku habis
Jika aplikasi hanya mengandalkan metode
queryPurchasesAsync()
untuk menentukan apakah pengguna berhak menikmati langganan, aplikasi
harus otomatis menangani pemulihan karena metode queryPurchasesAsync()
terus menampilkan pembelian yang dibatalkan sebelum tanggal habis masa berlakunya. Langganan
yang dipulihkan akan terus diperpanjang seolah-olah tidak dibatalkan.
Jika aplikasi menyinkronkan status langganan dengan backend, Anda harus memproses
pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_RESTARTED
. Setelah Anda menerima RTDN ini,
aplikasi Anda dapat merespons notifikasi, mencatat bahwa langganan kini
disetel untuk diperpanjang, dan berhenti menampilkan pesan pemulihan di aplikasi Anda. Resource
langganan terlihat mirip dengan contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date
...
}
],
}
Berlangganan lagi setelah masa berlaku habis
Jika paket dasar dengan perpanjangan otomatis dikonfigurasi menggunakan Konsol Google Play atau API untuk mengizinkan Berlangganan lagi, pengguna dapat membeli kembali langganan yang telah habis masa berlakunya di Google Play Store.
Ini adalah pembelian baru. Google Play mengeluarkan token pembelian baru, dan
backend Anda menerima RTDN dengan jenis SUBSCRIPTION_PURCHASED
. Status pembelian
untuk jenis pembelian di luar aplikasi ini tidak mencakup linkedPurchaseToken
yang terkait dengan pembelian asli karena masa berlaku langganan asli
sudah habis sepenuhnya. Ini adalah pembelian baru yang harus diproses
dan dikonfirmasi oleh backend Anda seperti pembelian lainnya.
Mengupgrade, mendowngrade, dan berlangganan lagi
Jika pengguna mengupgrade, mendowngrade, atau mendaftar setelah pembatalan dari aplikasi sebelum masa berlaku langganan berakhir, langganan lama akan menjadi tidak valid dan langganan baru akan dibuat dengan token pembelian baru.
Selain itu, resource
langganan
yang ditampilkan dari Google Play Developer API berisi kolom linkedPurchaseToken
yang menunjukkan pembelian lama tempat pengguna mengupgrade, mendowngrade,
atau berlangganan lagi. Anda dapat menggunakan token pembelian di kolom tersebut untuk mencari
langganan lama dan mengidentifikasi akun pengguna yang ada sehingga Anda dapat mengaitkan
pembelian baru dengan akun yang sama.
Sebelum menawarkan opsi upgrade, downgrade, atau berlangganan lagi kepada pengguna di aplikasi, Anda harus mengonfirmasi langganan yang ada. Perubahan paket atau berlangganan lagi akan diblokir jika langganan yang ada masih menunggu konfirmasi.
Jika pengguna berhasil membeli upgrade, downgrade, atau berlangganan lagi, ini adalah pembelian baru yang harus Anda konfirmasi. Cara yang direkomendasikan untuk melakukannya adalah dengan menggunakan Google Play Developer API. Resource langganan terlihat mirip dengan contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"linkedPurchaseToken": old_purchase_token,
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
],
}
Perubahan harga
Lihat panduan praktik terbaik perubahan harga untuk mempelajari cara mengubah harga langganan yang diperpanjang otomatis dan memberi tahu pengguna jika perlu.
Saat perubahan harga diterapkan kepada pelanggan lama sebagai keikutsertaan, Anda akan menerima RTDN jika pengguna mengambil tindakan untuk mengonfirmasi atau menolak harga baru.
Menangani konfirmasi pengguna atas perubahan harga keikutsertaan
Saat pengguna menyetujui kenaikan harga langganan, Anda akan menerima
pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_PRICE_CHANGED_CONFIRMED
. Dengan penurunan harga
ketidakikutsertaan, atau saat kenaikan harga langganan diperpanjang, Anda akan menerima
pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_RENEWED
. Perlakukan notifikasi
ini seperti perpanjangan lainnya.
Menangani kasus kenaikan harga keikutsertaan yang tidak disetujui
Jika pengguna belum menyetujui kenaikan harga keikutsertaan sebelum mereka harus melakukan perpanjangan dengan
harga yang lebih tinggi, mereka akan otomatis berhenti berlangganan, dan Anda akan menerima
pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_CANCELED
. Tangani peristiwa ini seperti yang dijelaskan dalam
Pembatalan.
Pengguna juga dapat membatalkan langganan untuk kenaikan harga ketidakikutsertaan dengan mengikuti mekanisme yang sama.
Menangani siklus proses untuk paket prabayar
Seperti halnya langganan yang diperpanjang otomatis, Anda harus mengonfirmasi paket prabayar setelah setiap pembelian baru. Dalam kasus paket prabayar, Anda harus sepenuhnya memproses pembelian awal dan penambahan saldo apa pun, karena pengguna harus melalui alur pembelian setiap waktu.
Karena durasi paket prabayar cenderung pendek, penting untuk mengonfirmasi pembelian sesegera mungkin. Paket prabayar dengan durasi satu minggu atau lebih harus dikonfirmasi dalam waktu tiga hari. Paket prabayar dengan durasi kurang dari satu minggu harus dikonfirmasi dalam waktu setengah dari durasi paket. Misalnya, developer memiliki waktu 1,5 hari untuk mengonfirmasi pembelian paket prabayar tiga hari.
Pesan SubscriptionNotification
dengan jenis SUBSCRIPTION_PURCHASED
dikirim ke klien RTDN Anda setiap kali
langganan paket prabayar dibeli, termasuk setiap penambahan saldo. Panggil metode
purchases.subscriptionsv2.get
untuk memeriksa status langganan paket prabayar terbaru.
Token pembelian baru dikeluarkan untuk pembelian penambahan saldo, dan Anda akan menerima
token pembelian sebelumnya di kolom linkedPurchaseToken
sebagai bagian dari status
pembelian langganan baru. Token pembelian valid sejak tanggal langganan
pendaftaran hingga 60 hari setelah masa berlaku habis. Setelah tanggal ini, token pembelian akan
tidak lagi valid untuk digunakan memanggil Google Play Developer API.
Resource langganan untuk pembelian paket prabayar terlihat mirip dengan contoh berikut:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
"startTime": "2022-04-22T18:39:58.270Z",
"regionCode": "US",
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"latestOrderId": "GPA.3333-4137-0319-36762",
"acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
"lineItems": [
{
"productId": "prepaid_plan01",
"expiryTime": expiry_date,
"prepaidPlan": {
"allowExtendAfterTime": timestamp_after_which_topups_are_allowed
}
}
]
}
Anda dapat melihat kapan hak berakhir di kolom expiryTime
. Pembelian
penambahan saldo akan memperpanjang waktu hak dengan mengakumulasinya. Hal ini berarti bahwa jika
pengguna menambah saldo sebelum hak aslinya berakhir, waktu baru akan ditambahkan
di atas tanggal habis masa berlaku sebelumnya.
Anda mungkin ingin menampilkan pesan di aplikasi yang memberi tahu pengguna bahwa
langganan prabayar mereka dapat diperpanjang dengan penambahan saldo. Untuk mengetahui kapan pengguna dapat
melakukan penambahan saldo, periksa kolom allowExtendAfterTime
di resource
langganan.
Paket prabayar tidak diperpanjang secara otomatis, sehingga tidak dapat dibatalkan. Jika pengguna ingin membatalkan paket prabayar, mereka bisa membiarkan aplikasi mencapai tanggal habis masa berlakunya.