21

Ich habe Probleme bei der Umsetzung in App-Abrechnung in meiner Android-App. Ich bekomme eine Überprüfung der Kaufsignatur fehlgeschlagen. In einem ersten Mal war es hart der Base64-Schlüssel, aber ich habe es oft überprüft und ich bekomme immer noch den Fehler, dann nachdem ich die Security.java-Datei angeschaut habe und ich diese Methode gefunden habe, die ich bearbeitet habe Informationen über was falsch war:Android in App-Rechnung Kaufbestätigung fehlgeschlagen

public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) { 
    if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) || 
      TextUtils.isEmpty(signature)) { 
     if(TextUtils.isEmpty(signedData)) Log.d(TAG, "SIGNED DATA EMPTY"); 
     if(TextUtils.isEmpty(base64PublicKey)) Log.d(TAG, "KEY IS EMPTY"); 
     if(TextUtils.isEmpty(signature)) Log.d(TAG, "SIGNATURE IS EMPTY"); 
     Log.e(TAG, "Purchase verification failed: missing data."); 
     return false; 
    } 

    PublicKey key = Security.generatePublicKey(base64PublicKey); 
    return Security.verify(key, signedData, signature); 
} 

Und ich bekomme "Unterschrift ist leer". Selbst nachdem ich die folgenden Schritte aus: -Sign die apk mit meinem Entriegelungsschlüssel als Entwurf -upload -install es auf einem Gerät mit

Ich teste „adb -d app.apk installieren“ mit echten Käufen. Danke.

bearbeiten Der Kaufvorgang ist in Ordnung, bekomme ich die Fehlermeldung, wenn ich queryInventoryAsync nennen

+1

meine eigene Antwort überprüfen, hofft, dass es Ihr Problem zu lösen. – Maulik

Antwort

35

Ersetzen Sie Ihre verifyPurchase() Methode durch unter eins. Verwenden Sie den alten Code, der unten angegeben ist, versuchen Google-Entwickler, diesen Fehler in naher Zukunft zu beheben, aber bevor sie ihren Code aktualisierten, sollten Sie unter Code bevorzugen.

public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) { 
       if (signedData == null) { 
       Log.e(TAG, "data is null"); 
       return false; 
      } 

      boolean verified = false; 
      if (!TextUtils.isEmpty(signature)) { 
       PublicKey key = Security.generatePublicKey(base64PublicKey); 
       verified = Security.verify(key, signedData, signature); 
       if (!verified) { 
        Log.w(TAG, "signature does not match data."); 
        return false; 
       } 
      } 
      return true; 
     } 

Check Link für weitere Informationen:

In App billing not working after update - Google Store

Verwenden versucht ALTE CODE Methode verifyPurchase() Methode in Ihrem Projekt zu ersetzen. Aber es sollte nur passieren, wenn Sie versuchen, Testprodukte zu kaufen. Lassen Sie mich für den Kauf der richtigen Produkte auch nach der Verwendung dieses Codes wissen.

Edit:

Warum es geschieht, weil wir keine Unterschrift bekommen, während wir Dummy-Produkt verwenden, wie "android.test.purchased". Im alten Code funktioniert es also gut, weil wir True zurückgegeben haben, auch wenn die Signatur nicht gegeben ist und wir für den neuen Code false zurückgeben.

weitere Informationen über die Signaturdaten null oder leer aus link1 und link2

Deshalb schlage ich Ihnen nur alte Code-Methode verifyPurchase() statt Neuer Code-Methode ersetzen.

Ich denke, möglicherweise wird neuer Code für das echte Produkt gut funktionieren, aber nicht in dem Dummy-Produkt. Aber ich habe noch nicht auf das echte Produkt getestet.

oder

Verwendung GvS Antwort für die Testkäufe auch die gute Lösung für den neuen Code.

Ich hoffe, es wird Ihr Problem lösen.

+0

Vielen Dank! Das hat mein Problem gelöst –

+0

@Maulik Vielen Dank für meinen Zweck für Test-Artikel, aber ich habe eine Frage, dass es Anwendung im Szenario wie Kauf Bücher mit inAppBilling Anwendung? Bitte schlagen Sie mir vor –

+0

Ich kann nicht scheinen, diese Methode zu finden 'Security.generatePublicKey (base64PublicKey);' Ist Sicherheitsklasse Teil von java.s Sicherheit? Vielen Dank. – Chan

40

können Sie den Test verwenden SKUs Tests zu tun, as explained here. Diese sind:

  • android.test.purchased
  • android.test.canceled
  • android.test.refunded
  • android.test.item_unavailable

Diese Käufe werden erfolgreich sein (zumindest die android.test.purchased) auch in Test- und Debug-Szenario, ohne die Notwendigkeit, den Kauf zu stornieren.

Im verifyPurchase änderte ich return false zu:

Log.e(TAG, "Purchase verification failed: missing data."); 
    if (BuildConfig.DEBUG) { 
      return true; 
    } 
    return false;   

, aber Sie sollten sich dessen bewusst sein nur die im Testszenario zu verwenden.

Dies wird True zurückgegeben, wenn Sie einen Debug-Build haben und die Signaturdaten fehlen. Da BuildConfig.DEBUG in einem Produktions-Build falsch ist, sollte dies in Ordnung sein. Aber besser ist es, diesen Code zu entfernen, nachdem alles debuggt ist.

+2

Ich bekomme das gleiche Ergebnis, ich bin in der Lage, das Element zu kaufen, aber dann die AbfrageInventoryAsinc (Listener) gibt mir den Fehler – TheRedFox

+0

Für mich funktioniert dies beim Debuggen. Sie können auch einen Haltepunkt in verifyPurchase oder IabHelper.handleActivityResult platzieren, um festzustellen, wo der Fehler auftritt. – GvS

+0

@GvS, alte Code für die VerifyPurchase() funktioniert gut für alle, aber wenn Google Entwickler Code aktualisiert wurde, um eine sichere Transaktion in der verifyPurchase() -Methode zu machen, setzen sie einige zusätzlichen Code, um die Signatur zu überprüfen, aber jetzt Sie versuchen, den Fehler zu verbessern. Nach dem, was ich bis jetzt gehört habe. – Maulik

1

Stellen Sie sicher, dass Sie mit dem richtigen Benutzer an Ihrem Telefon angemeldet sind oder z. Fügen Sie das Google-Konto Ihres Telefons als Testbenutzer in der Entwicklerkonsole hinzu.

http://developer.android.com/google/play/billing/billing_testing.html#billing-testing-static:

In einigen Fällen kehren die reservierten Artikel statische Antworten unterzeichnet können, die Sie testen Signaturprüfung in Ihrer Anwendung können. Die reservierten Elemente geben nur signierte Antworten zurück, wenn der Benutzer, der die Anwendung ausführt, über ein Entwickler- oder Testkonto verfügt.

0

Satz Rückgabewert auf true In

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

nach Tesing rückgängig macht die Änderung