Pengingat: Mulai 2 Agustus 2022, semua aplikasi baru harus menggunakan Library Penagihan versi 4 atau yang lebih baru. Pada 1 November 2022, semua update untuk aplikasi yang ada harus menggunakan Library Penagihan versi 4 atau yang lebih baru. Pelajari lebih lanjut.

Panduan Migrasi Library Layanan Penagihan Google Play 4 ke 5

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Topik ini menjelaskan cara melakukan migrasi dari Library Layanan Penagihan Google Play 4 ke Library Layanan Penagihan Google Play 5 dan cara menggunakan kemampuan langganan baru.

Ringkasan

Library Layanan Penagihan Google Play 5 memperkenalkan paket dasar langganan dan penawaran langganan. Fitur ini memberikan cara baru untuk menjual langganan, dan mengurangi kompleksitas integrasi dibandingkan versi sebelumnya.

Dengan menggunakan Konsol Play atau API Developer Play, Anda 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 perpanjangan otomatis dan paket prabayar. Untuk informasi selengkapnya, lihat panduan integrasi.

Langkah Migrasi

Mengupdate Library Layanan Penagihan Google Play

Ganti dependensi Library Layanan Penagihan Play yang ada dengan versi yang sudah diupdate ke file build.gradle aplikasi Anda.

dependencies {
    def billingVersion = "5.0.0"

    implementation "com.android.billingclient:billing:$billingVersion"
}

Project Anda akan langsung di-build, meskipun Anda belum mengubah panggilan apa pun ke metode, karena kami telah mem-build kompatibilitas mundur di Library Layanan Penagihan Play 5. Namun, konsep SKU dianggap tidak digunakan lagi.

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 dengan QueryProductDetailsParams
  • Ganti panggilan BillingClient.querySkuDetailsAsync() untuk menggunakan BillingClient.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)

billingClient.querySkuDetailsAsync(params.build()) {
    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);

billingClient.querySkuDetailsAsync(params.build(),
    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)

billingClient.queryProductDetailsAsync(params.build()) {
    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 sebelumnya. Produk pembelian satu kali yang tersedia juga ditransfer ke objek ProductDetails. Detail penawaran produk pembelian satu kali dapat diakses dengan metode getOneTimePurchaseOfferDetails().

Meluncurkan alur pembelian penawaran

Meluncurkan alur pembelian untuk penawaran sangat mirip dengan meluncurkan alur untuk SKU. Untuk memulai permintaan pembelian menggunakan versi 5, lakukan hal berikut:

  • Gunakan ProductDetailsParams, bukan SkuDetails untuk BillingFlowParams.
  • 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 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 = ...;
// Retrieve a value for "productDetails" by calling queryProductDetailsAsync()
// Get the offerToken of the selected offer
val offerToken = productDetails.subscriptionOfferDetails?.get(selectedOfferIndex)?.offerToken

val productDetailsParamsList =
    listOf(
        BillingFlowParams.ProductDetailsParams.newBuilder()
            .setProductDetails(productDetails)
            .setOfferToken(offerToken)
            .build()
    )
val billingFlowParams =
    BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .build()

// Launch the billing flow
val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

Java

// Retrieve a value for "productDetails" by calling queryProductDetailsAsync()
// Get the offerToken of the selected offer
String offerToken = productDetails
                     .getSubscriptionOfferDetails()
                     .get(selectedOfferIndex)
                     .getOfferToken();
// Set the parameters for the offer that will be presented
// in the billing flow creating separate productDetailsParamsList variable
ImmutableList<ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
                 ProductDetailsParams.newBuilder()
                     .setProductDetails(productDetails)
                     .setOfferToken(offerToken)
                     .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 5 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 ke queryPurchasesAsync(), teruskan objek QueryPurchasesParams yang berisi nilai BillingClient.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,
                List<Purchase> 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 langganan

Jika Anda memiliki komponen pengelolaan status langganan di backend yang memeriksa status dan mengelola pembelian langganan, Anda harus menggunakan Subscription Purchases API. Untuk mengetahui detail tentang perubahan dari versi sebelumnya, lihat panduan untuk fitur langganan baru bulan Mei 2022.