Menggunakan Penagihan via Google Play dengan AIDL

Anda dapat menggunakan antarmuka Android Interface Definition Language (AIDL) untuk mengimplementasikan beberapa fitur layanan Penagihan Via Google Play.

Membeli Produk

Gambar 1. Urutan dasar untuk permintaan pembelian.

Alur pembelian umum dengan In-app Billing API adalah sebagai berikut:

  1. Aplikasi Anda mengirimkan permintaan isBillingSupported ke Google Play untuk menentukan bahwa versi target Penagihan via Google Play yang Anda gunakan didukung. Permintaan tersebut juga memverifikasi bahwa Google Play mendukung penagihan di negara pengguna.
  2. Saat aplikasi Anda dimulai atau pengguna dalam proses login, sebaiknya periksa Google play untuk menentukan item apa saja yang dimiliki oleh pengguna. Untuk mengkueri pembelian dalam aplikasi pengguna, kirim permintaan getPurchases. Jika permintaan berhasil, Google Play akan menampilkan Bundle yang berisi daftar ID produk dari item yang dibeli, daftar detail pembelian individu, dan daftar tanda tangan untuk pembelian.
  3. Biasanya, Anda disarankan untuk memberi tahu pengguna produk apa saja yang tersedia untuk dibeli. Untuk mengkueri detail produk dalam aplikasi yang Anda tetapkan di Google Play, aplikasi Anda dapat mengirim permintaan getSkuDetails. Anda harus menentukan daftar ID produk dalam permintaan kueri. Jika permintaan berhasil, Google Play akan menampilkan Bundle berisi detail produk termasuk harga, judul, deskripsi, dan jenis pembelian produk.
  4. Jika suatu produk dalam aplikasi tidak dimiliki oleh pengguna, Anda dapat melakukan pembelian untuk aplikasi tersebut. Untuk memulai permintaan pembelian, aplikasi Anda mengirim permintaan getBuyIntent, yang menentukan ID produk dari item yang akan dibeli, bersama dengan parameter lainnya. Anda harus mencatat ID produk saat Anda membuat produk dalam aplikasi baru di Konsol Play.
    1. Google Play menampilkan Bundle berisi PendingIntent yang digunakan aplikasi Anda untuk memulai UI pembayaran untuk pembelian.
    2. Aplikasi Anda meluncurkan intent yang tertunda dengan memanggil metode startIntentSenderForResult.
    3. Saat alur pembayaran selesai (yaitu, saat pengguna berhasil membeli item atau membatalkan pembelian), Google Play mengirimkan respons Intent ke metode onActivityResult Anda. Kode hasil onActivityResult memiliki kode hasil yang menunjukkan apakah pembelian berhasil atau dibatalkan. Intent respons berisi informasi tentang item yang dibeli, termasuk String purchaseToken yang dihasilkan oleh Google Play untuk mengidentifikasi transaksi pembelian ini secara unik. Intent juga berisi tanda tangan pembelian, yang ditandatangani dengan kunci developer pribadi Anda.

Untuk mempelajari lebih lanjut tentang panggilan In-app Billing API dan respons server, lihat Referensi Penagihan via Google Play.

Mengonsumsi Produk dalam Aplikasi

Anda dapat menggunakan mekanisme konsumsi untuk melacak kepemilikan pengguna atas produk yang dikelola.

Semua produk terkelola dikelola di In-app Billing API. Artinya, kepemilikan pengguna atas semua pembelian produk terkelola dikelola oleh Google Play, dan aplikasi Anda dapat mengkueri informasi pembelian pengguna saat diperlukan. Saat pengguna berhasil membeli produk terkelola, pembelian tersebut dicatat di Google Play. Setelah produk terkelola dibeli, produk tersebut dianggap sebagai "dimiliki". Produk terkelola dalam status "dimiliki" tidak dapat dibeli dari Google Play. Anda harus mengirim permintaan konsumsi untuk produk terkelola yang berstatus "dimiliki" sebelum Google Play membuat produk tersebut tersedia untuk pembelian berikutnya. Mengkonsumsi produk terkelola mengembalikannya ke status "tidak dimiliki", dan menghapus data pembelian sebelumnya.

Gambar 2. Urutan dasar untuk permintaan konsumsi.

Untuk mengambil daftar produk yang dimiliki oleh pengguna, aplikasi Anda mengirim panggilan getPurchases ke Google Play. Aplikasi Anda dapat membuat permintaan konsumsi dengan mengirim panggilan consumePurchase. Dalam argumen permintaan, Anda harus menentukan string unik purchaseToken produk terkelola yang Anda peroleh dari Google Play ketika produk dibeli. Google Play menampilkan kode status yang menunjukkan bahwa konsumsi berhasil dicatat.

Produk Terkelola yang Tidak Dapat Dikonsumsi dan Dapat Dikonsumsi

Anda dapat memutuskan untuk menangani produk terkelola sebagai item yang tidak dapat dikonsumsi atau dapat dikonsumsi.

Produk yang tidak dapat dikonsumsi
Biasanya, Anda tidak disarankan untuk mengimplementasikan konsumsi untuk produk terkelola yang hanya dapat dibeli satu kali dalam aplikasi Anda dan memberikan manfaat permanen. Setelah dibeli, produk ini akan secara permanen dikaitkan dengan akun Google pengguna. Contoh produk terkelola yang tidak dapat dikonsumsi adalah upgrade ke versi premium atau paket level.
Produk yang dapat dikonsumsi
Sebaliknya, Anda dapat mengimplementasikan konsumsi bagi produk yang dapat disediakan untuk pembelian beberapa kali. Biasanya, produk ini memberikan efek sementara tertentu. Misalnya, karakter dalam game pengguna mungkin mendapatkan poin nyawa atau mendapatkan koin emas tambahan dalam inventaris mereka. Memberikan manfaat atau efek dari produk yang dibeli dalam aplikasi Anda disebut menyediakan produk terkelola. Anda bertanggung jawab untuk mengontrol dan melacak bagaimana produk terkelola disediakan untuk pengguna.

Penting: Sebelum menyediakan produk terkelola yang dapat dikonsumsi dalam aplikasi Anda, Anda harus mengirim permintaan konsumsi ke Google Play dan menerima respons berhasil yang menunjukkan bahwa konsumsi telah dicatat.

Mengelola pembelian yang dapat dikonsumsi dalam aplikasi Anda

Berikut adalah alur dasar untuk membeli produk terkelola yang dapat dikonsumsi:

  1. Panggil metode getBuyIntent untuk meluncurkan alur pembelian.
  2. Periksa Bundle yang ditampilkan dari Google Play untuk menentukan apakah pembelian berhasil dilakukan atau tidak.
  3. Jika pembelian berhasil, konsumsi pembelian dengan memanggil metode consumePurchase.
  4. Periksa kode respons dari Google Play untuk menentukan apakah konsumsi berhasil diselesaikan.
  5. Jika konsumsi tersebut berhasil, sediakan produk di aplikasi Anda.

Setelah itu, saat pengguna memulai atau login ke aplikasi Anda, Anda harus memeriksa apakah pengguna sudah memiliki produk dalam aplikasi yang dapat dikonsumsi yang belum disediakan; jika ada, pastikan untuk mengonsumsi dan menyediakan item tersebut. Berikut adalah alur startup aplikasi yang disarankan jika Anda mengimplementasikan produk dalam aplikasi yang dapat dikonsumsi pada aplikasi Anda:

  1. Kirim permintaan getPurchases untuk mengkueri produk dalam aplikasi yang dimiliki untuk pengguna.
  2. Jika ada produk dalam aplikasi yang dapat dikonsumsi, konsumsi item tersebut dengan memanggil consumePurchase. Langkah ini diperlukan karena aplikasi mungkin telah menyelesaikan pesanan pembelian untuk produk yang dapat dikonsumsi, tetapi dihentikan atau terputus sebelum aplikasi memiliki kesempatan untuk mengirim permintaan konsumsi.
  3. Periksa kode respons dari Google Play untuk menentukan apakah konsumsi berhasil diselesaikan.
  4. Jika konsumsi tersebut berhasil, sediakan produk di aplikasi Anda.

Mengonfigurasi pembelian produk bonus

Saat bekerja dengan produk bonus menggunakan AIDL, Anda harus meng-cache `Intent` sebelum pengguna mengambil bonus. Anda dapat memanggil intent beli pada thread background dan menyimpan `Intent` respons berhasil hingga pengguna mengambil tindakan untuk mengambil bonus.

Mencantumkan dan memuat SKU

Sebelum menawarkan produk bonus kepada pengguna, dapatkan detail produk dengan memanggil getSkuDetails(). Kolom JSON yang baru, "rewardToken", diisi untuk setiap produk bonus dalam daftar SKU.

Untuk memberikan pengalaman pengguna terbaik, Anda harus memastikan iklan dimuat dan tersedia sebelum menawarkan produk bonus kepada pengguna. Untuk melakukannya, panggil getBuyIntentExtraParams() pada thread background. Setelah Anda menerima respons dari BILLING_RESPONSE_RESULT_OK, aktifkan produk bonus untuk pengguna dan simpan objek PendingIntent yang ditampilkan untuk digunakan nanti. Cuplikan kode berikut menunjukkan proses memuat iklan yang terkait dengan produk bonus:

Kotlin

    val rewardToken = skuDetailsJson.optString("rewardToken")
    val extraParams = Bundle().putString("rewardToken", rewardToken)

    // This call blocks the current thread, so do this in the background.
    val buyIntentBundle : Bundle = mService.getBuyIntentExtraParams(9, packageName,
            sku, "inapp", "", extraParams)

    val response = buyIntentBundle.getInt("RESPONSE_CODE")
    if (response == BILLING_RESPONSE_RESULT_OK) {
        // Enable rewarded product.

        // Save this object for use later.
        val pendingIntentToSave = bundle.getParcelable(RESPONSE_BUY_INTENT)
    } else {
        // Don't offer rewarded product.
    }
    

Java

    String rewardToken = skuDetailsJson.optString("rewardToken");
    Bundle extraParams = new Bundle();
    extraParams.putString("rewardToken", rewardToken);

    // This call blocks the current thread, so do this in the background.
    Bundle buyIntentBundle = mService.getBuyIntentExtraParams(9, getPackageName(),
            sku, "inapp", "", extraParams);

    int response = buyIntentBundle.getInt("RESPONSE_CODE");
    if (response == BILLING_RESPONSE_RESULT_OK) {
        // Enable rewarded product.

        // Save this object for use later.
        PendingIntent pendingIntentToSave = bundle.getParcelable(RESPONSE_BUY_INTENT);
    } else {
        // Don't offer rewarded product.
    }
    

Mendeklarasikan iklan yang sesuai usia

Untuk membantu memfasilitasi kepatuhan dengan kewajiban hukum yang terkait dengan anak-anak dan pengguna di bawah umur, termasuk Children’s Online Privacy Protection Act (COPPA) dan Peraturan Perlindungan Data Umum (GDPR), aplikasi Anda harus mendeklarasikan iklan mana yang dapat diperlakukan sebagai iklan yang ditujukan untuk anak di Amerika Serikat atau diarahkan pada pengguna di bawah batas umur yang berlaku di negara mereka. Pusat Bantuan AdMob menjelaskan kapan Anda perlu memberi tag perlakuan untuk anak-anak dan tag perlakuan untuk anak bawah umur yang memerlukan persetujuan pada permintaan iklan Anda, serta dampak dari melakukannya.

Untuk menunjukkan bahwa permintaan bonus ditargetkan untuk anak-anak atau untuk pengguna di bawah umur, sertakan parameter tambahan childDirected dan underAgeOfConsent, seperti yang ditunjukkan pada cuplikan kode berikut:

Kotlin

    val rewardToken = skuDetailsJson.optString("rewardToken")
    val extraParams = Bundle().putString("rewardToken", rewardToken)
            .putInt("childDirected", ChildDirected.CHILD_DIRECTED)
            .putInt("underAgeOfConsent", UnderAgeOfConsent.UNDER_AGE_OF_CONSENT)

    // This call blocks the current thread, so do this in the background.
    val buyIntentBundle : Bundle = mService.getBuyIntentExtraParams(9, packageName,
            sku, "inapp", "", extraParams)
    

Java

    Bundle extraParams = new Bundle();
    extraParams.putString("rewardToken", rewardToken);
    extraParams.putInt("childDirected", ChildDirected.CHILD_DIRECTED);
    extraParams.putInt("underAgeOfConsent", UnderAgeOfConsent.UNDER_AGE_OF_CONSENT);

    // This call blocks the current thread, so do this in the background.
    Bundle buyIntentBundle =
      mService.getBuyIntentExtraParams(
        9, getPackageName(), sku, "inapp", "", extraParams);
    

Putar iklan sebelum memberi bonus kepada pengguna Anda

Setelah pengguna mengklik tombol untuk mulai menonton iklan, aplikasi Anda dapat menggunakan objek PendingIntent yang disimpan untuk mulai memutar iklan. Untuk melakukannya, panggil startIntentSenderForResult() :

Kotlin

    startIntentSenderForResult(
        pendingIntentToSave,
        RC_BUY, Intent(),
        0,
        0,
        0
    )
    

Java

    startIntentSenderForResult(pendingIntentToSave, RC_BUY, new Intent(),
            0, 0, 0);
    

Kemudian, proses hasil alur kerja penagihan di onActivityResult(), seperti yang ditampilkan dalam cuplikan kode berikut. Saat menangani proses pemutaran iklan, Google Play menggunakan serangkaian kode respons server yang sama seperti dengan alur penagihan lainnya.

Kotlin

    fun onActivityResult(requestCode : Int, resultCode : Int, data : Intent) {
        if (requestCode == RC_BUY) {
            int responseCode = data.getIntExtra(RESPONSE_CODE)
            String purchaseData = data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA)
            String signature = data.getStringExtra(RESPONSE_INAPP_SIGNATURE)

            // Handle reward purchase.
        }
    }
    

Java

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == RC_BUY) {
            int responseCode = data.getIntExtra(RESPONSE_CODE);
            String purchaseData = data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA);
            String signature = data.getStringExtra(RESPONSE_INAPP_SIGNATURE);

            // Handle reward purchase.
        }
    }
    

Pembuatan Cache Lokal

Karena klien Google Play sekarang meng-cache informasi Penagihan via Google Play secara lokal di perangkat, Anda dapat menggunakan In-app Billing API untuk mengkueri informasi ini lebih sering. Panggilan In-app Billing API berikut dilayani melalui pencarian cache, tanpa memerlukan sambungan jaringan, yang secara signifikan mempercepat waktu respons API:

  • getBuyIntent
  • getPurchases
  • isBillingSupported