Android应用内结算:Security.java说“签名验证失败”

时间:2011-08-15 20:39:07

标签: android security signature verification in-app-billing

我已经使用Android的In-App Billing实现了一个测试应用。我在Security.java文件中填写了我的公钥。一切正常,但当我提交付款时,应用程序崩溃了。我在LogCat中收到一条错误,指出“签名验证失败”,这对应于这段代码:

if (!sig.verify(Base64.decode(signature))) {
                Log.e(TAG, "Signature verification failed.");
                return false;
}

如果我将该位更改为返回true而不是返回false,那么一切正常 - 我可以提交付款并安全返回应用程序 - 但我假设其他错误,因为我可能应该更改返回真。

关于可能导致这种情况的任何想法?

5 个答案:

答案 0 :(得分:25)

签名验证错误可能由以下原因引起:

1.- 错误的公钥。也许你忘了复制一些角色。它发生了:)

2.- The .apk must be signed 。你不能使用debug.keystore,如果你的签名字符串是空的。

请记住,要测试应用内结算:

  • 将Android Market公钥添加到Security.java(String base64EncodedPublicKey = "your public key here"

  • 在发布模式下构建并签名(如果您使用的是Eclipse,则可以使用“导出向导”)。

  • 将发布版本上传到Android电子市场,不发布,并创建产品列表。

  • 将应用程序安装到您的设备上(adb -d install myapp.apk),并在您的设备上将测试帐户设为主要帐户。

答案 1 :(得分:20)

就我而言,有一个隐藏得很好的问题。

当我第一次设置应用内结算时,我尝试了静态响应,并购买了android.test.purchased项目。当我切换到生产项目并试图查询库存时,那个假冒产品引起了我的所有麻烦。

因此,在这种情况下,解决方案是从我拥有的项目中删除假冒产品。

只需在IABHelper.java文件中添加以下代码段:

                Purchase p = new Purchase(itemType, purchaseData, signature);
                try {
                    consume(p);
                } catch (IabException e) {
                    e.printStackTrace();
                }

在具有此签名的方法的else语句中:

int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException

清理完自己的项目后,恢复原来的帮助程序java文件。 当然,这仅适用于开发阶段。

答案 2 :(得分:2)

在我的情况下,我粘贴了一个错误的公钥,它具有相同的前缀和后缀。只要100%确定它是正确的。

答案 3 :(得分:0)

“我的答案”可能对将来的某个人有用

请确保您的应用程序中具有正确的 base64EncodedPublicKey

答案 4 :(得分:-1)

如前所述,我使用了错误的 base64EncodedPublicKey。

您可以在 Google Play Console 中找到它,在您的应用标签下,转到获利设置标签,然后您可以复制它。