Android 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

我在许可证测试我的应用程序内产品时遇到问题。我有一个发布到Google Play beta频道的应用程序,我的相关Google帐户作为许可证测试人员列在开发控制台中。(意味着我可以“购买”而不必实际支付物品。)

当我第一次访问应用程序商店时,一切正常。但是,在“购买”一个项目时,我在购买流响应中收到一个签名验证错误。从那时起,我在查询商店库存时也会收到相同的签名错误。

这部分我需要帮助。我看到有人说
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下载的测试版时一样。采购没有按应有的方式完成,并且在尝试采购后库存调用失败。