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