Google Play结算 - sku android.test.purchased的签名验证失败

时间:2014-03-26 10:06:07

标签: android in-app-billing

编辑:由于有些人还在检查这个帖子,我想提一下这是非常过时的,因为它在应用程序购买时大约是v2,现在已被弃用。请查看latest(目前为v3)文档,这非常简单

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

首先,问题来自新的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,我无法查询用户的广告资源,因此我无法确定,检查用户是否已购买高级功能的检查程序方法有效。< / p>

我的两个问题:

如果我从if(BuildConfig.DEBUG) return true;删除了verifyPurchase行,并将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));
                        }
                    }
                });
            }
        }
    });
}

提前致谢!

2 个答案:

答案 0 :(得分:4)

我几天前遇到了和你一样的问题。对于那些从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类中运行我的购买验证的教程的任何示例或链接吗?我认为这是一个我绝对想偷你的想法。干杯!

答案 1 :(得分:2)

确保您使用手机上的合适用户登录,或者在开发者控制台中将您的手机的Google帐户添加为测试用户。

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

  

在某些情况下,保留的项目可能会返回签名的静态响应,这使您可以在应用程序中测试签名验证。如果运行应用程序的用户具有开发人员或测试帐户,则保留项仅返回已签名的响应。