Андроид в подтверждении покупки биллинга приложения не выполнен
i ', не имея проблем с внедрением биллинга в приложении для Android.
я получаю подтверждение подписи к покупке.
В первый раз, когда я был жестким, это был ключ base64, но я проверил его много раз, и я все еще получаю ошибку, а затем после того, как я посмотрел файл Security.java, и нашел этот метод, который я редактировал для получения информации о том, что было не так:
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);
}
И я получаю "подпись пуста".
Даже после того, как я выполнил следующие шаги:
-Зарегистрируйте apk с помощью ключа release
загрузить его как черновик
-установить его на устройстве с помощью "adb -d install app.apk"
Я тестирую реальные покупки.
Спасибо.
Изменить Поток покупок в порядке, я получаю сообщение об ошибке при вызове queryInventoryAsync
Ответы
Ответ 1
Замените метод verifyPurchase()
ниже. Используйте старый код, который приведен ниже, разработчик google пытается решить эту ошибку в ближайшем будущем, но прежде чем обновить свой код, вы должны выбрать код ниже.
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;
}
проверьте эту ссылку для получения дополнительной информации:
В биллинге приложения не работает после обновления - Магазин Google
Используйте попытку заменить метод OLD CODE метода verifyPurchase()
в вашем проекте. Но это должно произойти только тогда, когда вы пытаетесь приобрести тестовые продукты. Позвольте мне узнать о покупке реальных продуктов также после использования этого кода.
Edit:
Почему это происходит, потому что мы не получим никакой подписи, пока мы используем фиктивный продукт, например "android.test.purchased". Поэтому в старом коде он работает хорошо, потому что мы вернулись, даже если подпись не указана, а для нового кода мы возвращаем false.
больше информации о данных сигнатуры, пустой или пустой, из link1 и link2
Поэтому я предлагаю вам просто заменить старый метод кода verifyPurchase()
вместо метода New Code.
Я думаю, что New Code будет работать отлично для реального продукта, но не в фиктивном продукте. Но пока я не тестировал настоящий продукт.
или
использовать ответ GvS для теста, он также является хорошим решением для нового кода.
Надеюсь, что это решит вашу проблему.
Ответ 2
Вы можете использовать тестовый SKU для тестирования, как описано здесь. Это:
-
android.test.purchased
-
android.test.canceled
-
android.test.refunded
-
android.test.item_unavailable
Эти покупки будут успешными (по крайней мере, android.test.purchased) даже в сценарии тестирования и отладки без необходимости отмены покупки.
В поле verifyPurchase я изменил return false
на:
Log.e(TAG, "Purchase verification failed: missing data.");
if (BuildConfig.DEBUG) {
return true;
}
return false;
но вы должны знать, что использовать это только в тестовом сценарии.
Это вернет true, если у вас есть отладочная сборка, и данные подписи отсутствуют. Поскольку BuildConfig.DEBUG будет ложным в сборке, это должно быть ОК. Но лучше удалить этот код после того, как все отлажено.
Ответ 3
Убедитесь, что вы вошли в систему с нужным пользователем на вашем телефоне или, например, добавьте свою учетную запись google в качестве тестового пользователя в консоль разработчика.
http://developer.android.com/google/play/billing/billing_testing.html#billing-testing-static:
В некоторых случаях зарезервированные элементы могут возвращать подписанные статические ответы, что позволяет протестировать проверку подписи в вашем приложении. Зарезервированные элементы возвращают только подписанные ответы, если у пользователя, запускающего приложение, есть разработчик или тестовая учетная запись.
Ответ 4
установите значение возврата в значение true В
public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
return true;
}
после tesing отменить изменение