Catatan rilis Library Layanan Penagihan Google Play

Topik ini berisi catatan rilis untuk library Layanan Penagihan Google Play.

Rilis Library Layanan Penagihan Google Play 2.0.3 (05-08-2019)

Library Layanan Penagihan Google Play versi 2.0.3 kini telah tersedia.

Perbaikan bug

  • Memperbaiki bug ketika querySkuDetailsAsync() kadang gagal dengan kode DEVELOPER_ERROR bukan menampilkan hasil yang berhasil.

Rilis Library Layanan Penagihan Google Play 2.0.2 (08-07-2019)

Library Layanan Penagihan Google Play versi 2.0.2 kini telah tersedia. Rilis ini berisi pembaruan pada dokumentasi referensi dan tidak mengubah fungsi library.

Rilis Library Layanan Penagihan Google Play 2.0.1 (06-06-2019)

Library Layanan Penagihan Google Play versi 2.0.1 sekarang tersedia. Versi ini berisi perubahan berikut.

Perbaikan bug

  • Memperbaiki bug saat pesan debug ditampilkan sebagai null dalam beberapa kasus.
  • Memperbaiki potensi masalah kebocoran memori.

Rilis Library Layanan Penagihan Google Play 2.0 (07-05-2019)

Library Layanan Penagihan Google Play versi 2.0 sekarang tersedia. Versi ini berisi perubahan berikut.

Pembelian harus dikonfirmasi dalam waktu tiga hari

Google Play mendukung pembelian produk dari dalam aplikasi Anda (dalam aplikasi) atau di luar aplikasi Anda (di luar aplikasi). Agar Google Play dapat memberikan pengalaman pembelian yang konsisten di mana pun pengguna membeli produk Anda, Anda harus mengonfirmasi semua pembelian yang diterima melalui Library Layanan Penagihan Google Play sesegera mungkin setelah memberikan hak kepada pengguna. Jika Anda tidak mengonfirmasi pembelian dalam waktu tiga hari, pengguna akan otomatis menerima pengembalian dana, dan Google Play mencabut pembelian tersebut. Untuk transaksi yang tertunda (baru di versi 2.0), rentang waktu tiga hari ini dimulai saat pembelian berstatus SUCCESS dan tidak berlaku selama pembelian berstatus PENDING.

Untuk langganan, Anda harus mengonfirmasi setiap pembelian yang memiliki token pembelian baru. Ini berarti semua pembelian awal, perubahan paket, dan pendaftaran ulang harus dikonfirmasi, tetapi Anda tidak perlu mengonfirmasi perpanjangan selanjutnya. Untuk menentukan apakah pembelian memerlukan konfirmasi, Anda dapat memeriksa kolom konfirmasi pada pembelian.

Objek Purchase sekarang mencakup metode isAcknowledged() yang menunjukkan apakah pembelian telah dikonfirmasi atau belum. Selain itu, Google Play Developer API menyertakan nilai boolean konfirmasi untuk Purchases.products dan Purchases.subscriptions. Sebelum mengonfirmasi pembelian, pastikan menggunakan metode ini untuk menentukan apakah pembelian telah dikonfirmasi atau belum.

Anda dapat mengonfirmasi pembelian menggunakan salah satu metode berikut:

  • Untuk produk habis pakai, gunakan consumeAsync() yang tercantum dalam API klien.
  • Untuk produk tidak habis pakai, gunakan acknowledgePurchase() yang tercantum dalam API klien.
  • Metode acknowledge() baru juga tersedia di API server.

BillingFlowParams.setSku() dihapus

Metode BillingFlowParams#setSku() yang sebelumnya dinyatakan tidak digunakan lagi sekarang telah dihapus dari rilis ini. Sebelum merender produk dalam alur pembelian, terlebih dahulu Anda harus memanggil BillingClient.querySkuDetailsAsync(), yang akan meneruskan objek SkuDetails yang dihasilkan ke BillingFlowParams.Builder.setSkuDetails().

Untuk contoh kode, lihat Menggunakan Library Layanan Penagihan Google Play.

Payload developer didukung

Library Layanan Penagihan Google Play versi 2.0 menambahkan dukungan untuk payload developer — string arbitrer yang dapat ditambahkan ke pembelian. Anda dapat menambahkan parameter payload developer ke pembelian, tetapi hanya setelah pembelian dikonfirmasi atau dipakai. Ini berbeda dengan payload developer di AIDL, di mana payload dapat ditentukan saat memulai alur pembelian. Karena pembelian sekarang dapat diinisialisasi dari luar aplikasi, perubahan ini memastikan bahwa Anda selalu memiliki kesempatan untuk menambahkan payload ke pembelian.

Untuk mengakses payload di library baru, objek Purchase sekarang menyertakan metode getDeveloperPayload() .

Penawaran yang konsisten

Saat Anda menawarkan SKU diskon, Google Play sekarang menampilkan harga asli SKU tersebut sehingga Anda dapat menunjukkan kepada pengguna bahwa mereka mendapatkan diskon.

SkuDetails berisi dua metode baru untuk mengambil harga asli SKU:

Transaksi yang tertunda

Pada library Layanan Penagihan Google Play versi 2.0, Anda harus mendukung pembelian yang memerlukan tindakan tambahan sebelum hak diberikan. Misalnya, pengguna mungkin memilih untuk membeli produk dalam aplikasi Anda di toko fisik menggunakan uang tunai. Ini berarti transaksi diselesaikan di luar aplikasi Anda. Dalam skenario ini, sebaiknya Anda hanya memberikan hak setelah pengguna menyelesaikan transaksi tersebut.

Untuk mengaktifkan pembelian tertunda, panggil enablePendingPurchases() sebagai bagian dari menginisialisasi aplikasi.

Gunakan Purchase.getState() untuk menentukan apakah pembelian berstatus PURCHASED atau PENDING. Perlu diperhatikan bahwa sebaiknya Anda hanya memberikan izin jika pembelian tersebut berstatus PURCHASED. Anda harus memeriksa pembaruan status Purchase dengan melakukan tindakan berikut:

  1. Saat memulai aplikasi, panggil BillingClient.queryPurchases() untuk mengambil daftar produk tidak habis pakai yang terkait dengan pengguna.
  2. Panggil Purchase.getState() untuk setiap objek Purchase yang ditampilkan.
  3. Terapkan metode onPurchasesUpdated() untuk merespons perubahan pada objek Purchase.

Selain itu, Google Play Developer API menyertakan status PENDING untuk Purchases.products. Transaksi yang tertunda tidak didukung untuk berlangganan.

Rilis ini juga memperkenalkan jenis notifikasi developer real-time baru, OneTimeProductNotification. Jenis notifikasi ini berisi satu pesan yang nilainya adalah INAPP_PURCHASED atau INAPP_CANCELED. Jenis notifikasi ini dikirim hanya untuk pembelian yang terkait dengan metode pembayaran tertunda, seperti uang tunai.

Saat mengonfirmasi pembelian yang tertunda, pastikan untuk mengonfirmasi hanya jika pembelian berstatus SUCCESS, bukan PENDING.

Perubahan API

Library Layanan Penagihan Google Play versi 2.0 memuat beberapa perubahan API untuk mendukung fitur baru dan memperjelas fungsionalitas yang telah ada.

consumeAsync

consumeAsync() sekarang mengambil objek ConsumeParams bukan purchaseToken. ConsumeParams berisi purchaseToken serta payload developer opsional.

Versi consumeAsync() sebelumnya telah dihapus dalam rilis ini.

queryPurchaseHistoryAsync

Untuk meminimalkan kebingungan, queryPurchaseHistoryAsync() sekarang menampilkan objek PurchaseHistoryRecord bukan objek Purchase. Objek PurchaseHistoryRecord sama dengan objek Purchase, tetapi bedanya objek ini hanya mencerminkan nilai yang ditampilkan oleh queryPurchaseHistoryAsync() dan tidak memiliki kolom autoRenewing, orderId, dan packageName. Perhatikan bahwa tidak ada yang berubah pada data yang ditampilkan— queryPurchaseHistoryAsync() menampilkan data yang sama dengan sebelumnya.

Nilai kembalian BillingResult

API yang sebelumnya menampilkan nilai bilangan bulat BillingResponse sekarang menampilkan objek BillingResult . BillingResult berisi bilangan bulat BillingResponse serta string debug yang dapat Anda gunakan untuk mendiagnosis error. String debug ini menggunakan lokal en-US dan tidak dimaksudkan untuk ditampilkan kepada pengguna akhir.

Perbaikan bug

Rilis Library Layanan Penagihan Google Play 1.2.2 (07-03-2019)

Library Layanan Penagihan Google Play versi 1.2.2 sekarang tersedia. Versi ini berisi perubahan berikut.

Perbaikan bug

  • Perbaikan untuk masalah threading yang diperkenalkan pada v1.2.1. Panggilan latar belakang tidak lagi memblokir thread utama.

Perubahan lainnya

  • Meskipun penggunaan thread utama tetap direkomendasikan, sekarang Anda dapat membuat instance Library Layanan Penagihan Google Play dari thread latar belakang.
  • Pembuatan instance telah dimigrasikan sepenuhnya ke thread latar belakang untuk mengurangi kemungkinan terjadinya ANR (aplikasi tidak merespons).

Rilis Library Layanan Penagihan Play 1.2.1 (04-03-2019)

Library Layanan Penagihan Google Play versi 1.2.1 sekarang tersedia. Versi ini berisi perubahan berikut.

Perubahan utama

Perubahan lainnya

  • Penambahan konstruktor publik untuk PurchasesResult dan SkuDetailsResult guna mempermudah pengujian.
  • Objek SkuDetails dapat menggunakan metode baru, getOriginalJson().
  • Semua panggilan layanan AIDL sekarang ditangani oleh thread latar belakang.

Perbaikan bug

  • Pemroses nullback nol tidak lagi diteruskan ke API publik.

Rilis Library Layanan Penagihan Google Play 1.2 (18-10-2018)

Library Layanan Penagihan Google Play versi 1.2 sekarang tersedia. Versi ini berisi perubahan berikut.

Ringkasan perubahan

  • Library Layanan Penagihan Google Play sekarang dilisensikan berdasarkan Perjanjian Lisensi Software Development Kit Android.
  • Penambahan API launchPriceChangeConfirmationFlow, yang meminta pengguna untuk meninjau perubahan dalam proses untuk harga langganan.
  • Penambahan dukungan untuk mode penghitungan prorata baru, DEFERRED, saat mengupgrade atau mendowngrade langganan pengguna.
  • Pada class BillingFlowParams, setSku() diganti dengan setSkuDetails().
  • Perbaikan bug minor dan pengoptimalan kode.

Konfirmasi perubahan harga

Sekarang Anda dapat mengubah harga langganan di Konsol Google Play dan meminta pengguna meninjau dan menerima harga baru saat mereka memasuki aplikasi Anda.

Untuk menggunakan API ini, buatlah objek PriceChangeFlowParams dengan menggunakan skuDetails produk langganan, lalu panggil launchPriceChangeConfirmationFlow(). Terapkan PriceChangeConfirmationListener untuk menangani hasilnya setelah alur konfirmasi perubahan harga selesai, seperti ditunjukkan dalam cuplikan kode berikut:

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                // Handle the result.
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams =
        PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                // Handle the result.
            }
        });

Alur konfirmasi perubahan harga menampilkan dialog yang berisi informasi harga baru, yang meminta pengguna untuk menerima harga baru tersebut. Alur ini menampilkan kode respons jenis BillingClient.BillingResponse.

Mode penghitungan prorata baru

Saat mengupgrade atau mendowngrade langganan pengguna, Anda dapat menggunakan mode penghitungan prorata baru, DEFERRED. Mode ini memperbarui langganan pengguna pada perpanjangan berikutnya. Untuk mempelajari cara menetapkan mode penghitungan prorata ini lebih lanjut, lihat Menetapkan mode penghitungan prorata.

Metode baru untuk menetapkan detail SKU

Pada class BillingFlowParams, metode setSku() tidak lagi digunakan. Perubahan ini dimaksudkan untuk mengoptimalkan alur Layanan Penagihan Google Play.

Saat membuat instance BillingFlowParams baru pada klien penagihan dalam aplikasi, sebaiknya Anda menggunakan objek JSON secara langsung melalui setSkuDetails(), seperti ditunjukkan dalam cuplikan kode berikut:

Pada class Builder BillingFlowParams, metode setSku() tidak lagi digunakan. Sebagai gantinya, gunakan metode setSkuDetails(), seperti ditunjukkan dalam cuplikan kode berikut. Objek yang diteruskan ke objek setSkuDetails() berasal dari metode querySkuDetailsAsync() .

Kotlin

private lateinit var mBillingClient: BillingClient
private val mSkuDetailsMap = HashMap<String, SkuDetails>()

private fun querySkuDetails() {
    val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder()
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build()
    ) { responseCode, skuDetailsList ->
        if (responseCode == 0) {
            for (skuDetails in skuDetailsList) {
                mSkuDetailsMap[skuDetails.sku] = skuDetails
            }
        }
    }
}

private fun startPurchase(skuId: String) {
    val billingFlowParams = BillingFlowParams.newBuilder()
    .setSkuDetails(mSkuDetailsMap[skuId])
    .build()
}

Java

private BillingClient mBillingClient;
private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>();

private void querySkuDetails() {
    SkuDetailsParams.Builder skuDetailsParamsBuilder
            = SkuDetailsParams.newBuilder();
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(),
            new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(int responseCode,
                        List<SkuDetails> skuDetailsList) {
                    if (responseCode == 0) {
                        for (SkuDetails skuDetails : skuDetailsList) {
                            mSkuDetailsMap.put(skuDetails.getSku(), skuDetails);
                        }
                    }
                }
            });
}

private void startPurchase(String skuId) {
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(mSkuDetailsMap.get(skuId))
            .build();
}

Rilis Library Layanan Penagihan Play 1.1 (07-05-2018)

Library Layanan Penagihan Google Play versi 1.1 sekarang tersedia. Versi ini berisi perubahan berikut.

Ringkasan perubahan

  • Penambahan dukungan untuk menentukan mode penghitungan prorata dalam BillingFlowParams saat mengupgrade/mendowngrade langganan yang ada.
  • Flag boolean replaceSkusProration di BillingFlowParams tidak didukung lagi. Gunakan replaceSkusProrationMode sebagai gantinya.
  • launchBillingFlow() sekarang memicu callback untuk respons yang gagal.

Perubahan perilaku

Library Layanan Penagihan Google Play versi 1.1 memuat perubahan perilaku berikut.

Developers dapat menetapkan replaceSkusProrationMode pada class BillingFlowParams

ProrationMode memberikan penjelasan lebih lanjut tentang jenis penghitungan prorata saat mengupgrade atau mendowngrade langganan pengguna.

Kotlin

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build()

Java

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build();

Saat ini, Google Play mendukung mode penghitungan prorata berikut:

IMMEDIATE_WITH_TIME_PRORATION Penggantian akan langsung diterapkan, dan waktu habis masa berlaku yang baru akan dihitung secara prorata dan dikreditkan atau ditagihkan kepada pengguna. Ini merupakan perilaku default saat ini.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE Penggantian akan langsung diterapkan, dan siklus penagihan tetap sama. Harga untuk periode yang tersisa akan ditagih.

Catatan: Opsi ini hanya tersedia untuk upgrade langganan.

IMMEDIATE_WITHOUT_PRORATION Penggantian akan langsung diterapkan, dan harga baru akan ditagih pada waktu pengulangan berikutnya. Siklus penagihan tetap sama.

replaceSkusProration tidak didukung lagi pada class BillingFlowParams

Sebelumnya, developer dapat menetapkan flag boolean untuk menagih jumlah prorata untuk suatu permintaan upgrade langganan. Mengingat kami mendukung ProrationMode, yang memuat instruksi penghitungan prorata yang lebih terperinci, flag boolean ini tidak didukung lagi.

launchBillingFlow() sekarang memicu callback untuk respons yang gagal

Library Penagihan akan selalu memicu callback PurhcasesUpdatedListener dan menampilkan BillingResponse secara asinkron. Nilai balikan sinkron dari BillingResponse juga dipertahankan.

Perbaikan bug

  • Keluar awal dengan benar pada metode asinkron saat koneksi layanan terputus.
  • Objek parameter Builder tidak lagi mengubah objek yang dibuat.
  • Masalah 68087141: launchBillingFlow() sekarang memicu callback untuk respons yang gagal.

Rilis Library Layanan Penagihan Google Play 1.0 (19-09-2017, Pengumuman)

Library Layanan Penagihan Google Play versi 1.0 sekarang tersedia. Versi ini berisi perubahan berikut.

Perubahan penting

  • Izin penagihan yang disematkan ke dalam manifes library. Penambahan izin com.android.vending.BILLING di dalam manifes Android tidak diperlukan lagi.
  • Builder baru ditambahkan ke class BillingClient.Builder .
  • Pola builder baru diperkenalkan untuk class SkuDetailsParams yang akan digunakan sebagai metode untuk mengirimkan kueri ke SKU.
  • Beberapa metode API diupdate agar konsisten (urutan dan nama argumen kembalian yang sama).

Perubahan perilaku

Library Layanan Penagihan Google Play versi 1.0 memuat perubahan perilaku berikut.

Class BillingClient.Builder

BillingClient.Builder sekarang diinisialisasi melalui pola newBuilder:

Kotlin

billingClient = BillingClient.newBuilder(context).setListener(this).build()

Java

billingClient = BillingClient.newBuilder(context).setListener(this).build();

Metode launchBillingFlow sekarang dipanggil menggunakan class BillingFlowParams

Untuk memulai alur penagihan untuk pembelian atau langganan, metode launchBillingFlow() menerima instance BillingFlowParams ang diinisialisasi dengan parameter khusus untuk permintaan itu:

Kotlin

BillingFlowParams.newBuilder().setSku(skuId)
        .setType(billingType)
        .setOldSku(oldSku)
        .build()

// Then, use the BillingFlowParams to start the purchase flow
val responseCode = billingClient.launchBillingFlow(builder.build())

Java

BillingFlowParams.newBuilder().setSku(skuId)
                              .setType(billingType)
                              .setOldSku(oldSku)
                              .build();

// Then, use the BillingFlowParams to start the purchase flow
int responseCode = billingClient.launchBillingFlow(builder.build());

Cara baru untuk mengirim kueri produk yang tersedia

Argumen untuk metode queryPurchaseHistoryAsync() dan querySkuDetailsAsync() digabung ke dalam pola Builder:

Kotlin

val params = SkuDetailsParams.newBuilder()
params.setSkusList(skuList)
        .setType(itemType)
billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() {
    ...
})

Java

SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList)
        .setType(itemType);
billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})

Hasilnya sekarang ditampilkan melalui kode hasil dan daftar objek SkuDetails bukan class wrapper sebelumnya agar lebih praktis bagi Anda dan konsisten di seluruh API kami:

Kotlin

fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)

Java

public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)

Perubahan urutan parameter pada metode onConsumeResponse()

Urutan argumen untuk onConsumeResponse dari antarmuka ConsumeResponseListener telah diubah agar konsisten di seluruh API kami:

Kotlin

fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)

Java

public void onConsumeResponse(@BillingResponse int responseCode, String outToken)

Objek PurchaseResult dibuka

PurchaseResult telah dibuka agar konsisten di seluruh API kami:

Kotlin

fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)

Java

void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)

Perbaikan bug

Rilis Pratinjau Developer 1 (12-06-2017, Pengumuman)

Pratinjau developer diluncurkan, dengan tujuan menyederhanakan proses pengembangan dalam kaitannya dengan penagihan, agar developer dapat memfokuskan upaya mereka pada penerapan logika khusus untuk aplikasi Android, seperti arsitektur aplikasi dan struktur navigasi.

Library ini menyertakan beberapa class dan fitur praktis yang dapat Anda gunakan saat mengintegrasikan aplikasi Android Anda dengan Google Play Billing API. Library ini juga menyediakan lapisan abstraksi selain layanan Android Interface Definition Language (AIDL), yang memudahkan developer untuk menentukan antarmuka antara aplikasi dan Google Play Billing API.