Android Google应用内计费返回测试购买的无效签名
我在许可证测试我的应用程序内产品时遇到问题。我有一个发布到Google Play beta频道的应用程序,我的相关Google帐户作为许可证测试人员列在开发控制台中。(意味着我可以“购买”而不必实际支付物品。) 当我第一次访问应用程序商店时,一切正常。但是,在“购买”一个项目时,我在购买流响应中收到一个签名验证错误。从那时起,我在查询商店库存时也会收到相同的签名错误。 这部分我需要帮助。我看到有人说Android Google应用内计费返回测试购买的无效签名,android,in-app-purchase,google-play-services,in-app-billing,Android,In App Purchase,Google Play Services,In App Billing,我在许可证测试我的应用程序内产品时遇到问题。我有一个发布到Google Play beta频道的应用程序,我的相关Google帐户作为许可证测试人员列在开发控制台中。(意味着我可以“购买”而不必实际支付物品。) 当我第一次访问应用程序商店时,一切正常。但是,在“购买”一个项目时,我在购买流响应中收到一个签名验证错误。从那时起,我在查询商店库存时也会收到相同的签名错误。 这部分我需要帮助。我看到有人说Security.java中的verifyPurchase方法是罪魁祸首。这些状态说明问题在于an
Security.java
中的verifyPurchase
方法是罪魁祸首。这些状态说明问题在于android.test.purchased
返回一个空字符串作为签名。我看到的是不同的。我的调用通过了isEmpty(signature)
测试,但随后在代码中被拒绝为什么谷歌应用内计费返回的签名无效?我已经在下面包含了相关代码
public class Security {
// ...
// This method is part of the trace from
// IabHelper.queryInventory and IabHelper.onActivityResult
public static boolean verifyPurchase(String base64PublicKey, String signedData,
String signature) {
if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) ||
TextUtils.isEmpty(signature)) { // Most say their problem is here
Log.e(TAG, "Purchase verification failed: missing data.");
return false;
}
PublicKey key = Security.generatePublicKey(base64PublicKey);
return Security.verify(key, signedData, signature); // My code gets here, but...
}
public static boolean verify(PublicKey publicKey, String signedData,
String signature) {
Signature sig;
try {
sig = Signature.getInstance(SIGNATURE_ALGORITHM);
sig = initVerify(publicKey);
sig.update(signedData.getBytes());
if (!sig.verify(Base64.decode(signature))) { // ...verify fails; return false
Log.e(TAG, "Signature verification failed.");
return false;
}
return true;
} catch (NoSuchAlgorithmException e) {
Log.e(TAG, "NoSuchAlgorithmException.");
} catch (InvalidKeyException e) {
Log.e(TAG, "Invalid key specification.");
} catch (SignatureException e) {
Log.e(TAG, "Signature exception.");
} catch (Base64DecoderException e) {
Log.e(TAG, "Base64 decoding failed.");
}
return false;
}
}
更新:正如我在评论中提到的,我正在运行一个已签名的APK,可调试标志设置为true。我现在试着用一张真正的信用卡进行实际购买;我看到了完全相同的结果。尽管GooglePlay的购买流程如期完成,但我并没有收到我的产品。返回商店后,Google Play没有返回应用内清单。我的问题实际上与Google Play应用内计费Java代码无关。我为我的应用读取了错误的许可证密钥。我的项目有几种不同的风格。添加此特定样式时,包含许可证密钥的文件从其他样式复制而来,并且从未更改。现在我已经更正了钥匙,一切都按预期进行
TL;DR:验证您的Google Play许可证密钥是否正确。您正在测试的应用程序在beta-dev控制台中的版本代码与该应用程序相同?它是在发行版中编译的吗?你不能用debug应用程序测试inapp,你使用的应用程序的版本代码必须为Google所知。哦……你是在使用模拟器还是真实设备?你需要谷歌播放更新的应用程序了!我满足了所有这些条件。我之所以能够精确定位这一行,是因为我运行的是一个签名的APK,版本代码与Play Store beta相同,但可调试标志设置为true。我承认我可能有点抓紧救命稻草,但我看到的最终结果与运行从Play Store下载的测试版时一样。采购没有按应有的方式完成,并且在尝试采购后库存调用失败。