Topik ini menjelaskan cara melakukan migrasi dari Library Layanan Penagihan Google Play 4 atau 5 ke Library Layanan Penagihan Google Play 6 dan cara menggunakan kemampuan langganan baru.
Untuk daftar lengkap perubahan pada versi 6.0.0, lihat catatan rilis.
Ringkasan
Library Layanan Penagihan Google Play 6 dibuat berdasarkan fitur langganan baru yang diperkenalkan di versi 5 dan menambahkan beberapa peningkatan lainnya. Fitur ini memungkinkan Anda menjual langganan dengan lebih banyak cara, sehingga mengurangi biaya operasional dengan meniadakan kebutuhan untuk membuat dan mengelola SKU yang jumlahnya terus meningkat.
Untuk mengetahui informasi selengkapnya tentang fitur baru yang diperkenalkan di Library Layanan Penagihan Play 5, lihat Perubahan terbaru terkait langganan di Konsol Play.
Upgrade Play Billing Library yang kompatibel dengan versi lama
Semua produk langganan yang ada otomatis dikonversi ke paradigma baru ini sebagai bagian dari rilis Library Layanan Penagihan Play 5 dan platform langganan baru pada Mei 2022. Artinya, Anda tidak perlu membuat perubahan konfigurasi produk langganan untuk memiliki katalog yang kompatibel dengan versi baru Library Layanan Penagihan Play. Untuk mengetahui informasi selengkapnya tentang bagaimana SKU langganan dikonversi menjadi langganan yang kompatibel dengan versi lama, lihat bagian Mengelola langganan lama di Artikel bantuan Konsol Play.
Versi lama aplikasi Anda masih berfungsi
Jika Anda memiliki katalog langganan yang kompatibel dengan versi lama, semua versi aplikasi yang ada harus tetap berfungsi sebagaimana mestinya untuk produk tersebut. Pembelian produk sekali beli juga harus terus berfungsi tanpa masalah pada versi yang lebih lama.
Versi aplikasi Anda yang menggunakan metode yang tidak digunakan lagi (misalnya,
querySkuDetailsAsync()
)
tidak akan dapat menjual paket dasar atau penawaran yang tidak kompatibel
dengan versi lama. Anda dapat membaca tentang penawaran yang kompatibel dengan versi lama di artikel
Pusat Bantuan Konsol
Play yang relevan.
Mengupgrade ke Play Billing Library 5 atau 6
Library Layanan Penagihan Play 5 dan 6 menyertakan metode
querySkuDetailsAsync
dan BillingFlowParams.Builder.setSkuDetails
yang tidak digunakan lagi dan menggunakan
SkuDetails
sebagai parameter alur
penagihan. Hal ini berarti Anda dapat secara bertahap beralih ke Library Layanan Penagihan Play 6
dengan merencanakan berbagai tahap migrasi.
Sebagai langkah pertama untuk migrasi, Anda dapat mengupdate versi
library, membiarkan katalog dan backend sebagaimana adanya, serta menguji
aplikasi Anda saat masih menggunakan metode yang tidak digunakan lagi. Jika Anda tidak menggunakan
queryPurchases
, launchPriceChangeFlow
, atau setVrPurchaseFlow
, seharusnya aplikasi
masih berfungsi sebagaimana mestinya. Setelah itu, Anda dapat melakukan iterasi untuk mengadopsi sepenuhnya fitur langganan
baru yang dirilis pada Mei 2022.
Jika sebelumnya Anda telah mengadopsi fitur ini dengan migrasi Library Layanan Penagihan Google Play 5, Anda dapat langsung melanjutkan ke bagian yang berlabel Mengupdate Library Layanan Penagihan Google Play dan Mengubah pembelian langganan pengguna. Jika Anda memulai dari versi sebelumnya atau belum sepenuhnya mengadopsi fitur baru, Anda dapat membaca langkah-langkah migrasi lengkap untuk mempelajari cara mengadopsinya.
Langkah-langkah migrasi lengkap
Membuat langganan baru di katalog produk backend
Dengan menggunakan Konsol Play atau API Developer Play, Anda kini dapat mengonfigurasi satu langganan dengan beberapa paket dasar, masing-masing dengan beberapa penawaran. Penawaran langganan memiliki model harga dan opsi kelayakan yang fleksibel. Anda dapat membuat penawaran di seluruh siklus proses langganan menggunakan berbagai paket prabayar dan paket perpanjangan otomatis.
Sebaiknya buat produk baru mengikuti struktur entity di platform langganan baru untuk integrasi Library Layanan Penagihan Play 6 Anda sebelum memigrasikan aplikasi. Anda dapat menggabungkan produk duplikat di katalog lama yang mewakili manfaat hak yang sama dalam satu langganan, serta menggunakan paket dasar dan konfigurasi penawaran untuk menunjukkan semua opsi yang ingin Anda tawarkan. Untuk mengetahui informasi selengkapnya tentang rekomendasi ini, lihat bagian Mengelola langganan lama di Artikel bantuan Konsol Play.
Sebaiknya jangan ubah produk langganan yang dikonversi setelah
rilis Mei 2022. Anda harus membiarkannya seperti yang dijual dengan versi
aplikasi yang menggunakan metode yang tidak digunakan lagi (misalnya, querySkuDetailsAsync()
) tanpa memperkenalkan perubahan yang
dapat memengaruhi versi lama ini.
Proses konversi membuat produk langganan yang ada di katalog Anda sebelum Mei 2022 menjadi hanya baca untuk menghindari perubahan tidak disengaja yang dapat mengakibatkan masalah dengan integrasi yang sudah ada. Anda dapat melakukan perubahan pada langganan ini, tetapi akan ada implikasi yang dapat memengaruhi integrasi frontend dan backend Anda:
Pada frontend, versi aplikasi yang menggunakan
querySkuDetailsAsync()
untuk mendapatkan detail produk langganan hanya dapat menjual paket dasar dan penawaran yang kompatibel dengan versi lama, dan hanya boleh ada satu paket dasar dan kombinasi penawaran yang kompatibel dengan versi lama. Jadi, jika Anda menambahkan paket atau penawaran baru ke langganan yang dikonversi, penawaran atau paket dasar tambahan tersebut tidak akan dapat dijual pada versi lama aplikasi.Di backend, jika mengedit langganan yang dikonversi di UI Konsol Play, Anda tidak akan dapat mengelolanya dengan endpoint
inappproducts
, jika Anda memanggil endpoint untuk tujuan ini. Anda juga harus bermigrasi ke endpoint status pembelian langganan baru (purchases.subscriptionsv2.get
) untuk mengelola pembelian langganan ini, karena endpoint status pembelian lama (purchases.subscriptions.get
) hanya menampilkan data yang diperlukan untuk menangani pembelian paket dasar dan penawaran yang kompatibel dengan versi lama. Baca bagian Mengelola status pembelian langganan untuk mengetahui informasi selengkapnya.
Mengelola katalog langganan backend dengan API baru
Jika Anda mengelola katalog produk langganan secara otomatis dengan Google Play Developer API, Anda harus menggunakan endpoint definisi produk langganan baru untuk membuat dan mengelola langganan, paket dasar, dan penawaran. Baca panduan fitur langganan Mei 2022 untuk mempelajari lebih lanjut perubahan API katalog produk untuk rilis ini.
Untuk memigrasikan modul pengelolaan katalog produk otomatis bagi
langganan Layanan Penagihan Google Play, ganti
inappproducts
API dengan Subscription Publishing API baru untuk mengelola dan memublikasikan
katalog langganan Anda. Ada tiga endpoint baru:
Monetization.subscriptions
untuk mengelola produk langganan.Monetization.basePlans
untuk mengelola paket dasar langganan.Monetization.offers
untuk mengelola penawaran paket dasar.
Endpoint baru ini memiliki semua fungsi yang diperlukan untuk memanfaatkan semua kemampuan baru di katalog Anda: tag paket dasar dan penawaran, penargetan wilayah, paket prabayar, dan lainnya.
Anda tetap harus menggunakan
inappproducts
API untuk mengelola katalog produk dalam aplikasi untuk produk pembelian satu kali.
Versi aplikasi Anda yang menggunakan metode yang tidak digunakan lagi (misalnya, querySkuDetailsAsync()
) tidak akan dapat menjual paket dasar atau penawaran yang tidak kompatibel dengan versi lama. Anda dapat membaca penawaran yang kompatibel dengan versi lama di sini.
Mengupdate Library Layanan Penagihan Google Play
Setelah membuat katalog produk langganan baru,
Anda dapat memigrasikan aplikasi ke Library Penagihan Google 5. Ganti dependensi
Library Layanan Penagihan Play yang ada dengan versi yang
sudah diupdate ke file build.gradle
aplikasi Anda.
dependencies {
def billingVersion = "6.0.0"
implementation "com.android.billingclient:billing:$billingVersion"
}
Project Anda akan langsung di-build, meskipun Anda belum mengubah panggilan apa pun ke metode—Library Layanan Penagihan Play 6 kompatibel dengan versi lama. Konsep SKU dianggap tidak digunakan lagi, tetapi masih ada untuk membuat proses transfer aplikasi menjadi lebih sederhana dan lebih inkremental.
Melakukan inisialisasi pada Klien Penagihan dan membuat koneksi ke Google Play
Langkah pertama untuk meluncurkan pembelian dari aplikasi Android tetap sama:
Menampilkan produk yang tersedia untuk dibeli
Untuk mendapatkan semua penawaran yang dapat dibeli oleh pengguna yang memenuhi syarat:
- Ganti
SkuDetailsParams
denganQueryProductDetailsParams
- Ganti panggilan
BillingClient.querySkuDetailsAsync()
untuk menggunakanBillingClient.queryProductDetailsAsync()
Perhatikan bahwa hasil kueri sekarang adalah ProductDetails
, bukan SkuDetails
.
Setiap item ProductDetails
berisi informasi tentang produk
(ID, judul, jenis, dan sebagainya). Untuk produk langganan, ProductDetails
berisi List<ProductDetails.SubscriptionOfferDetails>
, yang merupakan
daftar detail penawaran langganan. Untuk produk pembelian satu kali,
ProductDetails
berisi ProductDetails.OneTimePurchaseOfferDetails
. Ini
dapat digunakan untuk memutuskan penawaran mana yang akan ditampilkan kepada pengguna.
Contoh berikut menunjukkan contoh tampilan aplikasi Anda sebelum dan sesudah perubahan dilakukan:
Sebelum
Kotlin
val skuList = ArrayList<String>() skuList.add("up_basic_sub") val params = SkuDetailsParams.newBuilder() params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS).build() billingClient.querySkuDetailsAsync(params) { billingResult, skuDetailsList -> // Process the result }
Java
List<String> skuList = new ArrayList<>(); skuList.add("up_basic_sub"); SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); params.setSkusList(skuList).setType(SkuType.SUBS).build(); billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) { // Process the result. } } );
Setelah
Kotlin
val productList = listOf( QueryProductDetailsParams.Product.newBuilder() .setProductId("up_basic_sub") .setProductType(BillingClient.ProductType.SUBS) .build() ) val params = QueryProductDetailsParams.newBuilder().setProductList(productList).build() billingClient.queryProductDetailsAsync(params) { billingResult, productDetailsList -> // Process the result }
Java
ImmutableList<Product> productList = ImmutableList.of(Product.newBuilder() .setProductId("up_basic_sub") .setProductType(ProductType.SUBS) .build()); QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder() .setProductList(productList) .build(); billingClient.queryProductDetailsAsync( params, new ProductDetailsResponseListener() { public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) { // Process the result } } );
Callback untuk queryProductDetailsAsync
akan menampilkan List<ProductDetails>
.
Setiap item ProductDetails
berisi informasi tentang produk
(ID, judul, jenis, dan sebagainya). Perbedaan utamanya adalah produk
langganan kini juga berisi List<ProductDetails.SubscriptionOfferDetails>
yang memuat semua penawaran yang tersedia untuk pengguna.
Karena Library Layanan Penagihan Play versi sebelumnya tidak mendukung objek
baru (langganan, paket dasar, penawaran, dan sebagainya), sistem baru
menerjemahkan setiap SKU langganan ke dalam satu paket dasar dan penawaran
yang kompatibel dengan versi lama. Produk pembelian satu kali yang tersedia juga
ditransfer ke objek ProductDetails
. Detail penawaran produk pembelian satu kali
dapat diakses dengan
metode getOneTimePurchaseOfferDetails()
.
Beberapa perangkat jarang sekali tidak dapat mendukung ProductDetails
dan queryProductDetailsAsync()
,
biasanya karena versi Layanan Google Play yang sudah tidak berlaku. Untuk memastikan
dukungan yang tepat untuk skenario ini, panggil
isFeatureSupported()
untuk fitur PRODUCT_DETAILS
sebelum memanggil queryProductDetailsAsync
. Jika responsnya adalah
OK
,
perangkat akan mendukung fitur tersebut dan Anda dapat melanjutkan dengan memanggil queryProductDetailsAsync()
.
Jika responsnya adalah FEATURE_NOT_SUPPORTED
,
Anda dapat meminta daftar produk yang kompatibel dengan versi lama yang tersedia menggunakan
querySkuDetailsAsync()
.
Untuk mempelajari lebih lanjut cara menggunakan fitur kompatibilitas
mundur, lihat Panduan fitur langganan Mei 2022.
Meluncurkan alur pembelian penawaran
Meluncurkan alur pembelian untuk penawaran sangat mirip dengan meluncurkan alur untuk SKU. Untuk memulai permintaan pembelian menggunakan versi 6, lakukan hal berikut:
- Gunakan
ProductDetailsParams
, bukanSkuDetails
untukBillingFlowParams
. - Detail penawaran, seperti ID penawaran, ID paket dasar, dan lainnya dapat diperoleh menggunakan objek
SubscriptionOfferDetails
.
Untuk membeli produk dengan penawaran yang dipilih pengguna, dapatkan offerToken
penawaran yang dipilih dan teruskan ke objek ProductDetailsParams
.
Setelah Anda membuat objek BillingFlowParams
, peluncuran alur penagihan
dengan BillingClient
akan tetap sama.
Contoh berikut menunjukkan contoh tampilan aplikasi Anda sebelum dan sesudah perubahan dilakukan:
Sebelum
Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ... // Retrieve a value for "skuDetails" by calling querySkuDetailsAsync(). val billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(skuDetails) .build() val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; // Retrieve a value for "skuDetails" by calling querySkuDetailsAsync(). BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(skuDetails) .build(); BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Setelah
Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ...; val productDetailsParamsList = listOf( BillingFlowParams.ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // For One-time product, "setOfferToken" method shouldn't be called. // For subscriptions, to get the offer token corresponding to the selected // offer call productDetails.subscriptionOfferDetails?.get(selectedOfferIndex)?.offerToken .setOfferToken(selectedOfferToken) .build() ) val billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build() // Launch the billing flow val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // For one-time products, "setOfferToken" method shouldn't be called. // For subscriptions, to get the offer token corresponding to the selected // offer call productDetails.getSubscriptionOfferDetails().get(selectedOfferIndex).getOfferToken() .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
Memproses pembelian
Pemrosesan pembelian menggunakan Library Layanan Penagihan Google Play 6 akan tetap sama dengan versi sebelumnya.
Untuk menarik semua pembelian aktif yang dimiliki oleh pengguna dan membuat kueri untuk pembelian baru, lakukan langkah berikut:
- Alih-alih meneruskan nilai
BillingClient.SkuType
kequeryPurchasesAsync()
, teruskan objekQueryPurchasesParams
yang berisi nilaiBillingClient.ProductType
.
Contoh berikut menunjukkan tampilan aplikasi Anda sebelum dan sesudah perubahan dilakukan:
Sebelum
Kotlin
billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS) { billingResult, purchaseList -> { // Process the result } }
Java
billingClient.queryPurchasesAsync( BillingClient.SkuType.SUBS, new PurchasesResponseListener() { public void onQueryPurchasesResponse( BillingResult billingResult, ListP<urchase >purchases) { // process the result } } );
Setelah
Kotlin
billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder() .setProductType(BillingClient.ProductType.SUBS) .build() ) { billingResult, purchaseList -> // Process the result }
Java
billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder().setProductType(ProductType.SUBS).build(), new PurchasesResponseListener() { public void onQueryPurchasesResponse( BillingResult billingResult, List<Purchase> purchases) { // Process the result } } );
Langkah-langkah untuk mengelola pembelian di luar aplikasi dan transaksi yang tertunda belum berubah.
Mengelola status pembelian langganan dengan API baru di backend
Anda harus memigrasikan komponen pengelolaan status langganan di backend agar siap menangani pembelian produk baru yang dibuat pada langkah sebelumnya. Komponen pengelolaan status pembelian langganan Anda saat ini akan berfungsi seperti biasa untuk produk langganan yang dikonversi yang Anda tentukan sebelum peluncuran Mei 2022, dan sudah cukup untuk mengelola pembelian penawaran yang kompatibel dengan versi lama, tetapi tidak mendukung fungsi baru.
Anda perlu menerapkan Subscription Purchases API baru untuk modul pengelolaan status pembelian langganan, yang memeriksa status pembelian dan mengelola hak langganan Layanan Penagihan Play di backend. Versi lama API tidak menampilkan semua detail yang diperlukan untuk mengelola pembelian di platform baru. Untuk mengetahui detail tentang perubahan dari versi sebelumnya, lihat panduan untuk fitur langganan baru bulan Mei 2022.
Anda biasanya akan memanggil Subscription Purchases API setiap kali Anda menerima
Notifikasi Developer Real Time SubscriptionNotification
untuk mengambil
informasi terbaru tentang status langganan. Anda harus mengganti panggilan
ke purchases.subscriptions.get
dengan versi baru
Subscription Purchases API, purchases.subscriptionsv2.get
.
Tersedia resource baru bernama
SubscriptionPurchaseV2
yang memberikan cukup informasi
untuk mengelola hak pembelian untuk langganan dalam model baru.
Endpoint baru ini menampilkan status untuk semua produk langganan Anda dan semua pembelian Anda, terlepas dari versi aplikasi yang menjualnya dan kapan produk tersebut ditentukan (sebelum atau setelah rilis Mei 2022). Jadi, setelah migrasi, Anda hanya memerlukan versi modul pengelolaan status pembelian langganan ini.
Mengubah pembelian langganan pengguna
Di Library Layanan Penagihan Play 5 dan yang lebih lama,
ProrationMode
digunakan untuk menerapkan perubahan pada pembelian langganan pengguna, seperti upgrade
atau downgrade. Proses ini tidak digunakan lagi dan diganti dengan
ReplacementMode
dalam versi 6.
Menangani perubahan harga langganan
launchPriceConfirmationFlow
API sebelumnya yang tidak digunakan lagi telah dihapus di
Library Layanan Penagihan Play 6. Untuk alternatifnya, lihat panduan perubahan
harga.
Menangani error Play Billing Library
Di Library Layanan Penagihan Play 6, kode NETWORK_ERROR
baru telah ditambahkan untuk menunjukkan
masalah dengan koneksi jaringan antara perangkat pengguna dan sistem
Google Play. Ada juga perubahan pada kode SERVICE_TIMEOUT
dan
SERVICE_UNAVAILABLE
. Untuk mengetahui informasi selengkapnya, lihat Menangani kode respons BillingResult.
Menangani transaksi yang tertunda
Mulai versi 6.0.0, Library Layanan Penagihan Play tidak membuat ID
pesanan untuk pembelian yang tertunda. Untuk pembelian ini, ID pesanan diisi setelah
pembelian dipindahkan ke
status
PURCHASED
. Pastikan integrasi Anda hanya mengharapkan ID pesanan setelah
transaksi selesai sepenuhnya. Anda tetap dapat menggunakan token pembelian untuk
data Anda. Untuk mengetahui informasi selengkapnya tentang cara menangani pembelian yang tertunda, lihat
panduan integrasi dan
panduan pengelolaan siklus proses pembelian Library Layanan Penagihan Play.