Android的应用内结算:购买状态将保持“购买”订单取消后(Android In-App Bill

2019-07-18 04:00发布

我目前正在测试我的应用程式内计费机制(使用应用程式内结算第3版API,因此服用TrivialDrive例子作为参考)。

我有一个管理项目,这是升级到高级版本。

现在,购买该项目与我的测试帐号的作品,但是当我做在谷歌结帐整个订单的取消之后,我的代码仍然告诉我,该项目是外购的授予高级功能。

这里是我为您在我的MainActivity购买。 我不救的购买状态本地某个地方,我的理解是,与计费API第3版,您可以购买专门为需要查询。

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


                        }
                    }                       

                );              
            }
        });       
    }

我不断收到getPurchaseState = 0,这意味着购买,甚至一小时内,我取消了订单后。 为什么?

Answer 1:

在已经等了大约12个小时,并尝试过这里的一切建议,我仍然面临着同样的问题。 什么做的把戏对我来说是以下ADB命令:

亚行外壳时明确com.android.vending



Answer 2:

我知道这是一岁,但没有给出答案/提示的帮助我,所以我想我要补充我的解决方案。

首先,我遇到同样的问题。 也就是说,做了一个测试购买,取消它,仍然收到指示有效申购购买状态。

什么我忘了,我最近打开从“RESPOND_NORMALLY”的谷歌Play开发者控制台的设置窗格中的“许可测试响应”字段设置为“特许经营”

切换回“RESPOND_NORMALLY”后,取消了购买的购买状态正确也返回。

所以,你可能要检查你尝试之前等待天



Answer 3:

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

9月15日上午11:28取消了订单交付。

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

第2步:注销的设备上测试谷歌帐户,然后重新登录。

至少,解决我的问题。



Answer 4:

使用相同的帐户另一台设备上的应用程序时,这个问题也occures。 该项目不接收作为购买直到设备重新启动时,即使时之后。 如果试图再次购买时,谷歌钱包的对话框说:“项目已经拥有了”。 从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);
    }

因此,它不可能对这一谷歌计费对话的原因,我们总是得到相同的结果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);
    }

所以,现在如果从记账对话框中的反应是7“已经拥有条目” I报告回我的听众。



Answer 5:

你可以使用的是autoRenewing购买数据的领域。 根据该文件 :

autoRenewing:指示订阅是否自动更新。 如果为真,订阅处于活动状态,并且将在下一个结算日期自动续约。 如果为假,表明该用户已取消订阅

而本场得到取消后立即更新。



Answer 6:

如果我看到正确的trivialdrivesample参考代码是错误的,这将是本作的官方参考项目耻辱在应用程序内结算。

如果购买== NULL它只是意味着它从未被购买。 为了得到你要调用的真实信息

purchase.getPurchaseState()

根据这里

purchaseState订单的购买状态。 可能的值是0(购买),1(取消),2(退还),或者3(过期,仅订阅购买)。



Answer 7:

它早已在谷歌官方的文档回答。 这里复制的话。

当用户取消订阅,谷歌Play不提供针对当前结算周期的退款。 相反,它允许用户将有机会获得取消订阅,直到目前的计费周期结束,此时它终止认购。 例如,如果用户购买包月并取消它的周期的第15天,谷歌玩会考虑认购有效,直到第30天结束(或一天,这取决于一个月)。

这应该解释这一切。 getPurchase()仍然会返回购买数据,直到当前的订阅周期结束。



Answer 8:

我找到的文档(IAB API V2)在下面的部分,但我不知道这是否可以用于IAB API第3版。 广播可能仍然不过发送。

” ......你的应用程序可以在谷歌播放接收到来自谷歌钱包的退款通知收到IN_APP_NOTIFY广播意图。在这种情况下,谷歌播放发送IN_APP_NOTIFY消息给你的应用程序。您的应用程序可以处理此消息时,它处理从响应以同样的方式应用程序起始REQUEST_PURCHASE消息,以便最终你的应用程序接收包括关于已退还该项目信息的PURCHASE_STATE_CHANGED消息。退款信息包含在伴随PURCHASE_STATE_CHANGED广播意图JSON字符串。此外,在JSON的purchaseState场字符串被设置为2。”

来自: http://developer.android.com/google/play/billing/v2/api.html#billing-action-notify



文章来源: Android In-App Billing: Purchase state stays “purchased” after order cancelation