В приложении биллинг не работает после обновления - Google Store
Я включил биллинг в приложении в свое приложение - и совсем недавно Google обновил его, ранее я тестировал биллинг в приложении с "android.test.purchased"
и это работало нормально (Купить полную версию и восстановить полную версию).
Теперь я взял измененные классы отсюда https://code.google.com/p/marketbilling/source/detail?r=7bc191a004483a1034b758e1df0bda062088d840
После этого я не могу протестировать приложение, которое выдает следующую ошибку в Logcat "IabHelper: In-app billing error: Purchase signature verification FAILED for sku android.test.purchased
".
Я проверил свой ключ, имя пакета, а также версию приложения, все в порядке, кто-нибудь сталкивался с этой проблемой?
Пожалуйста, помогите мне с этим.
2 ответа
Это связано с тем, что метод 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". Так что в старом коде это работает хорошо, потому что мы возвращали true, даже если подпись не указана, а для нового кода мы возвращаем false.
больше информации о данных подписи, нулевых или пустых от link1 и link2
Поэтому я предлагаю вам просто заменить старый метод кода verifyPurchase() вместо метода New Code.
Я думаю, что, возможно, Новый код будет хорошо работать для реального продукта, но не для фиктивного продукта. Но пока я не проверял на настоящий продукт.
Позвольте мне больше узнать об этом, почему они изменили код и какова цель этого.
РЕДАКТИРОВАТЬ:
BuildConfig.DEBUG также предоставит вам решение для тестовых покупок.
В проверки покупки я поменял 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's answer
Android в проверке покупки приложения не удалось.
надеюсь, что это полезно для вас.
Я был одним из тех, кто информировал Google Security Team об этих ошибках безопасности. Пожалуйста, будьте терпеливы, пока я не сделаю публичное раскрытие этих ошибок, так как я предоставил Google время, чтобы их исправить. Если об этой проблеме не напишут большие сайты, я расскажу с рабочим эксплойтом 6 ноября.
Как вы уже видели в verifyPurchase(), ошибка должна быть очевидной. Если данная подпись является пустой строкой, метод все равно возвращает true (так как он возвращает true по умолчанию).