Test voor in-app-facturering: android.test.purchased reeds in bezit

Ik ben momenteel in-app-facturering aan het testen voor een toekomstige app en nadat ik de eerste keer met succes het testitem “android.test.purchased” heb “gekocht”, ontvang ik nu elke keer dat ik probeer te kopen de antwoordcode 7 het opnieuw, wat betekent dat ik dit item al bezit.

12-15 23:02:14.149: E/IabHelper(19829): Fout in-app-facturering: niet mogelijk
om item te kopen, Foutreactie: 7:Item is al in bezit

Voor zover ik heb begrepen, zou deze aankoop altijd mogelijk moeten zijn, toch? Zodat de ontwikkelaar zijn/haar app kan testen?

Zo niet, hoe kan ik de status ‘resetten’ naar geen eigendom? Ik gebruik het util-pakket uit het voorbeeld van Google In-App Billing.


Antwoord 1, autoriteit 100%

Voeg deze code toe aan een thread om een ​​consumptieverzoek te starten.

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

Hier voor de aankooptest, purchaseToken is

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

En

if (response == 0)

dan is het verbruik geslaagd.

vergeet ook niet om mService openbaar te maken in

IabHelper.Java

dan zou het mogelijk zijn om als volgt toegang te krijgen:

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

Antwoord 2, autoriteit 90%

Het is niet nodig om een ​​speciale verbruikscode te schrijven. Gebruik gewoon de adb-opdracht om de Google Play Store-gegevens te wissen:

adb shell pm clear com.android.vending

Antwoord 3, autoriteit 63%

Het blijkt dat het item android.test.purchased zich gedraagt ​​als een gewone ID. Het betekent dat als je het opnieuw wilt kunnen kopen, je het ergens in je code moet consumeren. Ik denk dat de Google-documentatie op dit punt misleidend is en dat ze nog een statische ID moeten toevoegen die je eindeloos kunt kopen voor testdoeleinden.


Antwoord 4, autoriteit 25%

In-app-versie 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);
        }
    }
};

Antwoord 5, autoriteit 13%

Versie 3 – Snelste manier om op te lossen: als u het cachegeheugen van de Google Play Store wist, is “android.test.purchased” weer beschikbaar.


Antwoord 6, autoriteit 8%

Zo kunnen we het artikel consumeren

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

Antwoord 7, autoriteit 5%

Naar mijn mening, als je programma niet is ontworpen om het item te consumeren, hoef je de code niet aan te passen om het geheugen van een externe leverancier te wissen. Dit maakt je code kwetsbaarder en je zult dan veel tijd moeten besteden aan het toevoegen en verwijderen van code die niet bij je software hoort, dus het is een slecht ontwerp om zo’n oplossing te implementeren.

De beste oplossing die voor mij werkte om android.test.purchased te wissen was

adb uninstall com.yourapp.name

en dan

adb shell pm clear com.android.vending

Ik hoefde geen geld te innen en door mijn instellingen voor apps te bladeren of de code daarvoor te wijzigen. Ik moest wel de adb toevoegen aan padvariabelen van het Windows-systeem, wat vrij eenvoudig was. Dus ja, je moet adb gebruiken, wat je waarschijnlijk toch nodig hebt, dus..

Je voegt gewoon je C:\ …\android-sdk\platform-tools toe; in het Windows-pad in omgevingsvariabelen, en ik kan me voorstellen dat het ook vrij eenvoudig is in Mac en Linux OS. Ik hoop dat het iemand helpt om een ​​paar dagen minder te besteden aan het implementeren van Android in app-facturen.


Antwoord 8, autoriteit 5%

Ga naar de Google Play Developer Console, open het menu-item Order Managementaan de linkerkant en selecteer de bestelling die u wilt terugbetalen. Zorg er ook voor dat u het recht verwijdert.


Antwoord 9, autoriteit 4%

Het belangrijkste probleem is dat je het item android.test.purchasedmoet gebruiken. Maar dit artikel is niet beschikbaar in uw zoekopdrachtvoorraad, dus u kunt het niet op de normale manier consumeren.

Dus, als je IabHelper gebruikt, in de IabHelperklasse, kun je de IInAppBillingServicemService tijdelijk wijzigen in public zodat deze toegankelijk is vanaf je IabHelper.

Dan kun je in je klas zo consumeren,

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

Als het lukt, zal het antwoord 0 zijn.

Hopelijk helpt dit.


Antwoord 10, autoriteit 3%

Voor testdoeleinden raad ik je ook aan om een ​​stukje code in te voeren waarmee alle producten die je hebt gekocht worden gewist voordat je een methode aanroept die de gp-aankoopstroom initialiseert. Dat is vooral comfortabel, als je op dit moment maar één item test. bijv. zoals dit:

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

Antwoord 11

Als u zich in een testomgeving bevindt

1) In het geval van android.test.purchased kan ik de nepbetaling resetten door het Android-apparaat opnieuw op te starten (de inventaris opgebruikt).

2) In InApp util is er een bestand genaamd Security.java, maak het als volgt, voor tijdelijk. Aangezien de testbetaling (nep) altijd false retourneert vanwege beveiligingsuitzondering.

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

Bel vervolgens in uw OnIabPurchaseFinishedListener fechInvForconsumeItem() aan

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

De fechInvForconsumeItem() is

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

Consumeer Luisteraar is

   IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
        new IabHelper.OnConsumeFinishedListener() {
            public void onConsumeFinished(Purchase purchase,
                                          IabResult result) {
                if (result.isSuccess()) {
                } else {
                    // handle error
                    Log.e("11","sucConsume");
                }
            }
        };

Antwoord 12

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

Antwoord 13

In mijn geval lijkt het erop dat Google geen aankoop voor het item registreert. In plaats daarvan slaat de lokale kopie van Google Play Services de aankoop op in het cachegeheugen. Op die manier verschijnt android.test.purchased already ownedwanneer een tweede verzoek wordt gedaan op hetzelfde apparaat. Als u echter een ander apparaat gebruikt of het apparaat reset, wordt de cache gewist en kan de aankoop worden herhaald.


Antwoord 14

In mijn geval moest ik alleen de cache van de apps wissen. Nadat ik de cache had gewist, kon ik het aankoopproces opnieuw starten.

Vanaf mijn apparaat (4.4.2) navigeerde ik naar “Instellingen->Toepassingsbeheer”. Vervolgens selecteerde ik de app op het tabblad “DOWNLOADED” en vervolgens “Cache wissen”.


Antwoord 15

Dit is het verschil tussen verbruiksartikelen en niet-verbruiksartikelen; van niet-verbruiksartikelen (waar u hier mee te maken lijkt te hebben) wordt hun staat voortdurend bijgehouden, terwijl verbruiksartikelen meerdere keren kunnen worden gekocht. Je moet naar je Play-beheerconsole gaan en de verkoop annuleren/terugbetalen om deze opnieuw te testen.

Other episodes