Android应用程序结算:订单取消后,购买状态保持"已购买"状态

Ton*_*oni 46 android in-app-purchase in-app-billing

我目前正在测试我的InApp计费机制(使用InApp Billing版本3 API,因此将TrivialDrive示例作为参考).

我有一个托管项目,即升级到高级版本.

现在,使用我的测试帐户购买该项目是有效的,但是当我之后在Google结帐中取消整个订单时,我的代码仍然告诉我该项目已购买,因此授予高级功能.

以下是我在MainActivity中检查购买的方法.我不会在某处本地保存购买状态,因为据我所知,使用billing API v3,您可以根据需要查询特定购买.

@Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();

        iabHelper = new IabHelper(this, Helper.getPKey());
        iabHelper.enableDebugLogging(true);

        iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {

            @Override
            public void onIabSetupFinished(IabResult result) {
                Log.d("IAB", "SETUP FINISHED");

                if(!result.isSuccess())
                {
                    Log.d("IAB", "SETUP NOT OK");
                    return;
                }
                else
                    Log.d("IAB", "SETUP OK");

                iabHelper.queryInventoryAsync(
                    new QueryInventoryFinishedListener() {

                        @Override
                        public void onQueryInventoryFinished(IabResult result, Inventory inv) {
                            Log.d("IAB", "Query inventory finished.");
                            if (result.isFailure()) {
                                Log.d("IAB","Failed to query inventory: " + result);
                                return;
                            }

                            Log.d("IAB", "Query inventory was successful.");

                            // Do we have the premium upgrade?
                            boolean mIsPremium = inv.hasPurchase(Helper.premiumSku);
                            Purchase p = inv.getPurchase(Helper.premiumSku);
                            if(p != null)
                                Log.d("IAB PURCHASE STATE", IabHelper.getResponseDesc(p.getPurchaseState()));
                            else
                                Log.d("IAB PURCHASE STATE", "Purchase is null");

                            Log.d("IAB", "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));


                        }
                    }                       

                );              
            }
        });       
    }
Run Code Online (Sandbox Code Playgroud)

我一直得到getPurchaseState = 0,这意味着购买,即使我取消订单后一小时.为什么?

小智 12

在等了大约12个小时并尝试了这里建议的所有内容之后,我仍然面临同样的问题.对我来说诀窍是以下adb命令:

adb shell pm clear com.android.vending

  • 如果问题可由您的应用用户重现,我不会称之为"解决方案",即使他们知道如何操作,他们也不会使用adb来清除他们的购买方式.从用户的角度来看,获得退款后享受inapp购买的能力不是问题. (10认同)

Jan*_*non 7

我知道这已经有一年了,但没有提供的答案/提示对我有帮助,所以我想我会添加我的解决方案.

首先,我遇到了同样的问题.即,进行测试购买,取消测试,仍然收到表示有效购买的购买状态.

我忘记的是,我最近将Google Play开发者控制台设置面板上的"许可证测试响应"字段从"RESPOND_NORMALLY"切换为"许可"

将其切换回"RESPOND_NORMALLY"后,已正确返回已取消购买的购买状态.

所以,在尝试等待几天之前,您可能需要检查一下

  • 这不是LVL,而不是应用程序内结算? (2认同)

Ely*_*uda 6

您可以使用的是autoRenewing购买数据的字段。根据文档

autoRenewing:表示订阅是否自动续订。如果为 true,则订阅处于活动状态,并将在下一个计费日期自动续订。如果为 false,则表示用户已取消订阅

该字段在取消后立即更新。

  • 如果不是订阅呢? (2认同)

pin*_*nux 5

步骤1.等待大约10分钟; 直到您看到"已取消的订单"已交付.在你的谷歌钱包.

9月15日上午11:28取消订单已下达.

9月15日上午11:18取消您取消了此订单.原因:客户要求取消.

步骤2.在设备上注销您的测试Google帐户,然后重新登录.

至少那解决了我的问题.

  • 重新启动也为我做到了。但似乎用户只要不重新启动设备就可以保留购买,这对很多人来说是不可能的。 (2认同)
  • 当真?我们在分发您的应用时谈论现实生活中的问题,您可以要求用户遵循这些步骤! (2认同)

Ked*_*edu 5

在具有相同帐户的另一台设备上使用该应用程序时,也会发生此问题。直到重新启动设备(即使数小时后),也不会收到购买的商品。如果尝试再次购买,则Google钱包对话框会显示“已拥有商品”。iabHelper的返回代码仍然被“用户取消”,原因是没有将购买活动的真实响应返回给用户,只是将其写在调试日志中。

else if (resultCode == Activity.RESULT_CANCELED) {
        logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode));
        result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled.");
        if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);
    }
Run Code Online (Sandbox Code Playgroud)

因此,无法对这个Google帐单对话框做出反应,因为即使对话框中说“项目已拥有”,我们也总是得到相同的结果IABHELPER_USER_CANCELED。

编辑:

我用这个来解决:

else if (resultCode == Activity.RESULT_CANCELED) {
        logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode));
        if(responseCode == 7) 
            result = new IabResult(BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED, "Item already owned.");
        else                                                                                             
            result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled.");
        if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);
    }
Run Code Online (Sandbox Code Playgroud)

因此,现在如果来自“计费”对话框的响应为7,即“项目已拥有”,我会将其报告回我的侦听器。


tma*_*hey 1

如果我正确地看到 trivialdrivesample 中的参考代码是错误的,这对于应用程序内计费的官方参考项目来说将是一种耻辱。

如果 buy == null 则仅表示从未购买过。要获取真实信息,您必须致电

purchase.getPurchaseState()
Run Code Online (Sandbox Code Playgroud)

根据这里

buyState 订单的购买状态。可能的值为 0(已购买)、1(已取消)、2(退款)或 3(已过期,仅适用于订阅购买)。

  • 根据 v3 文档,没有 3(过期)。这是否意味着我们无法再通过此方法检查订阅状态?http://developer.android.com/google/play/billing/billing_reference.html (3认同)

归档时间:

查看次数:

28293 次

最近记录:

6 年,7 月 前