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 ...
- Akses ke Konsol Google Play dengan akun developer. Jika Anda tidak memiliki akun developer, Anda harus membuat akun.
- Aplikasi contoh untuk codelab ini yang dapat Anda download dari GitHub.
- Android Studio.
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:
- Buat akun developer Konsol Google Play. Jika Anda sudah memiliki akun developer, lewati langkah ini.
- Buat aplikasi baru di Konsol Play. Saat membuat aplikasi, Anda dapat menentukan nama aplikasi apa pun untuk aplikasi contoh.
- Menginstal Android Studio.
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:
- Download aplikasi contoh dari GitHub.
- 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. - Buat Android App Bundle yang ditandatangani.
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:
- Login ke Konsol Google Play menggunakan akun developer Anda.
- Klik Buat aplikasi. Tindakan ini akan membuka halaman Buat aplikasi.
- Masukkan nama aplikasi, pilih bahasa default, dan detail terkait aplikasi lainnya.
- 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
- Upload app bundle yang ditandatangani ke jalur pengujian internal Konsol Google Play. Setelah mengupload, Anda dapat mengonfigurasi fitur terkait monetisasi di Konsol Play.
- Klik Uji dan rilis > Pengujian > Rilis internal > Buat rilis baru.
- Masukkan nama rilis dan upload file paket aplikasi yang ditandatangani.
- Klik Berikutnya, lalu klik Simpan dan publikasikan.
Sekarang, Anda dapat membuat produk sekali beli.
Membuat produk sekali beli
Untuk membuat produk sekali beli:
- Di Konsol Google Play, dari menu navigasi kiri, buka Monetisasi dengan Play > Produk > Produk sekali beli.
- Klik Buat produk sekali beli.
- 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.
- ID Produk: Masukkan ID produk unik. Masukkan
- Klik Berikutnya.
- 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.
- ID Opsi Pembelian: Masukkan ID opsi pembelian. Misalnya,
- Di bagian Ketersediaan dan harga, klik Tetapkan harga > Edit harga secara massal.
- Pilih opsi Negara / wilayah. Tindakan ini akan memilih semua wilayah.
- Klik Lanjutkan. Tindakan ini akan membuka dialog untuk memasukkan harga. Masukkan 10 USD, lalu klik Terapkan.
- 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:
- Tambahkan dependensi Play Billing Library ke contoh aplikasi.
dependencies { val billing_version = "8.0.0" implementation("com.android.billingclient:billing-ktx:$billing_version") }
- 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(); }
- 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."); } }); }
- 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.
Mengambilprivate 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); } }); }
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": [] } ] }
- 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); }
- Mendeteksi dan memproses pembelian. Sebagai bagian dari langkah ini, Anda perlu:
- Verifikasi pembelian.
- Memberikan hak kepada pengguna
- Memberi tahu pengguna
- Memberi tahu Google tentang proses pembelian
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? |
|
|
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? |
|
|
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
- Pelajari cara memaksimalkan integrasi penagihan Play Anda.
- Jangan lupa untuk mengikuti praktik terbaik untuk memverifikasi dan memproses pembelian di backend aman Anda setelah pengguna mulai membeli produk ini.
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.