Panduan integrasi dalam aplikasi untuk penagihan alternatif dengan pilihan pengguna

Panduan ini menjelaskan cara mengintegrasikan API untuk menawarkan penagihan alternatif dengan pilihan pengguna di aplikasi Anda.

Penyiapan Play Billing Library

Tambahkan dependensi Play Billing Library ke aplikasi Android. Untuk menggunakan API penagihan alternatif, Anda harus menggunakan versi 5.2 atau yang lebih tinggi. Jika Anda perlu bermigrasi dari versi sebelumnya, ikuti petunjuk dalam panduan migrasi sebelum Anda mencoba menerapkan penagihan alternatif.

Menghubungkan ke Google Play

Langkah-langkah pertama dalam proses integrasi sama dengan langkah-langkah yang dijelaskan di Panduan integrasi Layanan Penagihan Google Play, dengan beberapa modifikasi saat melakukan inisialisasi BillingClient Anda:

  • Anda perlu memanggil metode baru untuk menunjukkan bahwa Anda ingin menawarkan pilihan opsi penagihan kepada pengguna: enableUserChoiceBilling.
  • Anda harus mendaftarkan UserChoiceBillingListener untuk menangani kasus ketika pengguna memilih penagihan alternatif.

Contoh berikut menunjukkan inisialisasi BillingClient dengan modifikasi ini:

Kotlin

val purchasesUpdatedListener =
   PurchasesUpdatedListener { billingResult, purchases ->
       // Handle new Google Play purchase.
   }

val userChoiceBillingListener =
   UserChoiceBillingListener { userChoiceDetails ->
       // Handle alternative billing choice.
   }

var billingClient = BillingClient.newBuilder(context)
   .setListener(purchasesUpdatedListener)
   .enablePendingPurchases()
   .enableUserChoiceBilling(userChoiceBillingListener)
   .build()

Java

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // Handle new Google Play purchase.
    }
};

private UserChoiceBillingListener userChoiceBillingListener = new UserChoiceBillingListener() {
    @Override
    public void userSelectedAlternativeBilling(
        UserChoiceDetails userChoiceDetails) {
        // Handle new Google Play purchase.
    }
};

private BillingClient billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases()
    .enableUserChoiceBilling(userChoiceBillingListener)
    .build();

Setelah melakukan inisialisasi BillingClient, Anda harus menghubungkan ke Google Play seperti yang dijelaskan dalam panduan integrasi.

Menampilkan produk yang tersedia

Anda dapat menampilkan produk yang tersedia kepada pengguna dengan cara yang sama seperti integrasi sistem Layanan penagihan Google Play. Setelah pengguna melihat produk yang tersedia untuk dibeli dan memilih produk yang akan dibeli, luncurkan alur penagihan sesuai pilihan pengguna seperti yang dijelaskan di bagian berikut.

Meluncurkan alur penagihan sesuai pilihan pengguna

Luncurkan alur penagihan sesuai pilihan pengguna dengan memanggil launchBillingFlow(). Cara kerjanya sama seperti meluncurkan alur pembelian dengan integrasi sistem Layanan penagihan Google Play: Anda memberikan instance ProductDetails dan offerToken yang sesuai dengan produk dan penawaran yang ingin didapatkan pengguna. Jika pengguna memilih sistem penagihan Google Play, informasi ini akan digunakan untuk melanjutkan alur pembelian.

Saat developer memanggil launchBillingFlow(), sistem Layanan penagihan Google Play akan menjalankan pemeriksaan berikut:

  • Sistem akan memeriksa apakah negara Google Play pengguna adalah negara yang mendukung penagihan alternatif dengan pilihan pengguna (yaitu negara yang didukung). Jika negara Google Play pengguna didukung, Google Play akan memeriksa apakah penagihan alternatif telah diaktifkan berdasarkan konfigurasi BillingClient.
    • Jika penagihan alternatif dengan pilihan pengguna telah diaktifkan, alur pembelian akan menampilkan UX pilihan pengguna.
    • Jika penagihan alternatif dengan pilihan pengguna tidak diaktifkan, alur pembelian akan menampilkan UX sistem layanan penagihan Google Play standar, tanpa pilihan pengguna.
  • Jika negara Google Play pengguna bukan negara yang didukung, alur pembelian akan menampilkan UX sistem layanan penagihan Google Play standar, tanpa pilihan pengguna.

Negara Play pengguna adalah negara yang didukung

Negara Play pengguna bukan negara yang didukung

enableUserChoiceBilling dipanggil selama penyiapan BillingClient

Pengguna melihat UX pilihan pengguna

Pengguna melihat UX sistem penagihan Google Play standar

enableUserChoiceBilling tidak dipanggil selama penyiapan BillingClient

Pengguna melihat UX sistem penagihan Google Play standar

Pengguna melihat UX sistem penagihan Google Play standar

Menangani pilihan pengguna

Cara Anda menangani alur pembelian lainnya berbeda-beda bergantung pada apakah pengguna memilih sistem penagihan Google Play atau sistem penagihan alternatif.

Saat pengguna memilih sistem penagihan alternatif

Jika pengguna memilih sistem penagihan alternatif, Google Play akan memanggil UserChoiceBillingListener untuk memberi tahu aplikasi bahwa aplikasi perlu meluncurkan alur pembelian dalam sistem penagihan alternatif. Secara khusus, metode userSelectedAlternativeBilling() dipanggil.

Token transaksi eksternal yang diberikan dalam objek UserChoiceDetails mewakili tanda tangan bagi pilihan pengguna untuk memasuki alur penagihan alternatif. Gunakan token ini untuk melaporkan transaksi apa pun yang dihasilkan dari pilihan ini, seperti yang dijelaskan dalam panduan integrasi backend.

UserChoiceBillingListener harus melakukan tindakan berikut:

  • Mendapatkan produk yang dibeli oleh pengguna sehingga dapat ditampilkan dalam alur pembelian di sistem penagihan alternatif.
  • Mengumpulkan string yang diterima sebagai token transaksi eksternal dan kirimkan ke backend Anda untuk mempertahankannya. Nantinya, ini akan digunakan untuk melaporkan transaksi eksternal ke Google Play jika pengguna menyelesaikan pembelian khusus ini.
  • Meluncurkan alur pembelian alternatif developer.

Jika pengguna menyelesaikan pembelian menggunakan sistem penagihan alternatif, Anda harus melaporkan transaksi ke Google Play dengan memanggil Google Play Developer API dari backend Anda dalam waktu 24 jam, dengan memberikan externalTransactionToken dan detail transaksi tambahan. Lihat panduan integrasi backend untuk detail selengkapnya.

Contoh berikut menunjukkan cara menerapkan UserChoiceBillingListener:

Kotlin

private val userChoiceBillingListener =
    UserChoiceBillingListener { userChoiceDetails ->
        // Get the products being purchased by the user.
        val products = userChoiceDetails.products

        // Send external transaction token to developer backend server
        // this devBackend object is for demonstration purposes,
        // developers can implement this step however best fits their
        // app to backend communication.
        devBackend.sendExternalTransactionStarted(
            userChoiceDetails.externalTransactionToken,
            user
        )

        // Launch alternative billing
        // ...
        // The developer backend handles reporting the transaction
        // to Google Play's backend once the alternative billing
        // purchase is completed.
    }

Java

private userChoiceBillingListener userChoiceBillingListener = new UserChoiceBillingListener() {
    @Override
    public void userSelectedAlternativeBilling(
           UserChoiceDetails userChoiceDetails) {
       // Get the products being purchased by the user.
       List<Product> products =
              userChoiceDetails.getProducts();

       // Send external transaction token to developer backend server
       // this devBackend object is for demonstration purposes,
       // developers can implement this step however best fits their
       // app to backend communication.
       devBackend.sendExternalTransactionStarted(
              userChoiceDetails.getExternalTransactionToken(),
              user
       );

       // Launch alternative billing
       // ...
       // The developer backend handles reporting the transaction
       // to Google Play's backend once the alternative billing
       // purchase is completed.
    }
};

Saat pengguna memilih sistem penagihan Google Play

Jika pengguna memilih sistem penagihan Google Play, mereka akan melanjutkan pembelian melalui Google Play.

  • Lihat Memproses pembelian dalam panduan integrasi library untuk mengetahui informasi lebih lanjut tentang cara menangani pembelian dalam aplikasi baru melalui sistem penagihan Google Play.
  • Lihat Langganan baru dalam panduan pengelolaan langganan untuk mendapatkan panduan tambahan tentang pembelian langganan.

Menangani perubahan pada langganan

Untuk developer yang menggunakan penagihan alternatif dengan pilihan pengguna, pembelian harus diproses melalui sistem penagihan Google Play atau dilaporkan dengan externalTransactionId, bergantung pada pilihan pengguna. Perubahan pada langganan yang ada dan diproses melalui alur pilihan pengguna dapat dilakukan melalui sistem penagihan yang sama hingga masa berlakunya habis.

Bagian ini menjelaskan cara menangani beberapa skenario perubahan langganan yang umum.

Alur upgrade dan downgrade

Perubahan paket langganan termasuk alur upgrade dan downgrade harus ditangani secara berbeda, bergantung pada apakah langganan awalnya dibeli melalui sistem penagihan Google Play atau melalui sistem penagihan alternatif.

Add-on yang bergantung pada langganan yang sudah ada, memiliki metode pembayaran yang sama, dan menyelaraskan tagihan berulang ditangani sebagai upgrade. Untuk add-on lainnya, pengguna harus dapat memilih sistem penagihan yang ingin mereka gunakan. Mulai pengalaman pembelian baru dengan menggunakan launchBillingFlow(), seperti yang dijelaskan dalam Meluncurkan alur penagihan sesuai pilihan pengguna.

Langganan yang dibeli melalui sistem penagihan alternatif

Untuk langganan yang awalnya dibeli melalui sistem penagihan alternatif developer setelah pilihan pengguna, pengguna yang meminta upgrade atau downgrade harus melanjutkan melalui sistem penagihan alternatif developer tanpa melalui pengalaman pilihan pengguna lagi.

Untuk melakukannya, panggil launchBillingFlow() saat pengguna meminta upgrade atau downgrade. Gunakan setOriginalExternalTransactionId, bukan menetapkan objek SubscriptionUpdateParams dalam parameter, untuk memberikan ID transaksi eksternal bagi pembelian asli. Cara ini tidak menampilkan layar pilihan pengguna, dikarenakan pilihan pengguna untuk pembelian asli dipertahankan untuk upgrade dan downgrade. Dalam skenario ini, panggilan ke launchBillingFlow() menghasilkan token transaksi eksternal baru untuk transaksi yang dapat Anda ambil dari callback.

Kotlin

// The external transaction ID from the current
// alternative billing subscription.
val externalTransactionId = //... ;

val billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(
        listOf(
            BillingFlowParams.ProductDetailsParams.newBuilder()
                // Fetched via queryProductDetailsAsync.
                .setProductDetails(productDetailsNewPlan)
                // offerIdToken can be found in
                // ProductDetails=>SubscriptionOfferDetails.
                .setOfferToken(offerTokenNewPlan)
                .build()
        )
    )
    .setSubscriptionUpdateParams(
        BillingFlowParams.SubscriptionUpdateParams.newBuilder()
            .setOriginalExternalTransactionId(externalTransactionId)
            .build()

val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

// When the user selects the alternative billing flow,
// the UserChoiceBillingListener is triggered.

Java

// The external transaction ID from the current
// alternative billing subscription.
String externalTransactionId = //... ;

BillingFlowParams billingFlowParams =
        BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(
                ImmutableList.of(
                    ProductDetailsParams.newBuilder()
                        // Fetched via queryProductDetailsAsync.
                        .setProductDetails(productDetailsNewPlan)
                        // offerIdToken can be found in
                        // ProductDetails=>SubscriptionOfferDetails
                        .setOfferToken(offerTokenNewPlan)
                    .build()
                )
            )
            .setSubscriptionUpdateParams(
                SubscriptionUpdateParams.newBuilder()
                    .setOriginalExternalTransactionId(externalTransactionId)
                    .build()
            )
            .build();

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

// When the user selects the alternative billing flow,
// the UserChoiceBillingListener is triggered.

Setelah upgrade atau downgrade dilakukan dalam sistem penagihan alternatif, Anda harus melaporkan transaksi baru menggunakan token transaksi eksternal yang diperoleh melalui panggilan sebelumnya untuk pembelian langganan baru.

Langganan yang dibeli melalui sistem penagihan Google Play

Demikian pula, pengguna yang membeli langganan mereka saat ini melalui sistem penagihan Google Play setelah pilihan pengguna akan melihat alur upgrade atau downgrade di sistem penagihan Google Play. Petunjuk berikut menjelaskan cara meluncurkan alur pembelian untuk upgrade atau downgrade melalui sistem penagihan Google Play:

  1. Identifikasi offerToken dari penawaran yang dipilih untuk paket baru:

val offerTokenNewPlan = productDetailsNewPlan
             .getSubscriptionOfferDetails(selectedOfferIndex)
             .getOfferToken()

String offerTokenNewPlan = productDetailsNewPlan
                     .getSubscriptionOfferDetails(selectedOfferIndex)
                     .getOfferToken();

  1. Kirim informasi yang benar ke sistem penagihan Google Play untuk memproses pembelian baru, termasuk token pembelian untuk langganan yang ada:

val billingFlowParams =
    BillingFlowParams.newBuilder().setProductDetailsParamsList(
        listOf(
            BillingFlowParams.ProductDetailsParams.newBuilder()
                .setProductDetails(productDetailsNewPlan)
                .setOfferToken(offerTokenNewPlan)
                .build()
        )
    )
    .setSubscriptionUpdateParams(
        BillingFlowParams.SubscriptionUpdateParams.newBuilder()
            .setOldPurchaseToken(oldToken)
            .setReplaceProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_FULL_PRICE)
            .build()
        )
        .build()

BillingClient.launchBillingFlow(activity, billingFlowParams)

BillingFlowParams billingFlowParams =
        BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(
                ImmutableList.of(
                    ProductDetailsParams.newBuilder()
                        // Fetched via queryProductDetailsAsync
                        .setProductDetails(productDetailsNewPlan)
                        // offerIdToken can be found in
                        // ProductDetails=>SubscriptionOfferDetails.
                        .setOfferToken(offerTokenNewPlan)
                        .build()
                )
            )
            .setSubscriptionUpdateParams(
                SubscriptionUpdateParams.newBuilder()
                    // purchaseToken can be found in
                    // Purchase#getPurchaseToken
                    .setOldPurchaseToken("old_purchase_token")
                    .setReplaceProrationMode(ProrationMode.IMMEDIATE_AND_CHARGE_FULL_PRICE)
                    .build()
            )
            .build();

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

Pembelian ini dilanjutkan di sistem penagihan Google Play, dan aplikasi Anda akan menerima panggilan PurchasesUpdatedListener.onPurchaseUpdated dengan hasil pembelian. Jika pembelian berhasil, metode onPurchaseUpdated() juga menerima informasi pembelian baru, dan backend Anda akan menerima Notifikasi Developer Real Time SUBSCRIPTION_PURCHASED. Saat mengambil status untuk pembelian baru, atribut linkedPurchaseToken akan ditautkan ke pembelian langganan lama, sehingga Anda dapat menghentikannya seperti yang direkomendasikan.

Pembatalan dan pemulihan langganan

Pengguna harus dapat membatalkan langganan mereka kapan saja. Saat pengguna membatalkan langganan, penghentian hak dapat ditangguhkan hingga periode berbayar berakhir. Misalnya, jika pengguna membatalkan langganan bulanan pada pertengahan bulan, mereka dapat terus mengakses layanan selama sisa ~2 minggu hingga aksesnya dihapus. Selama periode ini, langganan masih aktif secara teknis, sehingga pengguna dapat menggunakan layanan.

Tidak jarang pengguna memutuskan untuk membatalkan pembatalan selama periode aktif ini. Dalam panduan ini, hal ini disebut pemulihan. Bagian berikut menjelaskan cara menangani skenario pemulihan dalam integrasi API penagihan alternatif Anda.

Langganan yang dibeli melalui sistem penagihan alternatif

Jika memiliki ID transaksi eksternal untuk langganan yang dibatalkan, Anda tidak perlu memanggil launchBillingFlow() untuk memulihkan langganan, sehingga tidak boleh digunakan untuk jenis aktivasi ini. Jika pengguna memulihkan langganan mereka saat masih dalam periode aktif langganan yang dibatalkan, tidak ada transaksi yang terjadi pada saat itu. Anda dapat terus melaporkan perpanjangan saat siklus saat ini berakhir dan perpanjangan berikutnya terjadi. Hal ini mencakup kasus saat pengguna menerima kredit atau harga perpanjangan khusus sebagai bagian dari pemulihan (misalnya, promosi untuk mendorong pengguna agar melanjutkan langganannya).

Langganan yang dibeli melalui sistem penagihan Google Play

Umumnya, pengguna dapat memulihkan langganan di sistem penagihan Google Play. Untuk langganan yang dibatalkan yang awalnya dibeli di sistem penagihan Google Play, pengguna dapat memilih untuk mengurungkan pembatalan saat langganan masih aktif melalui fitur Berlangganan lagi Google Play. Dengan begitu, Anda akan menerima Notifikasi Developer Real Time SUBSCRIPTION_RESTARTED di backend Anda, dan token pembelian baru tidak diterbitkan—token asli akan digunakan untuk melanjutkan langganan. Untuk mempelajari cara mengelola pemulihan di sistem penagihan Google Play, lihat Pemulihan di panduan pengelolaan langganan.

Anda juga dapat memicu pemulihan di sistem penagihan Google Play dari aplikasi dengan memanggil launchBillingFlow(). Lihat Sebelum akhir masa berlaku langganan - dalam aplikasi untuk mendapatkan penjelasan tentang cara melakukannya. Dalam kasus pengguna yang melalui alur pilihan pengguna untuk pembelian asli (yang dibatalkan tetapi masih aktif), sistem akan otomatis mendeteksi pilihan pengguna dan menampilkan antarmuka pengguna untuk memulihkan pembelian ini. Mereka diminta untuk mengonfirmasi pembelian kembali langganan melalui Google Play, tetapi tidak perlu melalui alur pilihan pengguna lagi. Dalam hal ini, token pembelian baru akan dikeluarkan untuk pengguna. Backend Anda akan menerima Notifikasi Developer Real Time SUBSCRIPTION_PURCHASED, dan nilai linkedPurchaseToken untuk status pembelian baru akan ditetapkan seperti dalam kasus upgrade atau downgrade, dengan token pembelian lama untuk langganan yang dibatalkan.

Berlangganan lagi

Jika langganan benar-benar berakhir, baik karena pembatalan atau penolakan pembayaran tanpa pemulihan (penangguhan akun yang telah habis masa berlakunya), pengguna harus berlangganan lagi jika ingin memulai ulang hak.

Berlangganan lagi juga dapat diaktifkan melalui aplikasi dengan memprosesnya seperti halnya pendaftaran standar. Pengguna harus dapat memilih sistem penagihan yang ingin mereka gunakan. Dalam kasus ini, launchBillingFlow() dapat dipanggil, seperti yang dijelaskan di Meluncurkan alur penagihan sesuai pilihan pengguna.

Menguji penagihan alternatif

Penguji lisensi harus digunakan untuk menguji integrasi penagihan alternatif Anda. Anda tidak akan ditagih untuk transaksi yang telah dimulai oleh akun penguji lisensi. Lihat Menguji penagihan via Google Play dengan pemberian lisensi aplikasi untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi penguji lisensi.

Langkah berikutnya

Setelah menyelesaikan integrasi dalam aplikasi, Anda siap untuk mengintegrasikan backend.