这是因为在新的修复版本中,Security类中的verifyPurchase()方法已经被更改了。让我向您展示确切的问题:
Security类的更改
旧代码
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);
}
根据我从New code的搜索和测试结果得出,
为什么会发生这种情况是因为当我们使用像"android.test.purchased"这样的虚拟产品时,我们将无法获得任何签名。所以在旧代码中,即使没有给出签名也会返回true,而对于新代码,我们将返回false。
有关签名数据为空或空白的更多信息,请参见
link1和
link2。
所以我建议您只需替换旧代码方法verifyPurchase()而不是New Code方法。
我认为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在生产构建中将为false,因此这应该是可以的。但是最好在所有代码调试完成后删除此代码。
我已经编辑了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的答案中得到了这个。
希望对你有所帮助。