Pengujian Penagihan Dalam Aplikasi: android.test.purchased sudah dimiliki

122

Saat ini saya menguji Penagihan Dalam Aplikasi untuk aplikasi di masa mendatang, dan setelah saya berhasil "membeli" item uji "android.test.purchased" untuk pertama kalinya, sekarang saya menerima kode respons 7 setiap kali saya mencoba membelinya lagi, yang berarti saya sudah memiliki item ini.

12-15 23: 02: 14.149: E / IabHelper (19829): Kesalahan penagihan dalam aplikasi: Tidak dapat membeli item, Respons kesalahan: 7: Item Sudah Dimiliki

Dari apa yang saya pahami, pembelian ini seharusnya selalu memungkinkan, bukan? Agar pengembang dapat menguji aplikasinya?

Jika tidak, bagaimana cara "mereset" statusnya menjadi tidak dimiliki? Saya menggunakan paket util dari Contoh Penagihan Dalam Aplikasi Google.

psykhi
sumber
1
perekrutan saya adalah ayat-ayat vise .. saya perlu pesan sudah dimiliki tetapi setiap kali memungkinkan untuk membeli
Sandeep P

Jawaban:

109

Tambahkan kode ini ke utas untuk memulai permintaan konsumsi.

int response = mService.consumePurchase(3, getPackageName(), purchaseToken);

Di sini untuk tes pembelian, purchaseToken adalah

purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";

Dan

if (response == 0)

maka konsumsi berhasil.

juga jangan lupa untuk membuat mService menjadi publik di

IabHelper.Java

maka dimungkinkan untuk mengakses seperti ini:

int response = mHelper.mService.consumePurchase(3, getPackageName(), purchaseToken);
Aashutosh Sharma
sumber
2
Legenda ini berhasil, @psykhi seharusnya benar-benar memberi Anda poin. Saya mencoba mengonsumsinya tetapi tidak dapat menemukan token pembelian. Terima kasih
Blundell
1
Terima kasih! @prasharonnet
Y2i
1
Ini adalah penghemat waktu yang sangat besar. Sempurna. Terima kasih.
PrivusGuru
13
Apa itu mService? mHelper? Tetapi saya tidak dapat menemukan ConsumPurchase ()
Bagusflyer
1
mService adalah objek dari antarmuka IInAppBillingService.aidl yang diikat dengan layanan pembelian yang dimulai untuk pembelian dalam aplikasi.
Aashutosh Sharma
92

Tidak perlu menulis kode konsumsi khusus. Cukup gunakan perintah adb untuk menghapus data Google Play Store:

adb shell pm clear com.android.vending
mttmllns
sumber
1
terima kasih itu melakukan trik saya hanya harus menghapus aplikasi juga jadi saya membuat jawaban lengkap tersedia. Ini adalah pendekatan yang tepat untuk saya.
sivi
Ini adalah pendekatan yang tepat untuk banyak orang. Menambahkan kode ke aplikasi Anda dan menerapkan ulang lebih memakan waktu (permainan kata-kata).
Michael Labbé
9
Ini adalah solusi yang baik untuk perangkat uji, tetapi hati-hati: ini akan mengatur ulang semua pengaturan Anda di aplikasi Google Play Store. Jadi, saya lebih suka tidak melakukannya di perangkat pribadi saya.
balapan
7
Tidak! Ini adalah ide yang buruk, Anda kehilangan pembelian dalam aplikasi dari produk Anda yang lain dan aplikasi lain, yang baik adalah Anda harus mengkonsumsi produk jika Anda ingin menguji pembelian dalam aplikasi Anda, skenario hanya membuat dua hal, satu untuk pembelian dan satu lagi untuk konsumsi yang dibeli barang.
Rahul Mandaliya
2
@RahulMandaliya, aplikasi Anda harus tahan terhadap pembersihan cache dengan menggunakan API getPurchases () untuk mengetahui apa yang telah dibeli.
mttmllns
66

Ternyata item android.test.purchased berperilaku seperti ID biasa. Artinya jika Anda ingin dapat membelinya lagi, Anda harus mengkonsumsinya di suatu tempat di kode Anda. Saya pikir dokumentasi Google menyesatkan tentang masalah ini, dan mereka harus menambahkan ID statis lain yang dapat Anda beli tanpa henti untuk tujuan pengujian.

psykhi
sumber
Gunakan panggilan inventaris untuk mengambil objek Pembelian dan kemudian mengkonsumsinya - ini cukup mudah setelah Anda memahaminya.
slott
3
Lihat jawaban di bawah ini dari @mttmlins, atau baca vvse.com/blog/blog/2016/08/26/…
IgorGanapolsky
Tidak sepenuhnya benar, saya memiliki kasus di mana ada soal tes yang tidak dikonsumsi, tetapi billingClient.queryPurchases()tidak kembali item yang tidak dikonsumsi, jadi sekarang saya tidak dapat mengkonsumsi barang karena saya tidak bisa mendapatkan purchaseTokenitu
Jemshit Iskenderov
28

Versi dalam aplikasi 3:

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {

    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

        .....................

        if (inventory.hasPurchase(SKU_CONTENT)) {

            mHelper.consumeAsync(inventory.getPurchase(SKU_CONTENT), null);
        }
    }
};
embo
sumber
Karena gambar bernilai seribu kata, sepotong kode tulang telanjang yang berfungsi lengkap bernilai seribu 'Tambahkan kode ini ke utas. . . '.
Androidcoder
11

Versi 3 - Cara tercepat untuk menyelesaikannya : Menghapus cache Google Play Store akan membuat "android.test.purchased" tersedia lagi.

Denis
sumber
Bukankah itu juga mempengaruhi aplikasi lain yang diinstal pada sistem?
IgorGanapolsky
1
@IgorGanapolsky, tidak. Hanya pembelian simulasi yang akan terpengaruh. Puchase "asli" disimpan di server Google, dan tidak akan diubah.
Denis
1
Saya telah menghapus data aplikasi Google Play tetapi tidak berhasil. Detail pembelian uji masih ada.
Srikar Reddy
2
@Richard melalui "pengaturan / manajer aplikasi /" atau menyeret ikon Google Play Store dari menu ke tombol "informasi" (di bagian atas layar). Terakhir, cukup klik tombol "hapus cache".
Denis
1
Jawaban terbaik untukku. Semua yang lain bagus, tapi yang ini pasti cara tercepat untuk mengatasinya
Ignacio Roda
10

saya menggunakan adb shell:

adb shell pm clear com.android.vending
Shwarz Andrei
sumber
9

Ini adalah bagaimana kita dapat mengkonsumsi Item tersebut

 consume.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    String purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
                    try {
                        Log.d("","Running");
                        int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
                        if(response==0)
                        {
                            Log.d("Consumed","Consumed");
                        }else {
                            Log.d("","No"+response);
                        }
                    }catch (RemoteException e)
                    {
                        Log.d("Errorr",""+e);
                    }

                }
            });
            t.start();
        }
    });
Shivaraj Patil
sumber
Berhasil untuk saya - telah menggunakan android.test.purchasetitik tertentu yang menyebabkan masalah - tugas inventaris dalam penagihan dalam aplikasi hanya menimbulkan banyak kesalahan dan tidak pernah selesai. Menjalankan ini sebagai satu kali membersihkannya sehingga saya dapat melanjutkan menggunakan saya ke SKU saya yang sebenarnya dan melanjutkan seperti sebelumnya. Terima kasih
Jon
1
Jawaban yang sangat bagus. Bekerja dengan Respons Statis = sebelum apk dengan Penagihan Dalam Aplikasi diaktifkan diunggah ke Google Play.
infero
Terima kasih! Bekerja untuk saya.
AndroidMechanic - Viral Patel
6

Menurut pendapat saya, jika program Anda tidak dirancang untuk mengonsumsi item, Anda tidak perlu mengubah kodenya untuk membersihkan memori vendor luar. Ini akan membuat kode Anda lebih rapuh dan Anda harus menghabiskan banyak waktu untuk menambah dan menghapus kode yang bukan milik perangkat lunak Anda, jadi menerapkan solusi seperti itu merupakan rancangan yang buruk.

Solusi terbaik yang berhasil bagi saya untuk menghapus android.test.purchased adalah

adb uninstall com.yourapp.name

lalu

adb shell pm clear com.android.vending

Saya tidak perlu menghapus uang tunai dan menelusuri pengaturan aplikasi saya atau mengubah kode untuk itu. Saya memang perlu menambahkan adb ke variabel jalur sistem windows yang cukup lurus ke depan. Jadi ya, Anda perlu menggunakan adb yang mungkin Anda butuhkan juga ..

Anda cukup menambahkan C: \ ... \ android-sdk \ platform-tools; di jalur windows di variabel lingkungan, dan saya membayangkan bahwa itu cukup sederhana di mac dan linux os juga. Semoga ini membantu seseorang menghabiskan beberapa hari lebih sedikit dengan menerapkan android dalam tagihan aplikasi.

sivi
sumber
uninstalltidak perlu menghapus sku android.test.purchased .
IgorGanapolsky
4

Masalah utamanya adalah Anda harus mengonsumsi android.test.purchaseditem tersebut. Tetapi item ini tidak akan tersedia di inventaris kueri Anda, jadi Anda tidak dapat menggunakan menggunakan aliran normal.

Jadi, jika Anda menggunakan IabHelper, di IabHelperkelas, Anda dapat mengubah IInAppBillingServicemService menjadi publik untuk sementara sehingga dapat diakses dari IabHelper Anda.

Kemudian di kelas Anda, Anda dapat mengonsumsi seperti ini,

int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");

Jika berhasil, responnya akan menjadi 0.

Semoga ini membantu.

Tang Tung Ai
sumber
Garis singgung: dapatkah Anda mengeluarkan pengembalian dana untuk item yang dikelola (dengan akun percobaan - sepertinya tidak muncul di dasbor)?
Ed Lee
Anda dapat menghubungi consumeAsync()di android.test.purchased . Tidak ada masalah dengan itu.
IgorGanapolsky
Untuk pengujian sederhana, ini adalah cara terbaik jika menggunakan IabHelper. Membantuku.
Rúben
2

Untuk tujuan pengujian, saya juga menyarankan Anda untuk memasukkan sepotong kode yang akan membersihkan semua produk yang Anda beli sebelum memanggil metode yang menginisialisasi aliran pembelian gp. Itu sangat nyaman, ketika Anda menguji hanya satu item pada saat ini. Misal seperti ini:

PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
    for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) {
        if(sourcePurchase != null){

            ConsumeResponseListener listener = new ConsumeResponseListener() {
                @Override
                public void onConsumeResponse(String outToken, @BillingResponse int responseCode) {

                    System.out.println("all consumed");
                }
            };
            mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener);
        }else{
            System.out.println("null");
        }
    }

// and then initiate whole process with clear "shoping basket"

BillingFlowParams.Builder builder = new BillingFlowParams.Builder()
        .setSku(itemName).setType(BillingClient.SkuType.INAPP);
sodiumnitrat.dll
sumber
2

buka konsol Google Play dan buka tab Manajemen Pesanan. Di sana Anda dapat mengembalikan / membatalkan pembelian percobaan.

Sai Nadh
sumber
1

Jika Anda berada di lingkungan pengujian

1) Dalam kasus android.test.purchased, saya dapat menyetel ulang pembayaran palsu dengan memulai ulang perangkat android (menggunakan inventaris).

2) Di InApp util ada file bernama Security.java membuatnya sebagai berikut, untuk sementara. Karena pembayaran pengujian (palsu) selalu mengembalikan palsu karena pengecualian keamanan.

public static boolean verifyPurchase(String base64PublicKey,
                                     String signedData, String signature) {
    return true; }

Kemudian di OnIabPurchaseFinishedListener Anda, panggil fechInvForconsumeItem ()

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
            = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result,
                                          Purchase purchase)
        {
            if (result.isFailure()) {
                // Handle error
                Log.e("123","Failure");

                return;
            }
            else if (purchase.getSku().equals(ITEM_SKU)) {
                Log.e("123","PURCAsed");
                fechInvForconsumeItem(); // Restart device if not consume

            }

        }
    };

FechInvForconsumeItem () adalah

    public void fechInvForconsumeItem() {
    mHelper.queryInventoryAsync(mReceivedInventoryListener);
}
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
        = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
                                         Inventory inventory) {


        if (result.isFailure()) {
            // Handle failure
            Log.e("11","Failure");



        } else {
            Log.e("11","suc");
            mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                    mConsumeFinishedListener);
        }


    }
};

Konsumsi Pendengar adalah

    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
        new IabHelper.OnConsumeFinishedListener() {
            public void onConsumeFinished(Purchase purchase,
                                          IabResult result) {

                if (result.isSuccess()) {
                } else {
                    // handle error
                    Log.e("11","sucConsume");
                }
            }
        };
Ebin Joy
sumber
0
IabHelper.QueryInventoryFinishedListener 
       mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
       public void onQueryInventoryFinished(IabResult result, Inventory inventory)   
       {
          if (result.isFailure()) {
             return;
           }          
          try {

                if(inventory.hasPurchase("product_sku_id"))
                {   
                     isItemEnable= true;
                     mHelper.consumeAsync(inventory.getPurchase("product_sku_id"),null);            
                }
                else
                {
                       isItemEnable = false;
                }           

            } catch (Exception e) {
                e.printStackTrace();
            }
       }

    };
Girish Patel
sumber
-1

Dalam kasus saya, tampaknya Google tidak mencatat pembelian item tersebut. Sebaliknya, salinan lokal Layanan Google Play menyimpan pembelian dalam cache. Dengan begitu, saat permintaan kedua dibuat di perangkat yang sama, android.test.purchased already ownedmuncul. Namun, menggunakan perangkat lain atau menyetel ulang perangkat akan menghapus cache, dan memungkinkan pembelian diulang.

Tad
sumber
-1

Dalam kasus saya, saya hanya perlu menghapus cache aplikasi. Setelah mengosongkan cache, saya dapat memulai aliran pembelian lagi.

Dari perangkat saya (4.4.2), saya menavigasi ke "Pengaturan-> Manajer aplikasi". Selanjutnya, saya memilih aplikasi dari tab "UNDUH", lalu "Kosongkan cache".

pengguna6089948
sumber
-2

Ini adalah perbedaan antara barang habis pakai dan barang tidak habis pakai; item yang tidak dapat dikonsumsi (yang tampaknya Anda hadapi di sini) statusnya terus dilacak, sementara item yang dapat dikonsumsi dapat dibeli beberapa kali. Anda harus masuk ke konsol manajemen Play dan membatalkan / mengembalikan uang penjualan untuk mengujinya lagi.

addaon
sumber
1
Tetapi masalahnya adalah saya tidak memiliki "kekuatan" pada barang "palsu" ini, dan saya tidak melihat di mana saya dapat mengubah status penjualan, karena itu bukan pembelian nyata. Dokumen google mengatakan tentang android.test.purchased: Saat Anda membuat permintaan Penagihan dalam Aplikasi dengan ID produk ini, Google Play merespons seolah-olah Anda berhasil membeli item. Jadi saya cukup bingung: /
psykhi
Apakah Anda masih melakukan pengujian respons statis? Jika demikian, Anda hanya perlu mengubah respons statis yang dikirim. Sepertinya Anda siap untuk "Menguji Pembelian Dalam Aplikasi Menggunakan ID Produk Anda Sendiri", yang melakukan pembelian nyata dengan pesanan yang dapat dibatalkan.
ditambahkan
Saya masih terjebak dengan ID statis. Yang saya inginkan adalah dapat menguji pembelian dalam aplikasi dengan ID android.test.purchased. Ini baru berfungsi pertama kali ketika seharusnya selalu bekerja dari apa yang saya pahami dari dokumen Google. Maaf jika saya tidak jelas!
psykhi
Salah tafsir saya, maaf. Kalau begitu ... Saya tidak tahu. Ini pasti akan kembali sukses setiap kali, saya belum melihat kasus yang Anda lihat. Maaf.
addaon
Akan mencoba untuk melihat lagi masalah setelah tidur malam yang nyenyak :) Terima kasih atas bantuan Anda!
psykhi