更新后应用内计费不起作用 - Google 商店

Posted

技术标签:

【中文标题】更新后应用内计费不起作用 - Google 商店【英文标题】:In App billing not working after update - Google Store 【发布时间】:2013-11-01 06:54:39 【问题描述】:

我已经在我的应用中实现了应用内计费 - 最近 google 对其进行了更新,之前我正在使用 "android.test.purchased" 测试应用内计费,它运行良好(购买完整版并恢复完整版)。

现在我从这里学习了改变的课程 https://code.google.com/p/marketbilling/source/detail?r=7bc191a004483a1034b758e1df0bda062088d840

之后我无法测试应用程序,它在 Logcat "IabHelper: In-app billing error: Purchase signature verification FAILED for sku android.test.purchased ". 中给出以下错误

我已经检查了我的密钥、包名和应用程序版本都正确,有人遇到过这个问题吗?

请帮帮我。

【问题讨论】:

您是直接从 Eclipse 进行测试,我的意思是直接在设备上运行而不是签名构建吗?如果是,请尝试通过签名的 apk 进行测试,然后让我回复会发生什么。 @Maulik 这有什么关系,因为以前我只是从 Eclipse 安装并测试它工作得很好,只是现在在添加更改后它向我显示错误,任何方法都会检查一次跨度> @Maulik 我检查了它,它仍然显示相同的错误 @Bruno Oliveira,先生,请检查此问题并请告诉我们解决方案,我得到以下原因(在我的回答中给出)为什么会发生。 三年了,还没修好:( 【参考方案1】:

这是因为 Security 类中的 verifyPurchase() 方法已在新修复中进行了更改。让我告诉你确切的问题是什么:

安全类更改

旧代码

 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);


根据我从新代码中搜索和测试的内容,

为什么会发生,因为我们在使用像“android.test.purchased”这样的虚拟产品时不会得到任何签名。所以在旧代码中它运行良好,因为即使没有给出签名,我们也会返回 true,而对于新代码,我们会返回 false。

更多关于来自link1和link2的签名数据空或空白的信息

所以我建议你只是替换旧的代码方法 verifyPurchase() 而不是 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 在生产构建中将是错误的,这应该没问题。但最好是在调试完所有内容后删除此代码。

我在 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's answer android in app billing purchase verification failed 得到这个。

希望对你有帮助。

【讨论】:

是的,你是对的,我也对此做了一些研究,见这里code.google.com/p/marketbilling/issues/…defect 150 是的,我使用的是旧代码,谷歌给我发了一封邮件,他们已经更新了 api,我们需要更新它,所以我正在尝试 如果您有任何新的更新,请告诉我。 以下链接的 GvS 答案中也给出了一个临时解决方案:***.com/questions/19732025/… 最好使用这个: if (signedData.contains("android.test.purchased")) return true; 【参考方案2】:

我是通知 Google 安全团队这些安全漏洞的人。 请耐心等待,直到我公开披露这些错误,因为我给了 Google 时间来修复它们。 如果没有大网站写过这个问题,我将在 11 月 6 日公开一个有效的漏洞利用。

正如您已经查看了 verifyPurchase(),错误应该很明显。如果给定的签名是一个空字符串,该方法仍然返回 true(因为它默认返回 true)。

【讨论】:

如果对此进行了任何更改或修复,请告诉我们,感谢您提供信息 见sufficientlysecure.org/index.php/2013/10/29/…

以上是关于更新后应用内计费不起作用 - Google 商店的主要内容,如果未能解决你的问题,请参考以下文章

在 Play 商店中发布后,Google 身份验证不起作用

发布 Flutter 应用后,Google 登录不起作用

应用商店更新后 UIScrollView 不起作用

为了避免盗版,在应用中添加“应用内计费”而不是在 Play 商店中将其作为付费应用发布会更好吗?

使用最新的 Play 商店“不支持应用内结算版本 3”

播放商店 alpha 测试下载链接不起作用