Ich habe mehrere Tage lang versucht, dieses Problem mithilfe des mit dem SDK gelieferten Dungeons-Demo-Codes zu lösen. Ich habe versucht, eine Antwort bei Google zu finden, kann aber keine finden.
- In der Dungeons-Demo habe ich meinen öffentlichen Schlüssel von der Entwicklerkonsole übergeben.
- Signierte die apk und lud sie ohne Veröffentlichung auf die Konsole hoch.
- Testen auf beide
android.test.purchased
und auf der Konsole erstellte Produktliste mit Abonnement veröffentlicht (die Hauptfunktion, die ich für meine App möchte).
Trotzdem bekomme ich einen Fehler von Signature verification failed
und dann stimmt die Signatur nicht mit den Daten überein. Wie kann ich das lösen?
public static ArrayList<VerifiedPurchase> verifyPurchase(String signedData, String signature)
{
if (signedData == null) {
Log.e(TAG, "data is null");
return null;
}
if (Consts.DEBUG) {
Log.i(TAG, "signedData: " + signedData);
}
boolean verified = false;
if (!TextUtils.isEmpty(signature)) {
String base64EncodedPublicKey = "MIIBIjA....AQAB";
PublicKey key = Security.generatePublicKey(base64EncodedPublicKey);
verified = Security.verify(key, signedData, signature);
if (!verified) {
Log.w(TAG, "signature does not match data.");
return null;
}
}
}
public static boolean verify(PublicKey publicKey, String signedData, String signature)
{
if (Consts.DEBUG) {
Log.i(TAG, "signature: " + signature);
}
Signature sig;
try {
sig = Signature.getInstance(SIGNATURE_ALGORITHM);
sig.initVerify(publicKey);
sig.update(signedData.getBytes());
if (!sig.verify(Base64.decode(signature))) {
Log.e(TAG, "Signature verification failed.");
return false;
}
return true;
} catch (NoSuchAlgorithmException e) {
Log.e(TAG, "NoSuchAlgorithmException.");
} catch (InvalidKeyException e) {
Log.e(TAG, "Invalid key specification.");
} catch (SignatureException e) {
Log.e(TAG, "Signature exception.");
} catch (Base64DecoderException e) {
Log.e(TAG, "Base64 decoding failed.");
}
return false;
}