Андроид в подтверждении покупки биллинга приложения не выполнен

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 отменить изменение