Test de facturation In-App: android.test.acheté en possédait déjà

Je teste actuellement la facturation intégrée à L'application pour une future application, et après avoir "acheté" avec succès l'élément de test "android".test.acheté " la première fois, je reçois maintenant le code de réponse 7 chaque fois que j'essaie de l'Acheter à nouveau, ce qui signifie que je possède déjà cet article.

12-15 23:02:14.149: E / IabHelper (19829): erreur de facturation intégrée: impossible pour acheter un article, réponse D'erreur: 7: Article déjà possédé

D'après ce que je comprends, cet achat est censé être toujours possible, droit? Afin que le développeur puisse tester son application?

Sinon, comment puis-je "réinitialiser" son état à non possédé? J'utilise le package util de L'exemple de facturation Google In-App.

97
demandé sur Pang 2012-12-16 02:09:07

16 réponses

Ajoutez ce code à un thread pour lancer une demande de consommation.

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

Ici pour le test d'achat, purchaseToken est

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

Et

if (response == 0)

Alors la consommation est réussie.

99
répondu Aashutosh Sharma 2017-01-12 01:37:08

Pas besoin d'écrire un code de consommation spécial. Utilisez simplement la commande adb pour effacer les données du Google Play Store:

adb shell pm clear com.android.vending
74
répondu mttmllns 2015-12-08 21:11:23

Il se trouve que l'androïde.test.l'article acheté se comporte comme un identifiant régulier. Cela signifie que si vous voulez pouvoir l'Acheter à nouveau, vous devez le consommer quelque part dans votre code. Je pense que la documentation de Google est trompeuse à ce sujet, et qu'ils devraient ajouter un autre ID statique que vous pouvez acheter sans fin à des fins de test.

57
répondu psykhi 2012-12-16 00:30:19

Dans l'application 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
répondu embo 2013-03-16 18:39:38

Version3 : Effacer le cache de Google Play Store laissera " android.test.acheté " disponible à nouveau.

9
répondu Denis 2017-02-03 09:58:06

C'est ainsi que nous pouvons consommer l'article

 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
répondu Shivaraj Patil 2014-09-13 14:47:01

, À mon avis, si votre programme n'est pas conçu pour consommer de l'élément que vous n'avez pas besoin de modifier le code afin d'effacer la mémoire d'un fournisseur extérieur. Cela rendra votre code plus fragile et vous devrez alors passer beaucoup de temps à ajouter et supprimer du code qui n'appartient pas à votre logiciel, donc c'est une mauvaise conception pour implémenter une solution comme ça.

La meilleure solution qui a fonctionné pour moi pour effacer android.test.acheté était

adb uninstall com.yourapp.name

, puis

adb shell pm clear com.android.vending

Je l'ai fait pas besoin d'effacer l'argent et de parcourir mes paramètres d'applications ou de changer de code pour cela. J'ai eu besoin d'ajouter l'adb aux variables de chemin du système windows qui était assez simple. Donc oui, vous devez utiliser adb dont vous avez probablement besoin de toute façon..

Vous ajoutez simplement votre C:\...\android-sdk \ platform-tools; dans le chemin windows dans les variables d'environnement, et j'imagine que c'est assez simple dans mac et linux os aussi. J'espère que cela aide quelqu'un à passer quelques jours de moins avec la mise en œuvre d'android dans l'application Billings.

5
répondu sivi 2015-10-18 11:44:19

J'ai utilisé adb shell:

adb shell pm clear com.android.vending
3
répondu Shwarz Andrei 2017-07-20 13:58:01

Le problème principal est que vous devez consommer l'élément android.test.purchased. Mais cet élément ne sera pas disponible dans votre inventaire de requêtes, vous ne pouvez donc pas consommer en utilisant le flux normal.

Donc, si vous utilisez IabHelper, dans la classe IabHelper, Vous pouvez temporairement changer le IInAppBillingService mService en public afin qu'il soit accessible depuis votre IabHelper.

Ensuite, dans votre classe, vous pouvez consommer comme ceci,

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

En cas de succès, la réponse sera 0.

J'espère que cela aide.

2
répondu Tang Tung Ai 2018-03-10 18:48:11

Si vous êtes dans un environnement de test

1) Dans le cas d'android.test.acheté, je peux réinitialiser le faux paiement en redémarrant l'appareil android (consommé l'inventaire).

2) dans InApp util il y a un fichier appelé Security.java le faire comme suit, pour temporaire. Puisque le paiement de test (faux) retourne toujours faux en raison d'une exception de sécurité.

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

Ensuite, dans votre oniabpurchasefinishedlistener appelez 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

            }

        }
    };

Le fechInvForconsumeItem() est

    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);
        }


    }
};

Consommer L'écouteur est

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

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

À des fins de test, je vous suggère également d'insérer un morceau de code qui effacera tous les produits que vous avez achetés avant d'appeler une méthode qui initialise GP purchase flow. C'est particulièrement confortable, lorsque vous testez un seul élément en ce moment. Par exemple, comme ceci:

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
répondu sodiumnitrat 2017-07-08 18:30:39

Accédez à la console Google Play et ouvrez L'onglet Gestion des commandes. Là, vous pouvez rembourser / annuler les achats de test.

1
répondu 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
répondu Girish Patel 2015-02-06 10:29:49

C'est la différence entre les articles consommables et non consommables; les articles non consommables (ce que vous semblez traiter ici) ont leur état suivi de manière persistante, tandis que les articles consommables peuvent être achetés plusieurs fois. Vous devrez aller dans votre console de gestion de jeu et annuler / rembourser la vente pour le tester à nouveau.

-1
répondu addaon 2012-12-15 22:52:53

Dans mon cas, il semble que Google n'enregistre pas un achat pour l'article. Au contraire, la copie locale des services Google Play met en cache l'achat. De cette façon, lorsqu'une deuxième requête est faite sur le même périphérique, android.test.purchased already owned apparaît. Cependant, l'utilisation d'un autre appareil ou la réinitialisation de l'appareil efface le cache et permet de répéter l'achat.

-1
répondu Tad 2015-04-22 08:23:59

Dans mon cas, j'avais juste besoin d'effacer le cache des applications. Après avoir effacé le cache, j'ai pu relancer le flux d'achat.

Depuis mon appareil (4.4.2), j'ai navigué vers "Paramètres- > Gestionnaire D'applications". Ensuite, j'ai sélectionné l'application dans l'onglet "téléchargé", puis "Effacer le cache".

-1
répondu user6089948 2016-03-20 15:34:10