gpt4 book ai didi

Android应用内购买: Signature verification failed

转载 作者:IT老高 更新时间:2023-10-28 13:16:56 25 4
gpt4 key购买 nike

我已经尝试了几天来解决这个问题,使用SDK附带的Dungeons演示代码。我已经尝试谷歌寻找答案,但找不到答案。

  • 在地下城演示中,我从开发控制台传递了我的公钥。
  • 签署apk并上传到控制台而不发布。
  • 测试 android.test.purchased 和在控制台上创建并发布订阅的产品列表(我希望为我的应用提供的主要功能)。

但我仍然收到 签名验证失败 的错误,然后签名与数据不匹配。我该如何解决这个问题?

public static ArrayList<VerifiedPurchase> verifyPurchase(String signedData, String signature)
{
if (signedData == null) {
Log.e(TAG, "data is null");
return null;
}
if (Consts.DEBUG) {
Log.i(TAG, "signedData: " + signedData);
}
boolean verified = false;
if (!TextUtils.isEmpty(signature)) {

String base64EncodedPublicKey = "MIIBIjA....AQAB";
PublicKey key = Security.generatePublicKey(base64EncodedPublicKey);
verified = Security.verify(key, signedData, signature);
if (!verified) {
Log.w(TAG, "signature does not match data.");
return null;
}
}
}

public static boolean verify(PublicKey publicKey, String signedData, String signature)
{
if (Consts.DEBUG) {
Log.i(TAG, "signature: " + signature);
}
Signature sig;
try {
sig = Signature.getInstance(SIGNATURE_ALGORITHM);
sig.initVerify(publicKey);
sig.update(signedData.getBytes());
if (!sig.verify(Base64.decode(signature))) {
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;
}

最佳答案

这个问题在当前的 Google 结算版本中仍然存在。基本上 android.test.purchased 坏了;购买 android.test.purchased 后,Security.java 中的 verifyPurchase 函数将始终失败,QueryInventoryFinishedListener 将停止在 行if (result.isFailure());这是因为 android.test.purchased 项目总是无法通过 Security.java 中的 TextUtils.isEmpty(signature) 检查,因为它不是真正的项目并且没有返回签名由服务器。

我的建议(由于缺乏任何其他解决方案)是永远不要使用“android.test.purchased”。网上有各种代码调整,但没有一个能 100% 工作。

如果您使用过 android.test.purchased,那么摆脱错误的一种方法是执行以下操作:-

  1. 编辑 Security.java 并将 verifyPurchase 中的“return false”行更改为“return true” - 这是暂时的,我们将在一分钟内将其放回原处。
  2. 在您的 QueryInventoryFinishedListener 中,在“if (result.isFailure()) {...}”行之后添加以下内容以消耗并摆脱您永无止境的 android.test.purchased 项目:

    if (inventory.hasPurchase(SKU_ANDROID_TEST_PURCHASE_GOOD)) {  
    mHelper.consumeAsync(inventory.getPurchase(SKU_ANDROID_TEST_PURCHASE_GOOD),null);
    }
  3. 运行您的应用程序,以便 consunmeAsync 发生,这将摆脱服务器上的“android.test.purchased”项。

  4. 删除 consumeAsync 代码(或将其注释掉)。
  5. 回到Security.java,将“return true”改回“return false”。

您的 QueryInventoryFinishedListener 在验证时将不再出错,一切都恢复“正常”(如果您可以这样调用它)。记住 - 不要再使用 android.test.purchased 了,因为它只会再次导致这个错误......它坏了!测试您购买它的唯一真正方法是上传 APK,等待它出现,然后在启用日志记录的设备上测试它(相同的 APK)。

关于Android应用内购买: Signature verification failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14600664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com