В приложении биллинг не работает после обновления - 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 по умолчанию).

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