Menggunakan sistem penagihan Google Play dengan AIDL

Peringatan: AIDL tidak digunakan lagi dan akan dihapus dalam rilis mendatang. Untuk mengimplementasikan fitur terkait penagihan, gunakan Library Layanan Penagihan Google Play.

Anda dapat menggunakan antarmuka Android Interface Definition Language (AIDL) untuk mengimplementasikan beberapa fitur sistem penagihan Google Play.

Membeli Produk

Gambar 1. Urutan dasar untuk permintaan pembelian.

Alur pembelian standar dengan Google Play Billing AIDL API adalah sebagai berikut:

  1. Aplikasi Anda mengirim permintaan isBillingSupported ke Google Play untuk menentukan bahwa versi target Google Play Billing AIDL API 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 pengguna, kirim permintaan getPurchases. Jika permintaan berhasil, Google Play akan menampilkan Bundle yang berisi daftar ID produk dari item yang dibeli, daftar detail masing-masing pembelian, dan daftar tanda tangan untuk pembelian tersebut.
  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 di permintaan kueri. Jika permintaan berhasil, Google Play akan menampilkan Bundle yang berisi detail produk yang mencakup 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 akan mengirim permintaan getBuyIntent, yang menentukan ID produk dari item yang akan dibeli, beserta parameter lainnya. Anda harus mencatat ID produk saat membuat produk dalam aplikasi baru di Konsol Google Play.
    1. Google Play menampilkan Bundle yang berisi PendingIntent yang digunakan aplikasi untuk memulai UI pembayaran untuk pembelian.
    2. Aplikasi Anda meluncurkan intent yang tertunda dengan memanggil metode startIntentSenderForResult.
    3. Setelah alur pembayaran selesai (yaitu, saat pengguna berhasil membeli item atau membatalkan pembelian), Google Play akan 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 panggilan dari Google Play Billing AIDL API dan respons server lebih lanjut, lihat Referensi Google Play Billing AIDL API.

Memakai Produk dalam Aplikasi

Anda dapat menggunakan mekanisme pemakaian untuk melacak kepemilikan pengguna atas produk terkelola.

Semua produk terkelola akan dikelola di Google Play Billing AIDL API. Artinya, kepemilikan pengguna atas semua pembelian produk terkelola akan 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" agar Google Play dapat menyediakan produk tersebut untuk pembelian berikutnya. Mengkonsumsi produk terkelola akan 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 setelah produk dibeli. Google Play akan menampilkan kode status yang menunjukkan bahwa konsumsi berhasil dicatat.

Produk Terkelola Non-Consumable dan Consumable

Anda dapat memutuskan untuk menangani produk terkelola sebagai item non-consumable (tidak dapat dikonsumsi) atau consumable (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 non-consumable 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 consumable dalam aplikasi Anda, Anda harus mengirim permintaan konsumsi ke Google Play dan menerima respons berhasil yang menunjukkan bahwa konsumsi telah dicatat.

Mengelola pembelian consumable 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, mulai 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 consumable 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 dipakai 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 dipakai, tetapi dihentikan atau terputus sebelum aplikasi memiliki kesempatan untuk mengirim permintaan pemakaian.
  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 reward

Peringatan: Produk bonus sudah tidak didukung lagi. Untuk informasi selengkapnya, lihat Membuat produk bonus.

Saat menangani produk reward menggunakan AIDL, Anda harus menyimpan cache `Intent` beli sebelum pengguna mengambil reward. Anda dapat memanggil intent beli pada thread latar belakang 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 latar belakang. Setelah Anda menerima respons dari BILLING_RESPONSE_RESULT_OK, aktifkan produk reward untuk pengguna dan simpan objek PendingIntent yang ditampilkan untuk digunakan nanti. Cuplikan kode berikut menunjukkan proses memuat iklan yang terkait dengan produk reward:

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 terhadap kewajiban hukum yang terkait dengan anak-anak dan pengguna di bawah umur, termasuk Children's Online Privacy Protection Act (COPPA) dan General Data Protection Regulation (GDPR), aplikasi Anda harus mendeklarasikan iklan yang perlu diperlakukan sebagai ditujukan untuk anak-anak di Amerika Serikat atau yang ditujukan kepada pengguna di bawah usia dewasa yang berlaku di negara mereka. Pusat Bantuan AdMob menjelaskan kapan Anda perlu memberi tag perlakuan untuk anak-anak dan tag perlakuan untuk anak di 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 yang memerlukan persetujuan, sertakan parameter tambahan childDirected dan underAgeOfConsent, seperti yang ditunjukkan dalam 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);

Memutar iklan sebelum memberikan bonus kepada pengguna

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 dengan yang digunakan pada 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 kini men-cache informasi penagihan secara lokal di perangkat, Anda dapat menggunakan Google Play Billing AIDL API untuk lebih sering membuat kueri tentang informasi ini. Panggilan dari Google Play Billing AIDL API berikut dilayani melalui pencarian cache, tanpa memerlukan koneksi jaringan, yang secara signifikan mempercepat waktu respons API:

  • getBuyIntent
  • getPurchases
  • isBillingSupported