我已经使用Android的In-App Billing实现了一个测试应用。我在Security.java文件中填写了我的公钥。一切正常,但当我提交付款时,应用程序崩溃了。我在LogCat中收到一条错误,指出“签名验证失败”,这对应于这段代码:
if (!sig.verify(Base64.decode(signature))) {
Log.e(TAG, "Signature verification failed.");
return false;
}
如果我将该位更改为返回true而不是返回false,那么一切正常 - 我可以提交付款并安全返回应用程序 - 但我假设其他错误,因为我可能应该更改返回真。
关于可能导致这种情况的任何想法?
答案 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 中找到它,在您的应用标签下,转到获利设置标签,然后您可以复制它。