web-dev-qa-db-fra.com

Test de facturation in-app: Android.test.purchased déjà possédé

Je teste actuellement la facturation intégrée pour une future application, et après avoir "acheté" avec succès l'élément de test "Android.test.purchased" 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 liée à l'application: article impossible à acheter, réponse d'erreur: 7: article déjà possédé

D'après ce que j'ai compris, cet achat est censé être toujours possible, non? Pour que le développeur puisse tester son application?

Si non, comment puis-je "réinitialiser" son état en non-propriétaire? J'utilise le package util de l'exemple de facturation Google In-App.

107
psykhi

Il s'avère que l'élément Android.test.purchased se comporte comme un identifiant standard. 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.

60
psykhi

Ajoutez ce code à un thread pour lancer la demande d'utilisation.

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

Ici, pour le test d'achat, buyToken est

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

Et

if (response == 0)

alors la consommation est réussie.

n'oubliez pas de rendre public mService dans

IabHelper.Java

alors il serait possible d'accéder comme ceci:

int response = mHelper.mService.consumePurchase(3, getPackageName(), purchaseToken);
106
Aashutosh Sharma

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
80
mttmllns

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

Voici comment on peut consommer l'objet

 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();
        }
    });
9
Shivaraj Patil

Version: Effacer le cache de Google Play Store laissera "Android.test.purchased" à nouveau disponible.

9
Denis

j'ai utilisé adb Shell:

adb Shell pm clear com.Android.vending
6
Shwarz Andrei

À mon avis, si votre programme n'est pas conçu pour utiliser l'élément, vous n'avez pas besoin de modifier le code pour effacer la mémoire d'un fournisseur externe. 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. Il est donc mal conçu d'implémenter une telle solution.

La meilleure solution pour effacer Android.test.purchased a été de:

adb uninstall com.yourapp.name

et alors

adb Shell pm clear com.Android.vending

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

Vous venez d'ajouter votre C:\...\Android-sdk\platform-tools; dans le chemin de Windows dans les variables d’environnement, et j’imagine que c’est aussi simple que cela sous Mac et Linux. J'espère que cela aidera quelqu'un à passer quelques jours de moins avec la mise en œuvre de Android dans la facturation des applications.

6
sivi

Le problème principal est que vous devez consommer le Android.test.purchased article. Mais cet élément ne sera pas disponible dans votre inventaire de requêtes, vous ne pouvez donc pas utiliser 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 à partir de votre IabHelper.

Ensuite, dans votre classe, vous pouvez consommer comme ça,

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 t'aides.

4
Tang Tung Ai

Si vous êtes dans un environnement de test

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

2) Dans InApp util, il existe un fichier appelé Security.Java, définissez-le comme suit, pour temporaire. Depuis le paiement de test (faux), retournez toujours false en raison d'une exception de sécurité.

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

Ensuite, dans votre appel 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 auditeur 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
Ebin Joy

À 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 d'initialisation du flux d'achat de gp. Cela est particulièrement confortable lorsque vous testez un seul élément pour le moment. Par exemple. comme ça:

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
sodiumnitrat

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

1
Sai Nadh
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
Girish Patel