我无法在我的Android应用中实现应用结算。 我收到购买签名验证失败。 在第一次我很难,它是base64键,但我检查了很多次,我仍然得到错误,然后我看了一下Security.java文件,我发现这个方法,我编辑得到一些信息关于什么是错的:
public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) ||
TextUtils.isEmpty(signature)) {
if(TextUtils.isEmpty(signedData)) Log.d(TAG, "SIGNED DATA EMPTY");
if(TextUtils.isEmpty(base64PublicKey)) Log.d(TAG, "KEY IS EMPTY");
if(TextUtils.isEmpty(signature)) Log.d(TAG, "SIGNATURE IS EMPTY");
Log.e(TAG, "Purchase verification failed: missing data.");
return false;
}
PublicKey key = Security.generatePublicKey(base64PublicKey);
return Security.verify(key, signedData, signature);
}
我得到“签名是空的”。 即使我按照以下步骤操作: - 用我的释放键签名apk - 将其作为草稿加载 - 使用“adb -d install app.apk”
在设备上安装它我正在测试真实购买。 感谢。
编辑购买流程没问题,我在拨打queryInventoryAsync
时收到错误
答案 0 :(得分:40)
您可以使用测试SKU进行测试as explained here。这些是:
android.test.purchased
android.test.canceled
android.test.refunded
android.test.item_unavailable
即使在测试和调试方案中,这些购买也会成功(至少是android.test.purchased),而无需取消购买。
在验证购买中,我将return false
更改为:
Log.e(TAG, "Purchase verification failed: missing data.");
if (BuildConfig.DEBUG) {
return true;
}
return false;
但你应该知道只在测试场景中使用它。
如果您有调试版本,则返回true,并且缺少签名数据。由于BuildConfig.DEBUG在生产版本中将为false,因此应该没问题。但更好的是在调试完所有内容后删除此代码。
答案 1 :(得分:39)
将您的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;
}
查看此链接以获取更多信息:
In App billing not working after update - Google Store
使用try替换项目中的OLD CODE方法verifyPurchase()
方法。但它应该只在您尝试购买测试产品时才会发生。使用此代码后,请告知我购买的实际产品。
修改强>
为什么会发生因为我们在使用" android.test.purchased"等虚拟产品时不会获得任何签名。所以在旧代码中,它运行良好,因为即使没有给出签名我们也返回true,而对于新代码我们返回false。
有关签名数据的更多信息null或来自link1和link2的空白
因此,我建议您只使用旧代码方法verifyPurchase()
代替新代码方法。
我认为新代码可能适用于真实产品,但不适用于虚拟产品。但是我还没有测试过真正的产品。
或
使用GvS的答案进行测试购买它也是新代码的良好解决方案。
希望它能解决你的问题。
答案 2 :(得分:1)
确保您使用手机上的合适用户登录,或者在开发者控制台中将您的手机的Google帐户添加为测试用户。
http://developer.android.com/google/play/billing/billing_testing.html#billing-testing-static:
在某些情况下,保留的项目可能会返回签名的静态响应,这使您可以在应用程序中测试签名验证。如果运行应用程序的用户具有开发人员或测试帐户,则保留项仅返回已签名的响应。
答案 3 :(得分:0)
将返回值设置为true在
中public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
return true;
}
测试后撤消更改