Android в проверке покупки приложения не удалось

У меня возникли проблемы с реализацией в биллинг приложения в моем приложении для 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 моим ключом релиза -загружать его как черновик -установить его на устройство с помощью "adb -d install app.apk"

Я тестирую с реальными покупками. Благодарю.

Изменить поток покупок в порядке, я получаю сообщение об ошибке, когда я звоню queryInventoryAsync

4 ответа

Решение

Замените свой 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 Store

Используйте попытку заменить метод старого кода verifyPurchase() метод в вашем проекте. Но это должно произойти только тогда, когда вы пытаетесь приобрести тестовые продукты. Сообщите мне о покупке реальных продуктов также после использования этого кода.

Редактировать:

Почему это происходит, потому что мы не получим никакой подписи, пока мы используем фиктивный продукт, такой как "android.test.purchased". Так что в старом коде это работает хорошо, потому что мы возвращали true, даже если подпись не указана, а для нового кода мы возвращаем false.

больше информации о данных подписи, нулевых или пустых от link1 и link2

Поэтому я предлагаю вам просто заменить старый метод кода verifyPurchase() вместо метода нового кода.

Я думаю, что, возможно, Новый код будет хорошо работать для реального продукта, но не для фиктивного продукта. Но пока я не проверял на настоящий продукт.

или же

используйте ответ GvS для тестовых покупок, это также хорошее решение для нового кода.

Надеюсь, это решит вашу проблему.

Вы можете использовать тестовые SKU для тестирования, как описано здесь. Это:

  • android.test.purchased
  • android.test.canceled
  • android.test.refunded
  • android.test.item_unavailable

Эти покупки будут успешными (по крайней мере, android.test.purchased) даже в сценариях тестирования и отладки без необходимости отмены покупки.

В проверки покупки я поменял return false чтобы:

    Log.e(TAG, "Purchase verification failed: missing data.");
    if (BuildConfig.DEBUG) {
            return true;
    }
    return false;           

но вы должны знать, использовать это только в тестовом сценарии.

Это вернет true, если у вас есть отладочная сборка, и данные подписи отсутствуют. Так как BuildConfig.DEBUG будет ложным в производственной сборке, это должно быть в порядке. Но лучше удалить этот код после того, как все отлажено.

Убедитесь, что вы вошли в систему с нужным пользователем на вашем телефоне или, например, добавьте учетную запись Google в качестве тестового пользователя в консоли разработчика.

http://developer.android.com/google/play/billing/billing_testing.html:

В некоторых случаях зарезервированные элементы могут возвращать подписанные статические ответы, что позволяет вам проверить проверку подписи в вашем приложении. Зарезервированные элементы возвращают подписанные ответы, только если у пользователя, запускающего приложение, есть разработчик или тестовая учетная запись.

Установите возвращаемое значение в true

public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
    return true;
}

после тестирования отменить изменения

Другие вопросы по тегам