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.
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.
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
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.
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);
}
}
};
Version3 : Effacer le cache de Google Play Store laissera " android.test.acheté " disponible à nouveau.
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();
}
});
, À 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.
J'ai utilisé adb shell:
adb shell pm clear com.android.vending
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.
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");
}
}
};
À 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);
Accédez à la console Google Play et ouvrez L'onglet Gestion des commandes. Là, vous pouvez rembourser / annuler les achats de test.
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();
}
}
};
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.
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.
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".