Teste de facturação na aplicação: android.teste.adquiridos já propriedade

estou actualmente a testar a facturação de uma aplicação futura, e depois de "ter comprado" com sucesso o item de teste "android.teste.comprado " a primeira vez, eu agora recebo o código de Resposta 7 cada vez que eu tento comprá-lo novamente, o que significa que eu já possui este item.

12-15 23:02:14.149: e / IabHelper(19829): erro de facturação na aplicação: incapaz para comprar o item, resposta de Erro: 7: Item já propriedade

Pelo que sei, esta compra deve ser sempre possível., certo? Para que o desenvolvedor possa testar a sua aplicação?

Se não, como posso "reiniciar" o seu estado para não ser dono? Estou usando o pacote util da amostra de faturamento do Google In-App.

Author: Pang, 2012-12-16

16 answers

Adicione este código a um tópico para iniciar o pedido de consumo.

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

Aqui para o teste de compra, purchaseToken é

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

E

if (response == 0)

Então o consumo é bem sucedido.

 99
Author: Aashutosh Sharma, 2017-01-12 01:37:08
Não é necessário escrever nenhum código de consumo especial. Basta usar o comando adb para limpar os dados do Google Play Store:
adb shell pm clear com.android.vending
 74
Author: mttmllns, 2015-12-08 21:11:23
Acontece que o andróide.teste.o item comprado comporta-se como um ID normal. Significa que se você quiser ser capaz de comprá-lo novamente, você tem que consumi-lo em algum lugar em seu código. Eu acho que a documentação do Google é enganosa sobre este assunto, e que eles devem adicionar outro ID estático que você pode comprar infinitamente para fins de teste.
 57
Author: psykhi, 2012-12-16 00:30:19

In-app version 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);
        }
    }
};
 27
Author: embo, 2013-03-16 18:39:38

Version3 : Limpar a 'cache' da Play Store do Google permitirá "android.teste.comprado " disponível novamente.

 9
Author: Denis, 2017-02-03 09:58:06

É assim que podemos consumir o Item

 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();
        }
    });
 8
Author: Shivaraj Patil, 2014-09-13 14:47:01

Na minha opinião, se o seu programa não foi concebido para consumir o item, não precisa de ajustar o código para limpar a memória de um vendedor externo. Isto tornará o seu código mais frágil e você terá que gastar muito tempo para adicionar e remover código que não pertence ao seu software, por isso é um mau design para implementar uma solução como essa.

A melhor solução que me deu para limpar o android.teste.comprado era
adb uninstall com.yourapp.name

E depois

adb shell pm clear com.android.vending

Eu não precisava de levantar dinheiro e navegar na configuração das minhas aplicações ou mudar de código para isso. Eu precisava adicionar o adb ao path variáveis do sistema windows que era bastante direto para a frente. Então sim você precisa usar adb que você provavelmente precisa de qualquer maneira assim..

Basta adicionar o seu C:\...\android-sdk\platform-tools; in Windows path in environment variables, and I imagine that it is pretty simple in mac and linux os as well. Espero que ajude alguém a passar menos uns dias com implementando android em app billings.
 5
Author: sivi, 2015-10-18 11:44:19

Usei a casca adb:

adb shell pm clear com.android.vending
 3
Author: Shwarz Andrei, 2017-07-20 13:58:01

O principal problema é que você tem que consumir o item android.test.purchased. Mas este item não estará disponível em seu inventário de consulta, então você não pode consumir usando o fluxo normal.

Então, se estiver a usar o IabHelper, na classe IabHelper, pode mudar temporariamente o serviço IInAppBillingService para o público de modo a que seja acessível a partir do seu IabHelper.

Então, na tua aula, podes consumir assim.
int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");

Se o sucesso, a resposta será 0.

Espero que isto ajude.
 2
Author: Tang Tung Ai, 2018-03-10 18:48:11

Se estiver em ambiente de ensaio

No caso do android.teste.comprado, eu posso resetar o pagamento falso reiniciando o dispositivo android (consumido o inventário).

2) no InApp util há um arquivo chamado Segurança.java torná-lo como a seguir, por temporário. Desde que o pagamento teste (falso) sempre retornar falso devido à exceção de segurança.

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

Depois, na sua única compra, o Finishedlistener call fechinv forconsumeitem ()

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

            }

        }
    };
O fechInvForconsumeItem() riz[6]}
    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);
        }


    }
};

Consuma Listener is

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

                if (result.isSuccess()) {
                } else {
                    // handle error
                    Log.e("11","sucConsume");
                }
            }
        };
 1
Author: Ebin Joy, 2016-12-27 17:58:45

Para efeitos de teste, também sugiro que insira um código que estará a limpar todos os produtos que comprou antes de invocar um método que inicialize o fluxo de compra gp. Isso é especialmente confortável, quando você testa apenas um item no momento. Por exemplo:

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);
 1
Author: sodiumnitrat, 2017-07-08 18:30:39

Vá à consola de Jogo do Google e abra a página de gestão de encomendas. Lá você pode reembolsar / cancelar as compras de teste.

 1
Author: Sai Nadh, 2017-09-06 13:13:31
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();
            }
       }

    };
 0
Author: Girish Patel, 2015-02-06 10:29:49
[[1]Esta é a diferença entre itens consumíveis e não consumíveis; itens não consumíveis (o que você parece estar lidando aqui) têm seu estado rastreado persistentemente, enquanto itens consumíveis podem ser comprados várias vezes. Você terá que ir para a sua consola de gestão de jogo e cancelar/reembolsar a venda para testá-lo novamente.
 -1
Author: addaon, 2012-12-15 22:52:53
No meu caso, parece que o Google não regista uma compra para o item. Em vez disso, a cópia local do Google Play Services cache a compra. Assim, quando um segundo pedido é feito no mesmo dispositivo, android.test.purchased already owned aparece. No entanto, usando outro dispositivo ou redefinindo o dispositivo limpa o cache, e permite que a compra seja repetida.
 -1
Author: Tad, 2015-04-22 08:23:59
No meu caso, só precisava de limpar o esconderijo do apps. Depois de limpar o tesouro, fui capaz de iniciar o fluxo de compra novamente.

Do meu dispositivo (4.4.2), naveguei para "configuração->Gestor de aplicações". Em seguida, eu selecionei o aplicativo a partir da página "baixado", e em seguida,"Limpar cache".

 -1
Author: user6089948, 2016-03-20 15:34:10