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:
- 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. - 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 menampilkanBundle
yang berisi daftar ID produk dari item yang dibeli, daftar detail masing-masing pembelian, dan daftar tanda tangan untuk pembelian tersebut. - 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 menampilkanBundle
yang berisi detail produk yang mencakup harga, judul, deskripsi, dan jenis pembelian produk. - 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.- Google Play menampilkan
Bundle
yang berisiPendingIntent
yang digunakan aplikasi untuk memulai UI pembayaran untuk pembelian. - Aplikasi Anda meluncurkan intent yang tertunda dengan memanggil
metode
startIntentSenderForResult
. - Setelah alur pembayaran selesai (yaitu, saat pengguna berhasil
membeli item atau membatalkan pembelian), Google Play akan mengirimkan respons
Intent
ke metodeonActivityResult
Anda. Kode hasilonActivityResult
memiliki kode hasil yang menunjukkan apakah pembelian berhasil atau dibatalkan.Intent
respons berisi informasi tentang item yang dibeli, termasuk StringpurchaseToken
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.
- Google Play menampilkan
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:
- Panggil metode
getBuyIntent
untuk meluncurkan alur pembelian. - Periksa
Bundle
yang ditampilkan dari Google Play untuk menentukan apakah pembelian berhasil dilakukan atau tidak. - Jika pembelian berhasil, mulai konsumsi pembelian dengan memanggil
metode
consumePurchase
. - Periksa kode respons dari Google Play untuk menentukan apakah konsumsi berhasil diselesaikan.
- 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:
- Kirim permintaan
getPurchases
untuk mengkueri produk dalam aplikasi yang dimiliki untuk pengguna. - 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. - Periksa kode respons dari Google Play untuk menentukan apakah konsumsi berhasil diselesaikan.
- 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.
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 objekPendingIntent
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