Halo. Saya zm soft, yang mendaftar sebagai developer tahun lalu (akhir 2023) dan mulai merilis aplikasi. Kami juga berencana merilis aplikasi untuk developer untuk melewati closed test bersama melalui kerja sama antar developer, jadi silakan cek jika tertarik.
Apakah kalian sudah mengimplementasikan pembelian dalam aplikasi? Bagi developer aplikasi, membuat pengguna puas dan mendapatkan imbalan atas itu adalah hal terbaik, dan itulah momen ketika jerih payah pengembangan terbayar. Kali ini saya ingin menulis tentang cara mewujudkan hal tersebut.
Apa Itu Pembelian Dalam Aplikasi
Seperti yang sudah kalian ketahui, pembelian dalam aplikasi diklasifikasikan menjadi dua jenis:
- Item yang dapat dikonsumsi
- Item langganan berkala
Keduanya menggunakan pendekatan mengakses item yang telah dikonfigurasi sebelumnya di Play Store melalui Google Play Billing Library, dan sebagian dari pendapatan yang diperoleh dibayarkan ke Google sebagai biaya. Dari sisi implementasi, keduanya serupa, tetapi item langganan berkala memiliki catatan tersendiri. Saya akan menjelaskan catatan tersebut berdasarkan pengalaman pribadi saya.
Pengaturan Play Store
Pendaftaran Item
Pertama, daftarkan item karena tidak bisa ditampilkan tanpa pendaftaran. Harga, nama, dll., termasuk apakah item tersebut benar-benar akan digunakan, bisa diubah nanti, jadi data sementara pun tidak masalah. Namun, hanya ID yang tidak bisa diubah, jadi jika Anda berencana menggunakan item yang dibuat untuk pengujian di lingkungan produksi setelah dimodifikasi, lebih baik mendaftarkannya dengan ID yang dapat digunakan ulang seperti [product_1,2,3...] atau [sub_1,2,3...]. Pendaftaran bisa dilakukan dari [Monetize], di mana [In-app products] dan [Subscriptions] masing-masing merupakan item yang dapat dikonsumsi dan langganan berkala. Setiap item dapat didaftarkan melalui tombol [Create xx].

Pada dasarnya, Anda bisa mengikuti layar input, tetapi yang membingungkan adalah pengaturan harga untuk item langganan berkala. Awalnya saya tidak tahu cara menetapkan harga untuk semua wilayah sekaligus. Saya pikir harus memasukkan setiap wilayah satu per satu, tetapi ternyata bisa dilakukan dengan urutan: [Set prices] - [Country / region] - [Set price].

Saat tombol ditekan, dialog berikut muncul dan memungkinkan pengaturan sekaligus.

Pendaftaran Akun Uji
Selanjutnya, daftarkan akun uji. Jika melakukan uji pembelian tanpa mendaftarkannya, pembayaran nyata akan terjadi, jadi harap berhati-hati. Pendaftaran akun uji dilakukan dengan mendaftarkan mailing list. Pendaftaran dapat dilakukan di layar pertama (layar developer) setelah login ke Play Console melalui [Settings] - [License testing].

Saat melakukan proses pembelian aplikasi dengan pengguna yang terdaftar di mailing list, informasi pembayaran akan ditampilkan sebagai "kartu uji", sehingga pengujian dapat dilakukan tanpa pembayaran nyata.
Pekerjaan Implementasi
Implementasi di sisi aplikasi memerlukan pekerjaan berikut:
- Pengimporan library
- Koneksi ke toko dan pengambilan informasi item
- Implementasi layar tampilan item
- Permintaan pembelian
- Pemrosesan saat pembelian selesai
Berikut saya jelaskan masing-masing secara detail.
Pengimporan Library
Pengimporan library memerlukan hal-hal berikut:
- Modifikasi build.gradle
- Modifikasi android.manifest
Contoh modifikasi build.gradle:
dependencies {
implementation "com.android.billingclient:6.0.0"
}
Contoh modifikasi manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="com.android.vending.BILLING" />
<application
Silakan periksa dokumentasi resmi untuk versi dll.
Koneksi ke Toko dan Pengambilan Informasi Item
Dengan menginisialisasi BillingClient dan menjalankan startConnection, komunikasi dengan toko menjadi memungkinkan. Informasi setiap item dapat diperoleh dengan queryProductDetailsAsync. Untuk detailnya, silakan periksa dokumentasi resmi. Dalam kasus saya, pengambilan sekaligus entah kenapa tidak berjalan dengan baik, jadi saya mendapatkan daftar item terlebih dahulu lalu mengambil detail setiap item secara individual dengan queryProductDetailAsync. Item yang diperoleh (SKU) dapat dibedakan apakah itu item yang dapat dikonsumsi atau langganan berkala dari tipenya, yaitu inapp atau subs.
Implementasi Layar Tampilan Item
Setelah mendapatkan informasi item, tampilkan dalam daftar agar pembelian dapat dipilih. Saat menangani item langganan berkala di sini, diperlukan kepatuhan terhadap Subscription Policy, dan dalam kasus saya, pembaruan aplikasi ditolak berturut-turut karena dua alasan berikut:
- Pelokalan harga dan ketentuan yang tidak lengkap
- Keterangan ketentuan penawaran yang tidak lengkap
Pertama, mengenai pelokalan harga dan ketentuan yang tidak lengkap: alasannya adalah tampilan periode (contoh: $10/month). Masalahnya adalah bagian "month" tidak diterjemahkan saat dijalankan dengan pengaturan wilayah bahasa yang tidak didukung penerjemahannya. Saat mendapatkan informasi menggunakan BillingClient, jumlah harga diambil sebagai string formattedPrice yang menyertakan informasi unit, sehingga tidak perlu diterjemahkan dalam aplikasi. Sebaliknya, informasi periode diberitahukan dalam format ISO 8601 seperti P1M, dan ini harus diterjemahkan dalam aplikasi. Hal ini diatasi dengan menambahkan proses konversi untuk setiap bahasa sebagai berikut:
fun formatBillingPeriod(billingPeriod: String, languageCode: String): String {
return when(languageCode) {
"en" -> {
when (billingPeriod) {
"P1W" -> "weekly"
"P1M" -> "monthly"
"P3M" -> "every 3 months"
"P6M" -> "every 6 months"
"P1Y" -> "annually"
else -> "unknown"
}
}
"ja" -> {
when (billingPeriod) {
"P1W" -> "週間"
"P1M" -> "月額"
"P3M" -> "3ヶ月ごと"
"P6M" -> "6ヶ月ごと"
"P1Y" -> "年額"
else -> "不明"
}
}
"fr" -> {
when (billingPeriod) {
"P1W" -> "hebdomadaire"
"P1M" -> "mensuel"
"P3M" -> "tous les 3 mois"
"P6M" -> "tous les 6 mois"
"P1Y" -> "annuel"
else -> "inconnu"
}
}
"es" -> {
when (billingPeriod) {
"P1W" -> "semanal"
"P1M" -> "mensual"
"P3M" -> "cada 3 meses"
"P6M" -> "cada 6 meses"
"P1Y" -> "anual"
else -> "desconocido"
}
}
"de" -> {
when (billingPeriod) {
"P1W" -> "wöchentlich"
"P1M" -> "monatlich"
"P3M" -> "alle 3 Monate"
"P6M" -> "alle 6 Monate"
"P1Y" -> "jährlich"
else -> "unbekannt"
}
}
else -> "unknown"
}
}
Selanjutnya, mengenai keterangan ketentuan penawaran yang tidak lengkap:

Saya memahami masalahnya, tetapi tidak tahu secara konkret kalimat apa yang harus ditulis sebagai solusinya. Berikut adalah kutipan dari teks asli email penolakan yang saya terima:
Issue found: Violation of Subscriptions policy
Your app does not comply with the Subscriptions policy.
- Your offer does not clearly and accurately describe the terms of your trial offer or introductory pricing, including when a free trial will convert to a paid subscription, how much the paid subscription will cost, and that a user can cancel if they do not want to convert to a paid subscription.
Sebagai solusi, saya meminjam kalimat dari aplikasi lain. Karena tampaknya sebagian besar sudah berupa kalimat baku, saya pikir lebih baik mengikuti preseden yang sudah terbukti daripada memikirkan dari awal.
Permintaan Pembelian
Setelah item dapat dipilih dari layar, akhirnya tiba saatnya pemrosesan pembelian item. Dengan menjalankan alur pembelian untuk item yang diperoleh, layar pembelian nyata dapat dipanggil.
Pengujian
Pengujian dapat dilakukan tanpa menimbulkan biaya nyata dengan login menggunakan akun uji yang disiapkan di awal. Dua hal yang perlu diperhatikan di sini adalah:
- Eksekusi alur pembelian dilakukan dengan aplikasi yang terdaftar di toko
- Untuk item langganan berkala, periode ditetapkan secara khusus
Pertama, mengenai eksekusi alur pembelian, jika aplikasi adalah debug build, kesalahan akan ditampilkan di layar pembelian dan alur tidak dapat dieksekusi.
Selanjutnya, mengenai item langganan berkala, saat melanjutkan ke layar pembelian nyata, pembayaran dengan kartu uji ditampilkan. Saat itu, periode pembaruan ditampilkan di layar pembelian, tetapi periode yang ditampilkan ini berbeda dari periode yang sebenarnya dikonfigurasi pada item. Dalam kasus saya, ditampilkan 5 menit. Tampaknya ini adalah spesifikasi yang menampilkan periode tetap yang sangat singkat untuk perilaku pembaruan langganan. (Saya pikir saya salah mengonfigurasi sesuatu dan meninjau pengaturan untuk sementara waktu.)
Kesimpulan
Awalnya tampak sulit, tetapi setelah memahami gambaran keseluruhan, pembelian dalam aplikasi itu sendiri dapat diimplementasikan dengan mudah secara mengejutkan dengan melihat informasi yang tersedia untuk umum seperti dokumentasi resmi. Namun, untuk langganan berkala, ada jebakan yang tidak dapat ditemukan kecuali dicoba, jadi saya berharap poin-poin yang saya tersandung dapat menjadi referensi bagi developer yang akan mengimplementasikannya di masa depan.