130 votes

Test de facturation In-App : Android.test.acheté déjà possédé

Je teste actuellement la facturation In-App pour une future application, et après avoir réussi à "acheter" l'objet 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 objet.

12-15 23:02:14.149 : E/IabHelper(19829) : Erreur de facturation in-app : Impossible impossible d'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, non ? Pour que le développeur puisse tester son application ?

Si non, comment puis-je "réinitialiser" son état pour qu'il ne soit pas possédé ? J'utilise le paquet util de l'exemple de facturation In-App de Google.

1 votes

Mon recrutement est vise verses ..j'ai besoin du message déjà possédé mais chaque fois son permettant d'acheter

110voto

prasharonnet Points 725

Ajoutez ce code à un thread pour initier la 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.

N'oubliez pas non plus de rendre mService public dans la section

IabHelper.Java

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

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

2 votes

Si cette légende fonctionne, @psykhi aurait vraiment dû vous donner les points. J'ai essayé de les consommer mais je n'ai pas réussi à trouver le jeton d'achat. Merci

1 votes

C'est un énorme gain de temps. Parfait. Merci.

0 votes

@pks : vous pouvez placer ce code partout où vous avez besoin de consommer votre achat. Sur n'importe quelle action de clic ou immédiatement après l'achat, n'importe où selon les besoins de votre application.

69voto

psykhi Points 1110

Il s'avère que l'élément Android.test.purchased se comporte comme un ID ordinaire. Cela signifie que si vous voulez être en mesure de 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.

1 votes

Utilisez l'appel d'inventaire pour récupérer l'objet d'achat, puis consommez-le - c'est assez facile une fois que vous avez compris.

3 votes

Voir la réponse de @mttmlins ci-dessous, ou lire vvse.com/blog/blog/2016/08/26/

0 votes

Ce n'est pas tout à fait vrai, j'ai un cas où il y a un élément de test non consommé, mais billingClient.queryPurchases() ne renvoie pas l'objet non consommé, donc maintenant je ne peux pas consommer l'objet car je ne peux pas obtenir de purchaseToken de celui-ci

28voto

embo Points 1839

Version in-app 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);
        }
    }
};

0 votes

Comme une image vaut mille mots, un morceau de code complet et fonctionnel vaut mille "Ajouter ce code à un fil de discussion . . .".

9voto

Shivaraj2 Points 207

C'est ainsi que nous pouvons consommer l'élément

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

0 votes

Cela a fonctionné pour moi - j'avais utilisé le android.test.purchase à un moment donné, ce qui causait des problèmes - la tâche d'inventaire dans la facturation in-app a déclenché un tas d'erreurs et ne s'est jamais terminée. L'exécution de cette tâche en une seule fois a permis de résoudre le problème, et j'ai pu recommencer à utiliser mon SKU réel et continuer comme avant. Merci

1 votes

Excellente réponse. Fonctionne avec les réponses statiques = avant que l'apk avec la facturation In-App activée soit téléchargé sur Google Play.

0 votes

Merci ! Ça a marché pour moi.

-2voto

addaon Points 718

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

1 votes

Mais le problème est que je n'ai aucun "pouvoir" sur ces "faux" articles, et je ne vois pas comment je pourrais changer le statut de la vente, puisqu'il ne s'agit pas d'achats réels. Le site document Google dit à propos de l'Android.test.purchased : Lorsque vous faites une demande de facturation In-app avec cet identifiant de produit, Google Play répond comme si vous aviez acheté un article avec succès. Donc je suis assez confus :/

0 votes

Faites-vous toujours des tests de réponse statique ? Si oui, il suffit de modifier la réponse statique envoyée. On dirait que vous en êtes à "Tester les achats dans l'application en utilisant vos propres identifiants de produits", qui font des achats réels avec des commandes annulables.

0 votes

Je suis toujours coincé avec les identifiants statiques. Ce que je voudrais, c'est pouvoir tester un achat in-app avec l'ID Android.test.purchased. Cela a juste fonctionné la première fois alors que cela devrait toujours fonctionner d'après ce que je comprends de la doc Google. Désolé si je n'ai pas été clair !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X