更新后应用内计费不起作用 - Google 商店
Posted
技术标签:
【中文标题】更新后应用内计费不起作用 - Google 商店【英文标题】:In App billing not working after update - Google Store 【发布时间】:2013-11-01 06:54:39 【问题描述】:我已经在我的应用中实现了应用内计费 - 最近 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
".
中给出以下错误
我已经检查了我的密钥、包名和应用程序版本都正确,有人遇到过这个问题吗?
请帮帮我。
【问题讨论】:
您是直接从 Eclipse 进行测试,我的意思是直接在设备上运行而不是签名构建吗?如果是,请尝试通过签名的 apk 进行测试,然后让我回复会发生什么。 @Maulik 这有什么关系,因为以前我只是从 Eclipse 安装并测试它工作得很好,只是现在在添加更改后它向我显示错误,任何方法都会检查一次跨度> @Maulik 我检查了它,它仍然显示相同的错误 @Bruno Oliveira,先生,请检查此问题并请告诉我们解决方案,我得到以下原因(在我的回答中给出)为什么会发生。 三年了,还没修好:( 【参考方案1】:这是因为 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。
更多关于来自link1和link2的签名数据空或空白的信息
所以我建议你只是替换旧的代码方法 verifyPurchase() 而不是 New Code 方法。
我认为新代码可能适用于真实产品,但不适用于虚拟产品。但是我还没有测试过真正的产品。
让我详细搜索一下,他们为什么更改代码以及背后的目的是什么。
编辑:
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's answer
android in app billing purchase verification failed 得到这个。
希望对你有帮助。
【讨论】:
是的,你是对的,我也对此做了一些研究,见这里code.google.com/p/marketbilling/issues/…defect 150 是的,我使用的是旧代码,谷歌给我发了一封邮件,他们已经更新了 api,我们需要更新它,所以我正在尝试 如果您有任何新的更新,请告诉我。 以下链接的 GvS 答案中也给出了一个临时解决方案:***.com/questions/19732025/… 最好使用这个: if (signedData.contains("android.test.purchased")) return true; 【参考方案2】:我是通知 Google 安全团队这些安全漏洞的人。 请耐心等待,直到我公开披露这些错误,因为我给了 Google 时间来修复它们。 如果没有大网站写过这个问题,我将在 11 月 6 日公开一个有效的漏洞利用。
正如您已经查看了 verifyPurchase(),错误应该很明显。如果给定的签名是一个空字符串,该方法仍然返回 true(因为它默认返回 true)。
【讨论】:
如果对此进行了任何更改或修复,请告诉我们,感谢您提供信息 见sufficientlysecure.org/index.php/2013/10/29/…以上是关于更新后应用内计费不起作用 - Google 商店的主要内容,如果未能解决你的问题,请参考以下文章