Belanja Android - Mainkan Perpustakaan Penagihan

gambar

Dan bagaimana masih belum ada artikel tentang Habré tentang ini? Tidak masalah, perlu untuk memperbaikinya.

Ada 2 cara untuk menambahkan pembelian dalam aplikasi ke aplikasi Android Anda - lama dan baru. Hingga 2017, semua orang menggunakan perpustakaan dari anjlab, tetapi sejak Juni 2017 situasinya telah berubah, Google merilis perpustakaannya sendiri untuk pembelian dan langganan internal - Play Billing Library. Sekarang yang terakhir dianggap standar.

Play Billing Library sangat sederhana.

Hubungkan ketergantungan.

implementation 'com.android.billingclient:billing:1.2' 

Tambahkan izin dalam manifes.

 <uses-permission android:name="com.android.vending.BILLING"/> 

Buat instance BillingClient dan mulai koneksi.

 private BillingClient mBillingClient; ... mBillingClient = BillingClient.newBuilder(this).setListener(new PurchasesUpdatedListener() { @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //       } } }).build(); mBillingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         } } @Override public void onBillingServiceDisconnected() { //    -    } }); 

Kami masuk ke metode onPurchasesUpdated () ketika pembelian dilakukan, dalam metode onBillingSetupFinished () Anda dapat meminta informasi tentang barang dan pembelian.

Minta informasi produk. Masukkan querySkuDetails () di onBillingSetupFinished () .

 private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>(); private String mSkuId = "sku_id_1"; ... @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         querySkuDetails(); //   } } ... private void querySkuDetails() { SkuDetailsParams.Builder skuDetailsParamsBuilder = SkuDetailsParams.newBuilder(); List<String> skuList = new ArrayList<>(); skuList.add(mSkuId); skuDetailsParamsBuilder.setSkusList(skuList).setType(BillingClient.SkuType.INAPP); 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); } } } }); } 

Dalam kode, Anda mungkin memperhatikan konsep SKU, apa itu? SKU - dari Unit Penyimpanan Saham Inggris (pengidentifikasi barang komoditas).

Sekarang di mSkuDetailsMap kami memiliki semua informasi tentang produk (nama, deskripsi, harga) yang terdaftar di Play Console dari aplikasi ini (lebih lanjut tentang itu nanti). Perhatikan skuList.add baris ini (mSkuId); , di sini kami menambahkan id produk dari Play Console, daftar di sini semua produk yang ingin Anda berinteraksi. Kami memiliki satu produk —sku_id_1.

Semuanya siap memenuhi permintaan pembelian. Kami melewati id produk. Jalankan metode ini, misalnya, dengan mengklik tombol.

 public void launchBilling(String skuId) { BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(mSkuDetailsMap.get(skuId)) .build(); mBillingClient.launchBillingFlow(this, billingFlowParams); } 

Sekarang, dengan menjalankan metode ini, Anda akan melihat kotak dialog ini (sekitar Gambar dari Internet).

gambar

Sekarang, jika pengguna membeli barang - mereka harus menyediakannya. Tambahkan metode payComplete () dan lakukan tindakan di dalamnya yang memberikan akses ke produk yang dibeli. Misalnya, jika pengguna membeli pemutusan iklan, buat metode ini agar iklan tidak lagi muncul.

 ... @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //       payComplete(); } } ... 

Semuanya baik-baik saja, tetapi jika pengguna me-restart aplikasi, program kami tidak tahu apa-apa tentang pembelian. Penting untuk meminta informasi tentang mereka. Lakukan di onBillingSetupFinished () .

 @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         querySkuDetails(); //   List<Purchase> purchasesList = queryPurchases(); //   //   ,    for (int i = 0; i < purchasesList.size(); i++) { String purchaseId = purchasesList.get(i).getSku(); if(TextUtils.equals(mSkuId, purchaseId)) { payComplete(); } } } } ... private List<Purchase> queryPurchases() { Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP); return purchasesResult.getPurchasesList(); } 

Dalam pembelian, Daftar mendapat daftar semua pembelian yang dilakukan oleh pengguna.

Kami melakukan pemeriksaan: jika barang dibeli, jalankan payComplete () .

Selesai Tetap mempublikasikan aplikasi ini di Play Console dan menambahkan produk. Cara menambahkan produk: Deskripsi halaman aplikasi > Konten untuk dijual > Buat konten terbatas .

Catatan 1 : Anda tidak akan dapat menambahkan barang sampai Anda mengunggah aplikasi build ke Play Console.

Catatan 2 : Untuk melihat dialog pembelian, Anda perlu mengunggah build ke Play Console, tambahkan produk dan tunggu sebentar (~ 30 menit - 1 jam - 3 jam) hingga produk diperbarui, hanya setelah kotak dialog muncul dan Anda dapat akan melakukan pembelian.

Catatan 3 : Harap perbaiki kesalahan input params. SKU tidak boleh null - produk di Play Console belum diperbarui, harap tunggu.

Catatan 4 : Anda dapat menemukan Kesalahan Galat "Transaksi Anda tidak dapat diselesaikan" , dalam log sebagai kode respons 6, saat Anda akan menguji. Untuk alasan apa hal ini terjadi pada saya tidak diketahui secara pasti, tetapi menurut pengamatan saya, ini terjadi setelah sering dimanipulasi dengan pembelian dan pengembalian barang. Untuk mengatasinya, buka menu kartu bank dan transfer kartu Anda. Bagaimana cara menghindarinya? Tambahkan akun Anda ke Play Console sebagai tester dan beli hanya dari kartu tes.

Demo di github

Beli saya kopi

(Omong-omong, sistem donet berfungsi di Habr dengan tombol di bawah artikel - kira-kira Moderator).

Source: https://habr.com/ru/post/id444072/


All Articles