В выставлении счетов не работает после обновления - Магазин Google

Я выполнил биллинг In-App в своем приложении - и совсем недавно 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 ".

Я проверил с моим ключом, именем пакета, а также версией приложения все правильно, кто-нибудь столкнулся с этой проблемой?

Пожалуйста, помогите мне с этим.

Ответ 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 андроида в проверке покупки биллинга приложения.

надеюсь, что это будет полезно для вас.

Ответ 2

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

Как вы уже посмотрели на verifyPurchase(), ошибка должна быть очевидной. Если заданная сигнатура является пустой строкой, метод по-прежнему возвращает true (поскольку он возвращает true по умолчанию).