Menganalisis pengabaian pembelian produk di Layanan Penagihan Play

1. Pengantar

Dalam codelab ini, Anda akan berfokus pada pembuatan produk sekali beli, mengintegrasikan aplikasi dengan Play Billing Library (PBL), dan menganalisis alasan pembatalan pembelian.

Penonton

Codelab ini ditujukan untuk developer aplikasi Android yang menggunakan Play Billing Library (PBL) atau ingin menggunakan PBL untuk memonetisasi produk sekali beli mereka.

Yang akan Anda pelajari ...

  • Cara membuat produk sekali beli di Konsol Google Play.
  • Cara mengintegrasikan aplikasi Anda dengan PBL.
  • Cara memproses pembelian produk sekali beli habis pakai dan tidak habis pakai di PBL.
  • Cara menganalisis pengabaian pembelian.

Yang Anda butuhkan ...

2. Mem-build aplikasi contoh

Aplikasi contoh dirancang sebagai aplikasi Android yang berfungsi penuh dan memiliki kode sumber lengkap yang menunjukkan aspek berikut:

  • Mengintegrasikan aplikasi dengan PBL
  • Mengambil produk sekali beli
  • Meluncurkan alur pembelian untuk produk sekali beli
  • Skenario pembelian yang menghasilkan respons penagihan berikut:
    • BILLING_UNAVAILABLE
    • USER_CANCELLED
    • OK
    • ITEM_ALREADY_OWNED

Video demo berikut menunjukkan tampilan dan perilaku aplikasi contoh setelah di-deploy dan dijalankan.

Prasyarat

Sebelum Anda membuat dan men-deploy aplikasi contoh, lakukan hal berikut:

Build

Tujuan dari langkah build ini adalah untuk membuat file Android App Bundle bertanda tangan dari aplikasi contoh.

Untuk membuat app bundle Android, lakukan langkah-langkah berikut:

  1. Download aplikasi contoh dari GitHub.
  2. Bangun aplikasi contoh. Sebelum membangun, ubah nama paket aplikasi contoh, lalu bangun. Jika Anda memiliki paket aplikasi lain di Konsol Play, pastikan nama paket yang Anda berikan untuk aplikasi contoh unik.

    Catatan: Mem-build aplikasi contoh hanya akan membuat file APK yang dapat Anda gunakan untuk pengujian lokal. Namun, menjalankan aplikasi tidak akan mengambil produk dan harga karena produk belum dikonfigurasi di Konsol Play yang akan Anda lakukan lebih lanjut dalam codelab ini.
  3. Buat Android App Bundle yang ditandatangani.
    1. Membuat keystore dan kunci upload
    2. Menandatangani aplikasi dengan kunci upload
    3. Mengonfigurasi Penandatanganan Aplikasi Play

Langkah berikutnya adalah mengupload Android app bundle ke Konsol Google Play.

3. Membuat produk sekali beli di Konsol Play

Untuk membuat produk sekali beli di Konsol Google Play, Anda harus memiliki aplikasi di Konsol Play. Buat aplikasi di Konsol Play, lalu upload app bundle bertanda tangan yang dibuat sebelumnya.

Buat aplikasi

Untuk membuat aplikasi:

  1. Login ke Konsol Google Play menggunakan akun developer Anda.
  2. Klik Buat aplikasi. Tindakan ini akan membuka halaman Buat aplikasi.
  3. Masukkan nama aplikasi, pilih bahasa default, dan detail terkait aplikasi lainnya.
  4. Klik Buat aplikasi. Tindakan ini akan membuat aplikasi di Konsol Google Play.

Sekarang Anda dapat mengupload app bundle yang ditandatangani dari aplikasi contoh.

Upload app bundle yang ditandatangani

  1. Upload app bundle yang ditandatangani ke jalur pengujian internal Konsol Google Play. Setelah mengupload, Anda dapat mengonfigurasi fitur terkait monetisasi di Konsol Play.
  2. Klik Uji dan rilis > Pengujian > Rilis internal > Buat rilis baru.
  3. Masukkan nama rilis dan upload file paket aplikasi yang ditandatangani.
  4. Klik Berikutnya, lalu klik Simpan dan publikasikan.

Sekarang, Anda dapat membuat produk sekali beli.

Membuat produk sekali beli

Untuk membuat produk sekali beli:

  1. Di Konsol Google Play, dari menu navigasi kiri, buka Monetisasi dengan Play > Produk > Produk sekali beli.
  2. Klik Buat produk sekali beli.
  3. Masukkan detail produk berikut:
    • ID Produk: Masukkan ID produk unik. Masukkan one_time_product_01.
    • (Opsional) Tag: Tambahkan tag yang relevan.
    • Nama: Masukkan nama produk. Misalnya, Product name.
    • Deskripsi: Masukkan deskripsi produk. Misalnya, Product description.
    • (Opsional) Tambahkan gambar Ikon: Upload ikon yang mewakili produk Anda.
    Catatan: Untuk tujuan codelab ini, Anda dapat melewati konfigurasi bagian Pajak, kepatuhan, dan program.
  4. Klik Berikutnya.
  5. Tambahkan opsi pembelian dan konfigurasikan ketersediaan regionalnya. Produk sekali beli memerlukan setidaknya satu opsi pembelian, yang menentukan cara pemberian hak, harganya, dan ketersediaan regional. Untuk codelab ini, kita akan menambahkan opsi Beli standar untuk produk.Di bagian Opsi pembelian, masukkan detail berikut:
    • ID Opsi Pembelian: Masukkan ID opsi pembelian. Misalnya, buy.
    • Jenis pembelian: Pilih Beli.
    • (Opsional) Tag: Tambahkan tag khusus untuk opsi pembelian ini.
    • (Opsional) Klik Advanced options untuk mengonfigurasi opsi lanjutan. Untuk tujuan codelab ini, Anda dapat melewati konfigurasi opsi lanjutan.
  6. Di bagian Ketersediaan dan harga, klik Tetapkan harga > Edit harga secara massal.
  7. Pilih opsi Negara / wilayah. Tindakan ini akan memilih semua wilayah.
  8. Klik Lanjutkan. Tindakan ini akan membuka dialog untuk memasukkan harga. Masukkan 10 USD, lalu klik Terapkan.
  9. Klik Simpan, lalu klik Aktifkan. Tindakan ini akan membuat dan mengaktifkan opsi pembelian.

Untuk tujuan codelab ini, buat 3 produk sekali beli tambahan dengan ID produk berikut:

  • consumable_product_01
  • consumable_product_02
  • consumable_product_03

Aplikasi contoh dikonfigurasi untuk menggunakan ID produk ini. Anda dapat memberikan ID produk yang berbeda, dalam hal ini, Anda harus mengubah aplikasi contoh untuk menggunakan ID produk yang telah Anda berikan.

Buka aplikasi contoh di Konsol Google Play, lalu buka Monetisasi dengan Play > Produk > Produk sekali beli. Kemudian, klik Buat produk sekali beli dan ulangi langkah 3 hingga 9.

Video pembuatan produk sekali beli

Contoh video berikut menunjukkan langkah-langkah pembuatan produk satu kali yang dijelaskan sebelumnya.

4. Berintegrasi dengan PBL

Sekarang, kita akan melihat cara mengintegrasikan aplikasi Anda dengan Play Billing Library (PBL). Bagian ini menjelaskan langkah-langkah umum untuk integrasi dan memberikan cuplikan kode untuk setiap langkah. Anda dapat menggunakan cuplikan ini sebagai panduan untuk menerapkan integrasi yang sebenarnya.

Untuk mengintegrasikan aplikasi Anda dengan PBL, lakukan langkah-langkah berikut:

  1. Tambahkan dependensi Play Billing Library ke contoh aplikasi.
    dependencies {
    val billing_version = "8.0.0"
    
    implementation("com.android.billingclient:billing-ktx:$billing_version")
    }
    
  2. Lakukan inisialisasi BillingClient. BillingClient adalah SDK klien yang ada di aplikasi Anda dan berkomunikasi dengan Library Layanan Penagihan Play. Cuplikan kode berikut menunjukkan cara menginisialisasi klien penagihan.
    protected BillingClient createBillingClient() {
    return BillingClient.newBuilder(activity)
        .setListener(purchasesUpdatedListener)
        .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
        .enableAutoServiceReconnection()
        .build();
    }
    
  3. Hubungkan ke Google Play.Cuplikan kode berikut menunjukkan cara menghubungkan ke Google Play.
    public void startBillingConnection(ImmutableList<Product> productList) {
    Log.i(TAG, "Product list sent: " + productList);
    Log.i(TAG, "Starting connection");
    billingClient.startConnection(
        new BillingClientStateListener() {
          @Override
          public void onBillingSetupFinished(BillingResult billingResult) {
            if (billingResult.getResponseCode() == BillingResponseCode.OK) {
              // Query product details to get the product details list.
              queryProductDetails(productList);
            } else {
              // BillingClient.enableAutoServiceReconnection() will retry the connection on
              // transient errors automatically.
              // We don't need to retry on terminal errors (e.g., BILLING_UNAVAILABLE,
              // DEVELOPER_ERROR).
              Log.e(TAG, "Billing connection failed: " + billingResult.getDebugMessage());
              Log.e(TAG, "Billing response code: " + billingResult.getResponseCode());
            }
          }
    
          @Override
          public void onBillingServiceDisconnected() {
            Log.e(TAG, "Billing Service connection lost.");
          }
        });
    }
    
  4. Ambil detail produk sekali beli.Setelah mengintegrasikan aplikasi Anda dengan PBL, Anda harus mengambil detail produk sekali beli ke dalam aplikasi Anda. Cuplikan kode berikut menunjukkan cara mengambil detail produk sekali beli di aplikasi Anda.
    private void queryProductDetails(ImmutableList<Product> productList) {
    Log.i(TAG, "Querying products for: " + productList);
    QueryProductDetailsParams queryProductDetailsParams =
        QueryProductDetailsParams.newBuilder().setProductList(productList).build();
    billingClient.queryProductDetailsAsync(
        queryProductDetailsParams,
        new ProductDetailsResponseListener() {
          @Override
          public void onProductDetailsResponse(
              BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) {
            // check billingResult
            Log.i(TAG, "Billing result after querying: " + billingResult.getResponseCode());
            // process returned productDetailsList
            Log.i(
                TAG,
                "Print unfetched products: " + productDetailsResponse.getUnfetchedProductList());
            setupProductDetailsMap(productDetailsResponse.getProductDetailsList());
            billingServiceClientListener.onProductDetailsFetched(productDetailsMap);
          }
        });
    }
    
    Mengambil ProductDetails, akan memberikan respons yang mirip dengan berikut ini:
    {
        "productId": "consumable_product_01",
        "type": "inapp",
        "title": "Shadow Coat (Yolo's Realm | Play Samples)",
        "name": "Shadow Coat",
        "description": "A sleek, obsidian coat for stealth and ambushes",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 1990000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$1.99",
                "offerIdToken": "<--offerIdToken-->",
                "purchaseOptionId": "buy",
                "offerTags": []
            }
        ]
    },
    {
        "productId": "consumable_product_02",
        "type": "inapp",
        "title": "Emperor Den (Yolo's Realm | Play Samples)",
        "name": "Emperor Den",
        "description": "A fair lair glowing with molten rock and embers",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 2990000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$2.99",
                "offerIdToken": "<--offerIdToken-->",
                "purchaseOptionId": "buy",
                "offerTags": []
            }
        ]
    }
    
  5. Mulai alur penagihan.
    public void launchBillingFlow(String productId) {
    ProductDetails productDetails = productDetailsMap.get(productId);
    if (productDetails == null) {
      Log.e(
          TAG, "Cannot launch billing flow: ProductDetails not found for productId: " + productId);
      billingServiceClientListener.onBillingResponse(
          BillingResponseCode.ITEM_UNAVAILABLE,
          BillingResult.newBuilder().setResponseCode(BillingResponseCode.ITEM_UNAVAILABLE).build());
      return;
    }
    ImmutableList<ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            ProductDetailsParams.newBuilder().setProductDetails(productDetails).build());
    
    BillingFlowParams billingFlowParams =
        BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(productDetailsParamsList)
            .build();
    
    billingClient.launchBillingFlow(activity, billingFlowParams);
    }
    
  6. Mendeteksi dan memproses pembelian. Sebagai bagian dari langkah ini, Anda perlu:
    1. Verifikasi pembelian.
    2. Memberikan hak kepada pengguna
    3. Memberi tahu pengguna
    4. Memberi tahu Google tentang proses pembelian
    Dari langkah-langkah tersebut, langkah a, b, dan c harus dilakukan di backend Anda, sehingga tidak termasuk dalam cakupan codelab ini.Cuplikan berikut menunjukkan cara memberi tahu Google untuk produk sekali beli yang dapat digunakan:
    private void handlePurchase(Purchase purchase) {
    // Step 1: Send the purchase to your secure backend to verify the purchase following
    // https://developer.android.com/google/play/billing/security#verify
    
    // Step 2: Update your entitlement storage with the purchase. If purchase is
    // in PENDING state then ensure the entitlement is marked as pending and the
    // user does not receive benefits yet. It is recommended that this step is
    // done on your secure backend and can combine in the API call to your
    // backend in step 1.
    
    // Step 3: Notify the user using appropriate messaging.
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
      for (String product : purchase.getProducts()) {
        Log.d(TAG, product + " purchased successfully! ");
      }
    }
    
    // Step 4: Notify Google the purchase was processed.
    // For one-time products, acknowledge the purchase.
    // This sample app (client-only) uses billingClient.acknowledgePurchase().
    // For consumable one-time products, consume the purchase
    // This sample app (client-only) uses billingClient.consumeAsync()
    // If you have a secure backend, you must acknowledge purchases on your server using the
    // server-side API.
    // See https://developer.android.com/google/play/billing/security#acknowledge
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED && !purchase.isAcknowledged()) {
    
      if (shouldConsume(purchase)) {
        ConsumeParams consumeParams =
            ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();
        billingClient.consumeAsync(consumeParams, consumeResponseListener);
    
      } else {
        AcknowledgePurchaseParams acknowledgePurchaseParams =
            AcknowledgePurchaseParams.newBuilder()
                .setPurchaseToken(purchase.getPurchaseToken())
                .build();
        billingClient.acknowledgePurchase(
            acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
      }
     }
    }
    

5. Menganalisis pengabaian pembelian

Sejauh ini dalam codelab, respons Play Billing berfokus pada skenario terbatas seperti respons USER_CANCELLED, BILLING_UNAVAILABLE, OK, dan ITEM_ALREADY_OWNED. Namun, Penagihan Play dapat menampilkan 13 kode respons yang berbeda yang dapat dipicu oleh berbagai faktor dunia nyata.

Bagian ini menjelaskan penyebab respons error USER_CANCELLED dan BILLING_UNAVAILABLE serta menyarankan kemungkinan tindakan perbaikan yang dapat Anda lakukan.

Kode error respons USER_CANCELED

Kode respons ini menunjukkan bahwa pengguna telah keluar dari UI alur pembelian sebelum menyelesaikan pembelian.

Kemungkinan penyebab

Tindakan apa yang dapat Anda lakukan?

  • Dapat menunjukkan pengguna dengan niat rendah yang sensitif terhadap harga.
  • Pembelian tertunda atau pembayaran ditolak.

Kode error respons BILLING_UNAVAILABLE

Kode respons ini berarti pembelian tidak dapat diselesaikan karena ada masalah pada penyedia pembayaran pengguna atau metode pembayaran yang dipilihnya. Misalnya, masa berlaku kartu kredit pengguna telah berakhir atau pengguna berada di negara yang tidak didukung. Kode ini tidak menunjukkan adanya error pada sistem Penagihan Play itu sendiri.

Kemungkinan penyebab

Tindakan apa yang dapat Anda lakukan?

  • Aplikasi Play Store di perangkat pengguna belum diupdate.
  • Pengguna berada di negara tempat Play tidak didukung.
  • Pengguna tersebut adalah pengguna versi bisnis, dan administrator perusahaan mereka telah menonaktifkan pengguna agar tidak melakukan pembelian.
  • Google Play tidak dapat menagih metode pembayaran pengguna. Misalnya, masa berlaku kartu kredit pengguna mungkin telah berakhir.
  • Memantau tren masalah sistem dan di wilayah tertentu
  • Pertimbangkan untuk bermigrasi ke PBL 8 karena mendukung kode sub-respons PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS yang lebih terperinci. Jika Anda mendapatkan kode respons ini, pertimbangkan untuk memberi tahu pengguna tentang kegagalan tersebut atau menyarankan metode pembayaran alternatif.
  • Kode respons ini dirancang untuk percobaan ulang, sehingga Anda dapat menerapkan strategi percobaan ulang yang sesuai.
    Percobaan ulang otomatis kemungkinan tidak akan membantu dalam kasus ini. Namun, percobaan ulang manual dapat membantu jika pengguna mengatasi kondisi yang menyebabkan masalah tersebut. Misalnya, jika pengguna mengupdate versi Play Store ke versi yang didukung, percobaan ulang manual operasi awal dapat berfungsi.

    Jika Anda mendapatkan kode respons ini saat pengguna tidak berada dalam sesi, percobaan ulang mungkin bukan hal yang umum dilakukan. Saat Anda menerima respons `BILLING_UNAVAILABLE` sebagai hasil dari alur pembelian, kemungkinan besar pengguna menerima masukan dari Google Play selama proses pembelian dan mungkin mengetahui error yang terjadi. Dalam hal ini, Anda dapat menampilkan pesan error yang menjelaskan error yang terjadi dan menawarkan tombol `Coba lagi` untuk memberi pengguna opsi percobaan ulang manual setelah mereka mengatasi masalah.

Strategi percobaan ulang untuk kode error respons

Strategi coba lagi yang efektif untuk error yang dapat dipulihkan dari Play Billing Library (PBL) bervariasi berdasarkan konteks seperti interaksi pengguna dalam sesi (seperti selama pembelian) versus operasi latar belakang (seperti kueri pembelian saat aplikasi dilanjutkan). Penting untuk menerapkan strategi ini karena nilai BillingResponseCode tertentu menandakan masalah sementara yang dapat diselesaikan dengan mencoba lagi, sementara nilai lainnya bersifat permanen dan tidak memerlukan percobaan ulang.

Untuk error yang terjadi saat pengguna berada dalam sesi, sebaiknya gunakan strategi percobaan ulang sederhana dengan jumlah maksimum upaya yang ditetapkan untuk meminimalkan gangguan pada pengalaman pengguna. Sebaliknya, untuk operasi latar belakang seperti mengonfirmasi pembelian baru, yang tidak memerlukan eksekusi segera, backoff eksponensial adalah pendekatan yang direkomendasikan.

Untuk mengetahui informasi mendetail tentang kode respons tertentu dan strategi percobaan ulang yang direkomendasikan yang sesuai, lihat Menangani kode respons BillingResult.

6. Langkah berikutnya

Dokumen referensi

7. Selamat!

Selamat! Anda telah berhasil menjelajahi Konsol Google Play untuk membuat produk sekali beli baru, menguji kode respons penagihan, dan menganalisis penurunan pembelian.

Survei

Masukan Anda tentang codelab ini sangat kami hargai. Luangkan waktu beberapa menit untuk mengisi survei kami.