Ответ 1
Это связано с методом verifyPurchase() в классе Security, который был изменен в новых исправлениях. Позвольте мне показать вам, какая именно проблема:
Изменения класса безопасности
СТАРЫЙ КОД
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;
}
Новый код
public static boolean verifyPurchase(String base64PublicKey,
String signedData, String signature) {
if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey)
|| TextUtils.isEmpty(signature)) {
Log.e(TAG, "Purchase verification failed: missing data.");
return false;
}
PublicKey key = Security.generatePublicKey(base64PublicKey);
return Security.verify(key, signedData, signature);
}
В соответствии с тем, что я искал и тестировал из нового кода,
Почему это происходит, потому что мы не получим никакой подписи, пока мы используем фиктивный продукт, например "android.test.purchased". Поэтому в старом коде он работает хорошо, потому что мы вернулись, даже если подпись не указана, а для нового кода мы возвращаем false.
дополнительную информацию о сигнатурных данных null или blank из link1 и link2
Поэтому я предлагаю вам просто заменить метод старого метода verifyPurchase() вместо метода New Code.
Я думаю, что New Code будет работать отлично для реального продукта, но не в фиктивном продукте. Но пока я не тестировал настоящий продукт.
Позвольте мне больше узнать об этом, почему они изменили код и какова цель этого.
EDIT:
BuildConfig.DEBUG также предоставит вам решение для тестовых покупок.
В поле verifyPurchase я изменил return false
на:
Log.e(TAG, "Purchase verification failed: missing data.");
if (BuildConfig.DEBUG) {
return true;
}
return false;
но вы должны знать, что использовать это только в тестовом сценарии.
Это вернет true, если у вас есть отладочная сборка, и данные подписи отсутствуют. Поскольку BuildConfig.DEBUG будет ложным в сборке, это должно быть ОК. Но лучше удалить этот код после того, как все отлажено.
Я редактировал некоторый код в методе verifyPurchase(), проверьте его ниже:
public static boolean verifyPurchase(String base64PublicKey,
String signedData, String signature) {
if (signedData == null) {
Log.e(TAG, "data is null");
return false;
}
if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey)
|| TextUtils.isEmpty(signature)) {
Log.e(TAG, "Purchase verification failed: missing data.");
if (BuildConfig.DEBUG) {
Log.d("DeBUG", ">>>"+BuildConfig.DEBUG);
return true;
}
return false;
}
PublicKey key = Security.generatePublicKey(base64PublicKey);
return Security.verify(key, signedData, signature);
}
Я получил это от GvS answer
андроида в проверке покупки биллинга приложения.
надеюсь, что это будет полезно для вас.