在应用更新后无法使用帐号 – Google商店

我已经在我的应用程序中实现了应用程序内结算 – 最近谷歌已经更新了它,以前我用"android.test.purchased"testing了应用程序内结算,它工作正常(购买完整版本和还原完整版本) 。

现在,我从这里https://code.google.com/p/marketbilling/source/detail?r=7bc191a004483a1034b758e1df0bda062088d840

之后,我无法testing应用程序,它给Logcat "IabHelper: In-app billing error: Purchase signature verification FAILED for sku android.test.purchased ".以下错误"IabHelper: In-app billing error: Purchase signature verification FAILED for sku android.test.purchased ".

我检查了我的钥匙,包名和应用版本都是正确的,有没有人遇到过这个问题?

请帮我解决一下这个。

Solutions Collecting From Web of "在应用更新后无法使用帐号 – Google商店"

这是因为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); } 

根据我从新代码中search和testing的结果,

为什么会发生,因为我们在使用虚拟产品(如“android.test.purchased”)时不会得到任何签名。 所以在旧的代码中,它运行良好,因为即使没有给出签名,我们仍然返回true,对于新代码,我们返回false。

有关签名数据null或link1和link2空白的更多信息

所以我build议你只用旧代码方法verifyPurchase()代替新代码方法。

我认为可能是新代码将工作罚款的真实产品,但不是在虚拟产品。 但是我还没有testing过真正的产品。

让我来进一步了解这个,为什么他们改变了代码,以及背后的目的是什么。

编辑:

BuildConfig.DEBUG也将为您提供testing购买的解决scheme。

在verifyPurchase中,我将return false更改为:

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

但是你应该知道只能在testing场景中使用它。

这将返回true,如果您有一个debugging版本,并签名数据丢失。 由于BuildConfig.DEBUG在生产版本中将是错误的,所以应该是可以的。 但更好的是在debugging完所有东西后删除这段代码。

我已经在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得到了这个应用程序结算购买validation失败的Android 。

希望这对你有帮助。

我是通知谷歌安全团队有关这些安全漏洞的人。 请耐心等待,直到我公开披露这些错误为止,因为我授权Google解决这些错误。 如果没有大的网站写这个问题,我会在11月6日透露一个有效的漏洞。

正如你已经看过verifyPurchase(),错误应该是显而易见的。 如果给定的签名是一个空string的方法仍然返回true(因为它默认返回true)。