it-swarm.com.de

android in App-Abrechnung Kaufprüfung fehlgeschlagen

ich habe Probleme beim Implementieren in der App-Abrechnung in meiner Android-App. Ich erhalte die Bestätigung der Kaufsignatur nicht. In einem ersten Mal war ich schwierig, es war der base64-Schlüssel, aber ich habe ihn viele Male überprüft und bin dabei Der Fehler wird immer noch angezeigt. Nachdem ich mir die Security.Java-Datei angesehen habe, habe ich diese Methode gefunden, die ich bearbeitet habe, um Informationen darüber zu erhalten, was falsch war:

    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 "Signatur ist leer" . Auch nachdem ich die folgenden Schritte befolgt habe: - Unterzeichnen Sie die apk mit meinem Freigabeschlüssel - laden Sie sie als Entwurf hoch - Installieren Sie sie auf einem Gerät mit "adb -d install app.apk"

Ich teste mit echten Einkäufen ... Danke.

Bearbeiten Der Kauffluss ist in Ordnung, ich erhalte den Fehler, wenn ich queryInventoryAsync anrufe.

23
TheRedFox

Ersetzen Sie Ihre verifyPurchase()-Methode durch eine der folgenden. Verwenden Sie den unten angegebenen alten Code. Google Developer versucht, diesen Fehler in naher Zukunft zu beheben. Bevor Sie jedoch ihren Code aktualisieren, sollten Sie den folgenden 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;
        }

Überprüfen Sie diesen Link für weitere Informationen: 

In-App-Abrechnung funktioniert nach dem Update nicht - Google Store

Versuchen Sie, die verifyPurchase()-Methode der OLD CODE-Methode in Ihrem Projekt zu ersetzen. Es sollte jedoch nur passieren, wenn Sie versuchen, Testprodukte zu kaufen. Lassen Sie es mich wissen, wenn Sie den Code für echte Produkte kaufen.

Bearbeiten:

Warum es passiert, weil wir keine Signatur erhalten, wenn wir ein Dummy-Produkt wie "Android.test.purchased" verwenden. Im alten Code funktioniert es also gut, da wir auch dann als true zurückgegeben wurden, wenn keine Signatur angegeben wurde, und für den New-Code wird false zurückgegeben.

weitere Informationen zu den Signaturdaten sind in link1 und link2 null oder leer

Ich schlage vor, Sie ersetzen einfach die alte Codemethode verifyPurchase() anstelle der New-Code-Methode.

Ich denke, dass New Code für das echte Produkt gut funktionieren wird, nicht aber für das Dummy-Produkt. Ich habe aber noch nicht das echte Produkt getestet.

oder 

verwenden Sie die Antwort von GvS für die Testkäufe, es ist auch die gute Lösung für den neuen Code.

Hoffe, es wird dein Problem lösen.

39
Maulik

Sie können die Test-SKUs zum Testen verwenden, wie hier erläutert . Diese sind:

  • Android.test.purchased
  • Android.test.canceled
  • Android.test.refunded
  • Android.test.item_unavailable

Diese Einkäufe werden auch in Test- und Debug-Szenarien erfolgreich sein (zumindest Android.test.purchased), ohne den Kauf abzubrechen.

Im verifyPurchase habe ich return false geändert in:

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

sie sollten sich jedoch bewusst sein, dies nur in Testszenarien zu verwenden.

Dies gibt true zurück, wenn Sie einen Debug-Build haben und die Signaturdaten fehlen. Da BuildConfig.DEBUG in einem Produktionsbuild falsch ist, sollte dies in Ordnung sein. Besser ist es jedoch, diesen Code nach dem Debuggen zu entfernen.

40
GvS

Stellen Sie sicher, dass Sie mit dem richtigen Benutzer auf Ihrem Telefon angemeldet sind, 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 geben die reservierten Elemente möglicherweise signierte statische Antworten zurück, sodass Sie die Signaturprüfung in Ihrer Anwendung testen können. Die reservierten Elemente geben nur dann signierte Antworten zurück, wenn der Benutzer, der die Anwendung ausführt, über ein Entwickler- oder Testkonto verfügt.

1
Till

setze den Rückgabewert auf true In 

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

nach dem Test die Änderung rückgängig machen

0