【问题标题】:Google Play Billing - signature verification failed for sku android.test.purchasedGoogle Play 结算 - sku android.test.purchased 的签名验证失败
【发布时间】:2014-05-04 15:35:55
【问题描述】:

编辑:由于有些人仍在查看此线程,我想提一下,这是非常过时的,因为它是关于应用程序购买中的 v2,现在已弃用。请查看latest(当前为 v3)文档,非常简单

关于这个问题有很多线程,我想我理解这个问题,但是,目前我无法测试实际购买,因为我目前没有有效的信用卡,谷歌接受的,只有一个大师,这是不被接受的。这就是我寻求帮助的原因(不是购买验证,而是验证我的思维过程是否良好)。

首先,问题来自新的verifyPurchase 方法。新方法检查签名,应该没问题。但是,Google 没有为测试 ID 提供任何签名,例如 android.test.purchased。这导致下面的方法总是失败,并且在验证时总是返回false,即使假购买已经完成,并且我有一个确认对话框,购买确实成功。方法:

public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
    //if(BuildConfig.DEBUG) return true;

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

问题来自TextUtils.isEmpty()检查,由于签名将为空,代码将返回false。我的临时测试解决方法在代码中,注释掉了。如果我在测试方法的开头添加if(BuildConfig.DEBUG) return true;,一切正常,用户可以启动并运行高级功能,所以问题确实与签名有关。

另一个问题是,如果我购买android.test.purchased,我无法查询用户的库存,因此我无法确定我的检查器方法是否有效,该方法检查用户是否购买了高级功能。

我的两个问题:

如果我从verifyPurchase 中删除if(BuildConfig.DEBUG) return true; 行,并将android.test.purchased id 替换为我提供的真实SKU 的真实ID,我能否确定在我的情况下一切正常?我再说一遍,添加了调试功能后一切正常。如果您需要查看更多代码,请告诉我!

下面的方法检查用户是否购买了高级功能,如果他/她购买了,则设置相应的偏好,否则,如果有任何问题,它将保持原样。这种方法正确吗?我在 Application 类中执行此操作,在每个应用程序启动时,以防止修补。

private void checkPremium()
{
    //get the helper up and running
    final IabHelper helper=new IabHelper(INSTANCE, getBase64Key());
    helper.startSetup(new IabHelper.OnIabSetupFinishedListener()
    {
        @Override
        public void onIabSetupFinished(IabResult result)
        {
            //if the helper is in a correct state, check the inventory
            if(result.isSuccess())
            {
                helper.queryInventoryAsync(new IabHelper.QueryInventoryFinishedListener()
                {
                    @Override
                    public void onQueryInventoryFinished(IabResult result, Inventory inv)
                    {
                        //if the inventory is reachable, check if we got the premium
                        if(result.isSuccess())
                        {
                            setPremium(inv.hasPurchase(ActWidgetSearch.SKU));
                        }
                    }
                });
            }
        }
    });
}

提前致谢!

【问题讨论】:

标签: android in-app-billing


【解决方案1】:

几天前我遇到了和你一样的问题。对于那些从 Google Play 下载您的实时应用程序的人,如果测试 ID(“android.test.purchased”)如您所说,他们将能够购买您的应用内购买。 Google play 将其视为“真实购买”,并通过与您的个人 SKU 相同的渠道。见下文:

测试购买(应用内结算沙盒)

一旦获得测试访问权限,这些用户就可以旁加载您的应用并测试您产品的完整销售、购买和履行流程。测试购买是真实订单,Google Play 以与其他订单相同的方式处理它们。购买完成后,Google Play 会阻止订单进入财务处理流程,确保不会向用户帐户收取任何实际费用,并在 14 天后自动取消已完成的订单。

http://developer.android.com/google/play/billing/billing_testing.html#test-purchases

我现在刚刚测试了我自己的个人 SKU,我可以说它们确实有效! (我在我的 Google Merchant 帐户中看到了订单)。所以去那里,赚点钱:)

顺便说一句,开发人员对开发人员...您能否向我展示有关如何在 Application 类中运行我的购买验证的任何示例或教程链接?我认为这是我绝对想从你那里窃取的想法。干杯!

【讨论】:

  • 感谢您的回复,它确实有效,而且我的应用内购买已经上线了很长一段时间。我在以下链接上剪切并粘贴了我的解决方案:pastebin.com/xmCAJGNb。在我的解决方案中,每个方法都是 Application 类的一部分。干杯!
【解决方案2】:

确保您在手机上使用正确的用户登录,例如在开发者控制台中将您手机的 google 帐户添加为测试用户。

http://developer.android.com/google/play/billing/billing_testing.html#billing-testing-static:

在某些情况下,保留的项目可能会返回签名的静态响应,这使您可以在应用程序中测试签名验证。仅当运行应用程序的用户拥有开发者或测试帐户时,保留项目才会返回签名响应。

【讨论】:

    猜你喜欢
    • 2020-04-08
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2017-11-28
    • 2013-10-28
    • 2020-11-02
    相关资源
    最近更新 更多