更新后的应用结算中无法使用 - Google商店

时间:2013-10-23 06:19:59

标签: android in-app-purchase in-app-billing billing android-billing

我已经在我的应用中实施了应用内结算 - 最近谷歌已对其进行了更新,之前我正在使用"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 ".

中出现以下错误

我已经检查了我的密钥,包名和app版本都是正确的,有没有人遇到过这个问题?

请帮助我。

2 个答案:

答案 0 :(得分:31)

这是因为Security类中的verifyPurchase()方法已在新修补程序中进行了更改。让我告诉你究竟是什么问题:

安全等级更改

旧代码

 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。

有关签名数据的详细信息null或空白来自link1link2

所以我建议你只需要替换旧的代码方法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在生产版本中将为false,因此应该没问题。但更好的是在调试完所有内容后删除此代码。

我已经在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 in app billing purchase verification failed得到的。

希望它对你有所帮助。

答案 1 :(得分:7)

我是向Google安全小组通报这些安全漏洞的人。 在我公开披露这些错误之前请耐心等待,因为我已经给了Google时间来修复它们。 如果没有大型网站写这个问题,我会在11月6日披露一个有效的漏洞利用。

正如您已经查看了verifyPurchase(),错误应该是显而易见的。如果给定签名是一个空String,则该方法仍然返回true(因为它在默认情况下返回true)。