Pengingat: Anda harus mendukung penangguhan dan pemulihan akun di aplikasi Anda paling lambat 1 November 2020. Penjedaan langganan dan berlangganan lagi juga akan diaktifkan secara default, kecuali Anda secara eksplisit memilih tidak ikut. Pelajari lebih lanjut.

Mengintegrasikan Library Layanan Penagihan Google Play ke aplikasi Anda

Topik ini menjelaskan cara mengintegrasikan Library Layanan Penagihan Google Play ke aplikasi Anda untuk mulai menjual produk. Sebelum membaca topik ini, pastikan Anda telah menyiapkan konfigurasi Google Play terlebih dahulu dengan mengikuti langkah-langkah dalam Penyiapan.

Topik ini mencakup contoh kode yang didasarkan pada contoh aplikasi resmi di GitHub. Baca referensi tambahan untuk mengetahui daftar lengkap contoh aplikasi dan resource lainnya yang dapat digunakan saat mengintegrasikannya.

Umur pembelian

Berikut ini alur pembelian yang biasa untuk pembelian satu kali atau langganan.

  • Menunjukkan kepada pengguna apa yang dapat mereka beli.
  • Meluncurkan alur pembelian bagi pengguna untuk menerima pembelian.
  • Memverifikasi pembelian di server Anda.
  • Memberikan konten kepada pengguna, dan menyetujui pengiriman konten. Anda juga dapat menandai item sebagai telah digunakan sehingga pengguna dapat membeli item itu lagi.

Langganan diperpanjang secara otomatis hingga dibatalkan. Langganan dapat melalui status berikut:

  • Aktif: Pengguna memiliki reputasi baik dan memiliki akses ke langganan.
  • Dibatalkan: Pengguna telah membatalkan namun masih memiliki akses hingga masa berlakunya berakhir.
  • Dalam masa tenggang: Pengguna mengalami masalah pembayaran, tetapi masih dapat mengakses saat Google mencoba kembali metode pembayaran.
  • Penangguhan: Pengguna mengalami masalah pembayaran, dan tidak lagi memiliki akses saat Google mencoba kembali metode pembayaran.
  • Dijeda: Pengguna menjeda aksesnya, dan tidak memiliki akses hingga mereka melanjutkan.
  • Berakhir: Pengguna telah membatalkan dan kehilangan akses ke langganan. Pengguna dianggap berhenti menggunakan aplikasi saat masa berlaku habis.

Token pembelian dan ID pesanan

Google Play melacak produk dan transaksi menggunakan token pembelian dan ID pesanan.

  • Token pembelian adalah string yang menunjukkan hak pembeli atas suatu produk di Google Play. Ini menunjukkan bahwa pengguna Google diberi hak atas produk tertentu yang direpresentasikan oleh SKU. Anda dapat menggunakan token pembelian dengan Google Play Developer API.
  • ID pesanan adalah string yang merepresentasikan transaksi keuangan di Google Play. String ini disertakan dalam tanda terima yang dikirim ke pembeli melalui email. Anda dapat menggunakan ID Pesanan untuk mengelola pengembalian dana dalam laporan penjualan dan pembayaran.

ID Pesanan dibuat setiap kali transaksi keuangan terjadi. Token pembelian hanya dihasilkan saat pengguna menyelesaikan alur pembelian.

  • Untuk produk sekali beli, setiap pembelian akan menghasilkan token pembelian baru. Sebagian besar pembelian juga menghasilkan ID Pesanan baru. Pengecualian untuk hal ini adalah saat pengguna tidak dikenakan biaya apa pun, seperti yang dijelaskan dalam Kode promo.
  • Untuk langganan, pembelian awal menghasilkan token pembelian dan ID Pesanan. Untuk setiap periode penagihan berkelanjutan, token pembelian tidak berubah, dan ID Pesanan baru diterbitkan. Upgrade, downgrade, penggantian, dan pendaftaran ulang, semuanya membuat token pembelian dan ID Pesanan baru.

Untuk langganan, perhatikan berikut ini:

  • Upgrade langganan, downgrade langganan, dan alur pembelian langganan lainnya menghasilkan token pembelian yang harus menggantikan token pembelian sebelumnya. Anda harus membatalkan token pembelian yang muncul di kolom linkedPurchaseToken pada Google Play Developer API. Untuk informasi selengkapnya, lihat Menerapkan linkPurchaseToken dengan benar untuk mencegah langganan duplikat.
  • Nomor pesanan untuk perpanjangan langganan berisi bilangan bulat tambahan yang menunjukkan instance perpanjangan tertentu. Misalnya, ID Pesanan langganan awal mungkin adalah GPA.1234-5678-9012-34567 dengan ID Pesanan berikutnya adalah GPA.1234-5678-9012-34567..0 (perpanjangan pertama), GPA.1234-5678-9012-34567..1 (perpanjangan kedua), dan seterusnya.

Penanganan Error

Library Layanan Penagihan Google Play menampilkan error dalam bentuk BillingResult. BillingResult berisi BillingResponseCode, yang mengategorikan kemungkinan error terkait penagihan yang dapat dialami aplikasi Anda. Misalnya, jika Anda menerima kode error SERVICE_DISCONNECTED, aplikasi Anda harus menginisialisasi ulang koneksi dengan Google Play. Selain itu, BillingResult berisi pesan debug, yang berguna selama pengembangan untuk mendiagnosis error.

Menghubungkan ke Google Play

Langkah pertama untuk berintegrasi dengan sistem penagihan Google Play adalah menambahkan library ke aplikasi dan melakukan inisialisasi koneksi.

Menambahkan dependensi Library Layanan Penagihan Google Play

Tambahkan dependensi Library Layanan Penagihan Google Play ke file build.gradle aplikasi Anda seperti yang ditunjukkan:

dependencies {
    def billing_version = "3.0.0"

    implementation 'com.android.billingclient:billing:$billing_version'
}

Jika Anda menggunakan Kotlin, modul KTX Library Layanan Penagihan Play berisi ekstensi Kotlin dan dukungan coroutine yang memungkinkan Anda menulis Kotlin idiomatis saat menggunakan Library Layanan Penagihan Google Play. Untuk menyertakan ekstensi ini dalam project Anda, tambahkan dependensi berikut ke file build.gradle aplikasi Anda seperti yang ditunjukkan:

dependencies {
    def billing_version = "3.0.0"

    implementation 'com.android.billingclient:billing-ktx:$billing_version'
}

Melakukan inisialisasi pada BillingClient

Setelah menambahkan dependensi pada Library Layanan Penagihan Google Play, Anda perlu melakukan inisialisasi instance BillingClient. BillingClient adalah antarmuka utama untuk komunikasi antara Library Layanan Penagihan Google Play dan aplikasi Anda lainnya. BillingClient menyediakan metode praktis, baik sinkron maupun asinkron, untuk berbagai operasi penagihan umum.

Untuk membuat BillingClient, gunakan newBuilder(). Untuk menerima update tentang pembelian, Anda juga harus menghubungi setListener(), dengan meneruskan referensi ke PurchasesUpdatedListener. Pemroses ini menerima update untuk semua pembelian di aplikasi Anda.

Kotlin

private val purchaseUpdateListener =
   PurchasesUpdatedListener { billingResult, purchases ->
       // To be implemented in a later section.
   }

private var billingClient = BillingClient.newBuilder(activity)
   .setListener(purchasesUpdatedListener)
   .enablePendingPurchases()
   .build()

Java

private PurchasesUpdatedListener purchaseUpdateListener = new PurchasesUpdatedListener() {
    @Override
    void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // To be implemented in a later section.
    }
};

private BillingClient billingClient = BillingClient.newBuilder(activity)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases()
    .build();

Membuat koneksi ke Google Play.

Setelah membuat BillingClient, Anda harus membuat koneksi ke Google Play.

Agar terhubung ke Google Play, panggil startConnection(). Proses koneksi bersifat asinkron, dan Anda harus mengimplementasikan BillingClientStateListener untuk menerima callback setelah penyiapan klien selesai dan siap untuk membuat permintaan lebih lanjut.

Anda juga harus mengimplementasikan logika mencoba ulang untuk menangani koneksi yang terputus ke Google Play. Untuk menerapkan logika mencoba ulang, ganti metode callback onBillingServiceDisconnected(), dan pastikan BillingClient memanggil metode startConnection() untuk terhubung kembali ke Google Play sebelum membuat permintaan lebih lanjut.

Contoh berikut menunjukkan cara memulai koneksi dan menguji apakah koneksi siap digunakan:

Kotlin

billingClient.startConnection(object : BillingClientStateListener {
    override fun onBillingSetupFinished(billingResult: BillingResult) {
        if (billingResult.responseCode ==  BillingResponseCode.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    override fun onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
})

Java

billingClient.startConnection(new BillingClientStateListener() {
    @Override
    public void onBillingSetupFinished(BillingResult billingResult) {
        if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    @Override
    public void onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
});

Menampilkan produk yang tersedia untuk dibeli

Setelah terhubung ke Google Play, Anda siap membuat kueri untuk produk yang tersedia dan menampilkannya kepada pengguna. Untuk meng-kueri Google Play agar mendapatkan detail produk dalam aplikasi, panggil querySkuDetailsAsync(). Kueri untuk detail SKU merupakan langkah penting sebelum menampilkan produk kepada pengguna, karena produk tersebut akan menampilkan informasi produk yang dilokalkan. Untuk langganan, pastikan tampilan produk Anda mengikuti semua kebijakan Play.

Saat memanggil querySkuDetailsAsync(), teruskan instance SkuDetailsParams yang menentukan daftar string ID produk yang dibuat di Konsol Google Play bersama dengan SkuType. SkuType dapat berupa SkuType.INAPP untuk produk sekali beli, atau SkuType.SUBS untuk langganan.

Untuk menangani hasil operasi asinkron, Anda juga harus menentukan pemroses yang menerapkan antarmuka SkuDetailsResponseListener. Anda kemudian dapat mengganti onSkuDetailsResponse(), yang memberi tahu pemroses ketika kueri selesai, seperti yang ditunjukkan dalam contoh berikut:

Kotlin

fun querySkuDetails() {
    val skuList = ArrayList<String>()
    skuList.add("premium_upgrade")
    skuList.add("gas")
    val params = SkuDetailsParams.newBuilder()
    params.setSkusList(skuList).setType(SkuType.INAPP)
    val skuDetailsResult = withContext(Dispatchers.IO) {
        billingClient.querySkuDetails(params.build())
    }
    // Process the result.
}

Java

List<String> skuList = new ArrayList<> ();
skuList.add("premium_upgrade");
skuList.add("gas");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),
    new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(BillingResult billingResult,
                List<SkuDetails> skuDetailsList) {
            // Process the result.
        }
    });

Library Layanan Penagihan Google Play menyimpan hasil kueri dalam List objek SkuDetails. Anda kemudian dapat memanggil berbagai metode pada setiap objek SkuDetails dalam daftar untuk melihat informasi yang relevan tentang produk dalam aplikasi, seperti harga atau deskripsinya. Untuk melihat informasi detail produk yang tersedia, lihat daftar metode dalam class SkuDetails.

Sebelum menawarkan item untuk dijual, pastikan pengguna belum memiliki item tersebut. Jika pengguna memiliki item habis pakai yang masih ada dalam library item, mereka harus menggunakan item tersebut sebelum dapat membelinya lagi.

Sebelum menawarkan langganan, verifikasi bahwa pengguna belum berlangganan.

Meluncurkan alur pembelian

Untuk memulai permintaan pembelian dari aplikasi Anda, panggil metode launchBillingFlow() dari thread utama aplikasi Anda. Metode ini mengambil referensi ke objek BillingFlowParams yang berisi objek SkuDetails yang relevan dan diperoleh dari panggilan querySkuDetailsAsync(). Untuk membuat objek BillingFlowParams, gunakan class BillingFlowParams.Builder.

Kotlin

// An activity reference from which the billing flow will be launched.
val activity : Activity = ...;

// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
val flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .build()
val responseCode = billingClient.launchBillingFlow(activity, flowParams).responseCode

Java

// An activity reference from which the billing flow will be launched.
Activity activity = ...;

// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .build();
int responseCode = billingClient.launchBillingFlow(activity, billingFlowParams).getResponseCode();

// Handle the result.

Metode launchBillingFlow()menampilkan salah satu dari beberapa kode respons yang tercantum dalam BillingClient.BillingResponseCode . Pastikan Anda memeriksa hasil ini untuk memastikan tidak ada error saat meluncurkan alur pembelian. BillingResponseCode dari OK menunjukkan peluncuran yang berhasil.

Jika panggilan ke launchBillingFlow() berhasil, sistem akan menampilkan layar pembelian Google Play. Gambar 1 menunjukkan layar pembelian untuk produk sekali beli:

layar pembelian google play menampilkan produk sekali beli yang
            tersedia untuk dibeli
Gambar 1. Layar pembelian Google Play menampilkan produk sekali beli yang tersedia untuk dibeli.

Google Play memanggil onPurchasesUpdated() untuk mengirimkan hasil operasi pembelian ke pemroses yang menerapkan antarmuka PurchasesUpdatedListener. Pemroses ditentukan menggunakan metode setListener() saat Anda menginisialisasi klien.

Anda harus menerapkan onPurchasesUpdated() untuk menangani kode respons yang mungkin diberikan. Contoh berikut menunjukkan cara mengganti onPurchasesUpdated():

Kotlin

override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?) {
   if (billingResult.responseCode == BillingResponseCode.OK && purchases != null) {
       for (purchase in purchases) {
           handlePurchase(purchase)
       }
   } else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) {
       // Handle an error caused by a user cancelling the purchase flow.
   } else {
       // Handle any other error codes.
   }
}

Java

@Override
void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingResponseCode.OK
        && purchases != null) {
        for (Purchase purchase : purchases) {
            handlePurchase(purchase);
        }
    } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

Pembelian yang berhasil akan memunculkan layar keberhasilan melakukan pembelian dari Google Play yang serupa dengan gambar 2.

layar keberhasilan melakukan pembelian di google play
Gambar 2. Layar keberhasilan melakukan pembelian di Google Play.

Pembelian yang berhasil juga akan memunculkan token pembelian, yakni ID unik yang mewakili pengguna dan ID produk untuk produk dalam aplikasi yang mereka beli. Aplikasi Anda dapat menyimpan token pembelian secara lokal, meskipun sebaiknya Anda meneruskan token ke server backend yang aman, tempat Anda dapat memverifikasi pembelian dan melindungi dari penipuan. Proses ini dijelaskan lebih lanjut di bagian berikut.

Pengguna juga akan menerima tanda terima transaksi yang berisi ID pesanan atau ID unik transaksi melalui email. Pengguna menerima email yang berisi ID pesanan unik untuk setiap pembelian produk sekali beli, juga untuk pembelian langganan awal dan perpanjangan otomatis berulang berikutnya. Anda dapat menggunakan ID pesanan ini untuk mengelola pengembalian dana di Konsol Google Play.

Memproses pembelian

Setelah pengguna menyelesaikan pembelian, aplikasi Anda perlu memproses pembelian tersebut. Biasanya, aplikasi Anda akan diberi notifikasi tentang pembelian melalui PurchasesUpdatedListener. namun terkadang aplikasi Anda diberi tahu untuk memanggil BillingClient.queryPurchases() seperti yang dijelaskan dalam Mengambil pembelian.

Aplikasi Anda harus memproses pembelian dengan cara berikut:

  1. Verifikasi pembelian.
  2. Memberikan konten kepada pengguna, dan menyetujui pengiriman konten. Anda juga dapat menandai item sebagai telah digunakan sehingga pengguna dapat membeli item itu lagi.

Untuk memverifikasi pembelian, periksa terlebih dahulu apakah status pembelian adalah PURCHASED. Jika pembelian adalah PENDING, Anda harus memproses pembelian seperti yang dijelaskan dalam Menangani transaksi yang tertunda. Untuk pembelian yang diterima dari onPurchaseUpdated() atau queryPurchases, Anda harus memverifikasi pembelian lebih lanjut untuk memastikan keabsahan sebelum aplikasi memberikan hak. Untuk mempelajari cara memverifikasi pembelian dengan benar, lihat Memverifikasi pembelian sebelum memberikan hak.

Setelah Anda memverifikasi pembelian, aplikasi Anda siap memberikan hak milik pengguna tersebut. Setelah memberikan hak, aplikasi Anda kemudian harus mengonfirmasi pembelian. Konfirmasi ini menyampaikan kepada Google Play bahwa Anda telah memberikan hak atas pembelian tersebut.

Proses untuk memberikan hak dan mengonfirmasi pembelian bergantung pada apakah pembelian tersebut merupakan langganan yang tidak habis pakai, habis pakai, atau langganan.

Untuk habis pakai, metode consumeAsync() memenuhi persyaratan konfirmasi dan menunjukkan bahwa aplikasi Anda telah memberikan hak kepada pengguna. Metode ini juga memungkinkan aplikasi Anda membuat produk sekali beli tersedia untuk dibeli lagi.

Untuk menunjukkan bahwa produk sekali beli telah digunakan, panggil consumeAsync() dan sertakan token pembelian yang harus disediakan Google Play untuk pembelian kembali. Anda juga harus meneruskan objek yang mengimplementasikan antarmuka ConsumeResponseListener. Objek ini menangani hasil operasi konsumsi. Anda dapat mengganti metode onConsumeResponse(), yang dipanggil oleh Library Layanan Penagihan Google Play saat operasi selesai.

Contoh berikut menggambarkan konsumsi produk menggunakan token pembelian yang terkait:

Kotlin

fun handlePurchase(purchase: Purchase) {
    // Purchase retrieved from BillingClient#queryPurchases or your PurchasesUpdatedListener.
    val purchase : Purchase = ...;

    // Verify the purchase.
    // Ensure entitlement was not already granted for this purchaseToken.
    // Grant entitlement to the user.

    val consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build()

    billingClient.consumeAsync(consumeParams, { billingResult, outToken ->
        if (billingResult.responseCode == BillingResponseCode.OK) {
            // Handle the success of the consume operation.
        }
    })
}

Java

void handlePurchase(Purchase purchase) {
    // Purchase retrieved from BillingClient#queryPurchases or your PurchasesUpdatedListener.
    Purchase purchase = ...;

    // Verify the purchase.
    // Ensure entitlement was not already granted for this purchaseToken.
    // Grant entitlement to the user.

    ConsumeParams consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build();

    ConsumeResponseListener listener = new ConsumeResponseListener() {
        @Override
        public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
            if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                // Handle the success of the consume operation.
            }
        }
    };

    billingClient.consumeAsync(consumeParams, listener);
}

Untuk menyetujui pembelian yang tidak habis pakai, gunakan BillingClient.acknowledgePurchase() dari Library Layanan Penagihan atau Product.Purchases.Acknowledge dari Google Play Developer API. Sebelum mengonfirmasi pembelian, aplikasi Anda harus memeriksa apakah pembelian itu sudah disetujui dengan menggunakan metode isAcknowledged() di Library Layanan Penagihan Google Play atau kolom acknowledgementState di Google Developer API.

Contoh berikut menunjukkan cara mengonfirmasi pembelian menggunakan Library Layanan Penagihan Google Play:

Kotlin

val client: BillingClient = ...
val acknowledgePurchaseResponseListener: AcknowledgePurchaseResponseListener = ...

fun handlePurchase() {
    if (purchase.purchaseState === PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged) {
            val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.purchaseToken)
            val ackPurchaseResult = withContext(Dispatchers.IO) {
               client.acknowledgePurchase(acknowledgePurchaseParams.build())
            }
        }
     }
}

Java

BillingClient client = ...
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ...

void handlePurchase(Purchase purchase) {
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged()) {
            AcknowledgePurchaseParams acknowledgePurchaseParams =
                AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();
            client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
        }
    }
}

Langganan ditangani dengan cara yang sama seperti item yang tidak habis pakai. Anda dapat menyetujui Konfirmasi langganan menggunakan BillingClient.acknowledgePurchase() dari Library Layanan Penagihan Google Play atau Purchases.Subscriptions.Acknowledge dari Google Play Developer API. Semua pembelian langganan awal harus dikonfirmasi. Perpanjangan langganan tidak perlu dikonfirmasi. Untuk informasi selengkapnya tentang kapan langganan perlu dikonfirmasi, lihat topik Menjual langganan.

Mengambil pembelian

Memproses update pembelian menggunakan PurchasesUpdatedListener tidak cukup untuk memastikan aplikasi Anda memproses semua pembelian. Ada kemungkinan bahwa aplikasi Anda tidak mengetahui semua pembelian yang dilakukan pengguna. Berikut ini beberapa skenario saat aplikasi Anda tidak dapat melacak atau tidak mengetahui pembelian:

  • Masalah Jaringan selama pembelian: Pengguna melakukan pembelian yang berhasil dan menerima konfirmasi dari Google, namun perangkat mereka kehilangan sambungan jaringan sebelum perangkat mereka menerima notifikasi pembelian melalui perangkat PurchasesUpdatedListener.
  • Beberapa perangkat: Pengguna membeli item di satu perangkat, lalu mengharapkan untuk melihat item tersebut saat beralih perangkat.
  • Menangani pembelian yang dilakukan di luar aplikasi: Beberapa pembelian, seperti penukaran promosi, dapat dilakukan di luar aplikasi Anda.

Untuk menangani situasi ini, pastikan aplikasi Anda memanggil BillingClient.queryPurchases() dalam metode onResume() dan onCreate() untuk memastikan semua pembelian berhasil diproses seperti yang dijelaskan dalam memproses pembelian.

Menangani pembelian yang dilakukan di luar aplikasi

Beberapa pembelian, seperti penukaran promosi, dapat terjadi di luar aplikasi Anda. Saat pengguna melakukan pembelian di luar aplikasi Anda, mereka berharap aplikasi Anda menampilkan pesan dalam aplikasi, atau menggunakan mekanisme notifikasi tertentu untuk memberi tahu pengguna bahwa aplikasi telah menerima dan memproses pembelian dengan benar. Beberapa mekanisme yang dapat diterima adalah:

  • Menampilkan pop-up dalam aplikasi.
  • Mengirim pesan ke kotak pesan dalam aplikasi, dan menyatakan dengan jelas bahwa ada pesan baru di kotak pesan dalam aplikasi.
  • Menggunakan pesan notifikasi OS.

Perlu diingat bahwa aplikasi Anda mungkin berada dalam keadaan apa pun saat aplikasi mengenali pembelian. Aplikasi Anda bahkan mungkin belum diinstal saat pembelian dilakukan. Pengguna berharap menerima pembelian mereka saat melanjutkan aplikasi, terlepas dari status aplikasi tersebut.

Anda harus mendeteksi pembelian terlepas dari status aplikasi saat pembelian dilakukan. Namun, ada beberapa pengecualian yang mungkin membuat kami tidak dapat segera memberi tahu pengguna bahwa item telah diterima. Contoh:

  • Selama bagian tindakan dalam game, di mana menampilkan pesan dapat mengalihkan perhatian pengguna. Dalam hal ini, Anda harus memberi tahu pengguna setelah bagian tindakan itu selesai.
  • Selama cutscene, di mana menampilkan pesan dapat mengganggu perhatian pengguna. Dalam hal ini, Anda harus memberi tahu pengguna setelah cutscene berakhir.
  • Selama tutorial awal dan bagian penyiapan pengguna dalam game. Sebaiknya beri tahu pengguna baru tentang bonus segera setelah mereka membuka game atau selama penyiapan pengguna awal. Namun, Anda masih dapat menunggu hingga urutan game utama tersedia untuk memberi tahu pengguna.

Selalu perhatikan pengguna saat memutuskan kapan dan bagaimana cara memberi tahu pengguna tentang pembelian yang dilakukan di luar aplikasi. Setiap kali pengguna tidak langsung menerima notifikasi, mereka mungkin akan bingung, dan dapat berhenti menggunakan aplikasi Anda, menghubungi dukungan pengguna, atau mengeluhkannya di media sosial.

Menangani transaksi yang tertunda

Google Play mendukung transaksi yang tertunda, atau transaksi yang memerlukan satu atau beberapa langkah tambahan antara saat pengguna memulai pembelian dan saat metode pembayaran untuk pembelian itu diproses. Aplikasi Anda tidak boleh memberikan hak atas jenis pembelian ini sampai Google memberi tahu Anda bahwa metode pembayaran pengguna berhasil ditagih.

Misalnya, pengguna dapat melakukan pembelian PENDING dari item dalam aplikasi dengan memilih uang tunai sebagai metode pembayaran. Selanjutnya, pengguna bisa memilih toko fisik tempat mereka akan menyelesaikan transaksi dan menerima kode melalui notifikasi dan email. Saat pengguna tiba di toko fisik, mereka dapat menukarkan kode dengan kasir dan membayar dengan uang tunai. Kemudian, Google memberi tahu Anda dan pengguna bahwa uang tunai telah diterima. Kemudian, aplikasi Anda dapat memberikan hak kepada pengguna.

Untuk mengaktifkan pembelian tertunda, panggil enablePendingPurchases() sebagai bagian dari proses inisialisasi aplikasi Anda.

Jika aplikasi Anda menerima pembelian baru, baik melalui PurchasesUpdatedListener atau sebagai hasil dari panggilan queryPurchases(), gunakan metode getPurchaseState() untuk menentukan apakah status pembelian adalah PURCHASED atau PENDING. Perlu diketahui bahwa sebaiknya Anda hanya memberikan hak jika pembelian tersebut berstatus PURCHASED. Jika aplikasi Anda berjalan saat pengguna menyelesaikan pembelian, PurchasesUpdatedListener akan dipanggil lagi, dan PurchaseState sekarang menjadi PURCHASED. Pada tahap ini, aplikasi Anda dapat memproses pembelian menggunakan metode standar untuk memproses pembelian satu kali. Aplikasi Anda juga harus memanggil queryPurchases() di metode onResume() dan onCreate() aplikasi untuk menangani pembelian yang telah dialihkan ke status PURCHASED saat aplikasi Anda tidak berjalan.

Aplikasi juga dapat menggunakan Notifikasi developer real time dengan pembelian tertunda dengan cara mendengarkan OneTimeProductNotifications. Saat pembelian bertransisi dari PENDING ke PURCHASED, aplikasi Anda akan menerima notifikasi ONE_TIME_PRODUCT_PURCHASED. Jika pembelian dibatalkan, aplikasi Anda akan menerima notifikasi ONE_TIME_PRODUCT_CANCELED. Hal ini dapat terjadi jika pelanggan tidak menyelesaikan pembayaran dalam jangka waktu yang diperlukan. Saat menerima notifikasi ini, Anda dapat menggunakan Google Play Developer API yang menyertakan status PENDING untuk Purchases.products.