2016-04-27 7 views
10

Ich verwende Google In-App-Abrechnung für meine Android-App.Android In-App-Abrechnung, fehlende Käufe

Ich habe die IabHelper-Klasse von Google's verwendet, da ihre Abrechnung extrem kompliziert erscheint.

Mein Problem ist, ich möchte wissen, ob der Kauf erfolgreich ist oder nicht. Ich denke, dass ich den Prozess korrekt befolge, aber in meinen Protokollen sehe ich viele Benutzer, die das Upgrade erhalten, deren Kauf jedoch nie in meinem Google Play-Zahlungskonto angezeigt wird. (d. h. sie erhalten das Upgrade kostenlos).

Ich Protokolliere die GP um ids, seine manchmal eine Zahl wie,

GPA.1234-5678-9123-1234

Aber manchmal ist es wie,

1234567891234,1234567891234

Normalerweise denke ich, dass es die Nicht-GPA-Bestellungen sind, die nicht aufgeladen werden.

Auch ich denke, Sie können eine Bestellung aufgeben, dann abbrechen, und immer noch das Upgrade?

Wie gewährleisten Sie, dass der Benutzer wirklich bezahlt?

Code:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, final Purchase purchase) { 
     if (result.isFailure()) { 
      showMessage("Google Billing Purchase Error");     
      return; 
     } else if (purchase.getSku().equals(sku)) { 
      IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
       public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
        if (result.isFailure()) { 
         showMessage("Google Billing Error"); 
         return; 
        } else { 
         if (inventory.hasPurchase(sku)) { 
          showMessage("Thank you for upgrading"); 
          grantUpgrade(); 
          // ** This line gets call, but no payment occurs. 
         } 
        } 
       } 
      }; 
      mHelper.queryInventoryAsync(mReceivedInventoryListener); 
     } 
    } 
}; 
mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, ""); 

*** aktualisiert "inventory.hasPurchase (sku)" zu überprüfen, aber immer noch Benutzer sehen, wer das Upgrade bekommen, aber nicht zahlen.

** Vielleicht benutzen die Benutzer Freedom hack? Wie auch immer, um das zu verhindern?

+0

Möchten Sie Ihre Bestellhistorie kurz überprüfen? – KishuDroid

+0

Wenn Sie einen bestimmten Hack aufrufen, müssen Sie möglicherweise einen Link angeben, der es beschreibt und was genau es ist, anstatt anzunehmen, dass jeder weiß, was es ist :) – JoxTraex

+0

Siehe https://github.com/soomla/android-store/issues/47 oder Google "Google Play In-App-Hack" oder "Freedom Hack" – James

Antwort

3

Also in Bezug auf Ihre Frage, dieser Code bereits überprüfen, ob der Benutzer wirklich den Artikel gekauft hat!

+0

Ausgenommen ist es nicht. Die "Danke" -Zeile wird für Käufe ausgeführt, die nie in Google-Zahlungen angezeigt werden. – James

+0

Meinst du, du musst in der onQueryInventoryFinished nach "hasPurchase" suchen, d. H. IsFailure kann falsch sein, aber immer noch kein Kauf? – James

+0

Wenn ja, wird "hasPurchase" immer wahr sein, wenn sie den Artikel gekauft haben, oder gibt es eine Zeitverzögerung? – James

1

Der Google Play Store speichert die Einkäufe für Sie. Sie sollten daher nicht davon ausgehen, dass der Artikel nur gekauft wird, weil ein Kauf erfolgreich war. Es ist möglich, dass ein Benutzer eine Rückerstattung für einen Kauf erhält. Aus diesem Grund müssen Sie bei jedem Start das Inventar des Benutzers abfragen und Ihre Zuschüsse entsprechend anpassen. Sie müssen diese Überprüfung trotzdem durchführen, um Benutzer zu unterstützen, die die Gewährung von Berechtigungen erwarten, wenn sie zu einem neuen Gerät wechseln oder die App deinstallieren/neu installieren.

+0

Für den Zeitpunkt der Einkäufe überprüfen, ob sie immer noch den Kauf in der Zukunft nicht helfen, sie haben bereits den Artikel. Schwer zu verwendender In-App-Kauf, wenn Sie ihm nicht vertrauen können. – James

+0

Sie können den verwalteten Kauf konsumieren, sodass er nach dem Verbrauch nicht zurückerstattet werden kann. Nicht sicher, ob es Ihren Anwendungsfall unterstützt, aber es kann helfen. – Jschools

2
Purchase premiumPurchase = inventory.getPurchase(SKU); 

boolean mIsPremium = (premiumPurchase != null 
      && verifyDeveloperPayload(premiumPurchase)); 

if(mIsPremium){ 
    ... 
} 
Verwandte Themen