15

我已经使用 Android 的应用内计费实现了一个测试应用。我已经在 Security.java 文件中填写了我的公钥。一切正常,但是当我提交付款时,应用程序崩溃了。我在 LogCat 中收到一条错误消息,上面写着“签名验证失败”,它对应于这段代码:

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

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

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

4

5 回答 5

27

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

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

2.- .apk 必须签名。您不能使用 debug.keystore,如果您这样做,您的签名字符串将为空。

请记住,对于测试应用内计费:

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

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

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

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

于 2012-02-08T12:34:13.360 回答
21

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

当我第一次设置应用内计费时,我尝试了静态响应并购买了 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 文件。当然,这仅适用于开发阶段。

于 2013-11-30T12:12:30.507 回答
2

就我而言,我粘贴了具有相同前缀和后缀的错误公钥。只需 100% 确定它是正确的。

于 2015-08-18T11:08:44.110 回答
0

我的回答将来可能对某人有帮助

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

于 2018-10-11T09:54:16.200 回答
-1

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

您可以在 Google Play 控制台中找到它,在您的应用选项卡下,转到获利设置选项卡,然后您可以复制它。

于 2021-05-26T15:16:54.460 回答