Google 应用内结算为测试购买返回无效签名
Google In-App Billing returning invalid signature for test purchases
我在对我的应用内商品进行许可测试时遇到了问题。我在 Google Play 测试频道发布了一个应用程序,并且我在开发控制台中将我的相关 Google 帐户列为许可证测试人员。 (这意味着我可以制作 "purchases" 而无需实际支付商品费用。)
当我第一次访问应用内商店时,一切正常。但是,在 "purchasing" 一件商品上,我在购买流程响应中收到签名验证错误。从那时起,我在查询 商店库存时也收到相同的签名错误。
我需要这部分的帮助。我已经看到 posts stating that the method verifyPurchase
within Security.java
is to blame. Those other posts 声明问题是 android.test.purchased
return 为签名设置了一个空字符串。我看到的是不同的。我的调用通过了 isEmpty(signature)
测试,但随后在代码中被拒绝。 为什么 Google 应用内结算 return 签名无效? 我在下面包含了相关代码。
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。我现在已经尝试使用真正的信用卡进行实际购买;我看到了完全相同的结果。尽管 Google Play 购买流程按预期完成,但我并没有真正收到我的产品。 return进入商店后,Google Play 没有 return 应用内库存。
我的问题实际上与 Google Play In-App Billing Java 代码无关。我为我的应用读取了错误的许可证密钥。我的项目有几种不同的风格。添加此特定风格时,包含许可证密钥的文件是从其他风格复制的,并且从未更改过。现在我已经更正了密钥,一切正常。
TL;DR:验证您的 Google Play 许可证密钥是否正确。
我在对我的应用内商品进行许可测试时遇到了问题。我在 Google Play 测试频道发布了一个应用程序,并且我在开发控制台中将我的相关 Google 帐户列为许可证测试人员。 (这意味着我可以制作 "purchases" 而无需实际支付商品费用。)
当我第一次访问应用内商店时,一切正常。但是,在 "purchasing" 一件商品上,我在购买流程响应中收到签名验证错误。从那时起,我在查询 商店库存时也收到相同的签名错误。
我需要这部分的帮助。我已经看到 posts stating that the method verifyPurchase
within Security.java
is to blame. Those other posts 声明问题是 android.test.purchased
return 为签名设置了一个空字符串。我看到的是不同的。我的调用通过了 isEmpty(signature)
测试,但随后在代码中被拒绝。 为什么 Google 应用内结算 return 签名无效? 我在下面包含了相关代码。
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。我现在已经尝试使用真正的信用卡进行实际购买;我看到了完全相同的结果。尽管 Google Play 购买流程按预期完成,但我并没有真正收到我的产品。 return进入商店后,Google Play 没有 return 应用内库存。
我的问题实际上与 Google Play In-App Billing Java 代码无关。我为我的应用读取了错误的许可证密钥。我的项目有几种不同的风格。添加此特定风格时,包含许可证密钥的文件是从其他风格复制的,并且从未更改过。现在我已经更正了密钥,一切正常。
TL;DR:验证您的 Google Play 许可证密钥是否正确。