应用内结算的测试:android.test.purchased已经拥有(In-App Billing

2019-07-05 10:54发布

我目前正在测试应用内结算,为未来的应用程序,之后我成功地“买”“android.test.purchased”第一次的测试项目,我现在收到的响应码7每次我试图再次购买它的时候,这意味着我已经拥有这个项目。

12-15 23:02:14.149:E / IabHelper(19829):在应用内结算错误:无法购买商品,错误应对:7:项目已经拥有

据我了解,此次收购被认为总是可以的吧? 因此,开发人员可以测试他/她的应用程序?

如果没有,我怎么能“复位”状态到不归? 我使用从谷歌应用内结算样品的util包。

Answer 1:

该代码添加到一个线程来启动消费的要求。

int response = mService.consumePurchase(3, getPackageName(), purchaseToken);

这里购买测试,purchaseToken是

purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";

if (response == 0)

那么消费成功。



Answer 2:

无需写任何特殊代码的消费。 只需使用adb命令清除谷歌Play商店的数据:

adb shell pm clear com.android.vending


Answer 3:

事实证明,在android.test.purchased项目的行为像一个普通的ID。 这意味着,如果你希望能够再次购买的话,你必须在你的代码的地方使用它。 我认为,谷歌文档误导性在这个问题上,他们应该增加一个静态ID,你可以无休止地购买用于测试目的。



Answer 4:

应用程式版本3:

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {

    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

        .....................

        if (inventory.hasPurchase(SKU_CONTENT)) {

            mHelper.consumeAsync(inventory.getPurchase(SKU_CONTENT), null);
        }
    }
};


Answer 5:

这是我们如何能够占用的项目

 consume.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    String purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
                    try {
                        Log.d("","Running");
                        int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
                        if(response==0)
                        {
                            Log.d("Consumed","Consumed");
                        }else {
                            Log.d("","No"+response);
                        }
                    }catch (RemoteException e)
                    {
                        Log.d("Errorr",""+e);
                    }

                }
            });
            t.start();
        }
    });


Answer 6:

版本3:清除谷歌的缓存Play商店将让“android.test.purchased”再次可用。



Answer 7:

在我看来,如果你的程序不是用来消费的项目,你并不需要调整代码,以清除外部供应商的内存。 这将使你的代码更脆弱,你将有再花费大量的时间来添加和删除不属于你的软件,所以它是一个不好的设计来实现一个这样的解决方案代码。

这为我工作,清除android.test.purchased是最好的解决办法

adb uninstall com.yourapp.name

然后

adb shell pm clear com.android.vending

我并不需要清除现金和浏览我的应用程序设置或更改代码这一点。 我确实需要亚行添加到这是很简单的windows系统的路径变量。 所以,是的,你需要使用adb,你可能需要反正这样..

你只要将你的C:\ ... \ Android的SDK \平台工具; 在环境变量窗口路径,我想这是在Mac和Linux操作系统非常简单为好。 希望它可以帮助别人花几天少与应用帐单实施机器人。



Answer 8:

我用ADB壳:

adb shell pm clear com.android.vending


Answer 9:

主要的问题是你必须要消耗android.test.purchased项目。 但是,这个项目不会在查询库存可用,这样你就可以使用正常的流量不会消耗。

所以,如果你正在使用IabHelper,在IabHelper类,你可以暂时改变IInAppBillingService MSERVICE公众,使其从IabHelper访问。

然后在你的类,你可以消耗这个样子,

int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");

如果成功,响应将是0。

希望这可以帮助。



Answer 10:

如果你在测试环境

1)在android.test.purchased的情况下,我可以重置通过重新启动机器人装置的假付款(消耗的库存)。

2)在应用程式内UTIL有一个叫做Security.java文件,使之如下,临时。 由于测试支付(假的)总是由于安全异常返回false。

public static boolean verifyPurchase(String base64PublicKey,
                                     String signedData, String signature) {
    return true; }

然后在你的OnIabPurchaseFinishedListener调用fechInvForconsumeItem()

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
            = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result,
                                          Purchase purchase)
        {
            if (result.isFailure()) {
                // Handle error
                Log.e("123","Failure");

                return;
            }
            else if (purchase.getSku().equals(ITEM_SKU)) {
                Log.e("123","PURCAsed");
                fechInvForconsumeItem(); // Restart device if not consume

            }

        }
    };

所述fechInvForconsumeItem()是

    public void fechInvForconsumeItem() {
    mHelper.queryInventoryAsync(mReceivedInventoryListener);
}
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
        = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
                                         Inventory inventory) {


        if (result.isFailure()) {
            // Handle failure
            Log.e("11","Failure");



        } else {
            Log.e("11","suc");
            mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                    mConsumeFinishedListener);
        }


    }
};

消费监听器

    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
        new IabHelper.OnConsumeFinishedListener() {
            public void onConsumeFinished(Purchase purchase,
                                          IabResult result) {

                if (result.isSuccess()) {
                } else {
                    // handle error
                    Log.e("11","sucConsume");
                }
            }
        };


Answer 11:

出于测试目的,我也建议你插入了一段将被清除所有你已经调用初始化GP购买流量的方法之前买的产品代码。 这是特别舒服,当你此刻的测试只是一个项目。 例如,像这样的:

PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
    for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) {
        if(sourcePurchase != null){

            ConsumeResponseListener listener = new ConsumeResponseListener() {
                @Override
                public void onConsumeResponse(String outToken, @BillingResponse int responseCode) {

                    System.out.println("all consumed");
                }
            };
            mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener);
        }else{
            System.out.println("null");
        }
    }

// and then initiate whole process with clear "shoping basket"

BillingFlowParams.Builder builder = new BillingFlowParams.Builder()
        .setSku(itemName).setType(BillingClient.SkuType.INAPP);


Answer 12:

去谷歌游戏控制台和开放的订单管理选项卡。 在那里,你可以退还/取消测试购买。



Answer 13:

IabHelper.QueryInventoryFinishedListener 
       mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
       public void onQueryInventoryFinished(IabResult result, Inventory inventory)   
       {
          if (result.isFailure()) {
             return;
           }          
          try {

                if(inventory.hasPurchase("product_sku_id"))
                {   
                     isItemEnable= true;
                     mHelper.consumeAsync(inventory.getPurchase("product_sku_id"),null);            
                }
                else
                {
                       isItemEnable = false;
                }           

            } catch (Exception e) {
                e.printStackTrace();
            }
       }

    };


Answer 14:

这是消耗品,非消耗品之间的差异; 非消耗性物品(你似乎在这里要处理什么)有自己的状态跟踪持续,而消费的项目可以多次购买。 你必须进入你的播放管理控制台,并取消/退款销售再次测试它。



Answer 15:

就我而言,似乎谷歌不记录对物品的购买。 相反,谷歌的本地拷贝播放服务缓存购买。 这样,当第二个请求是在同一台设备上进行, android.test.purchased already owned出现。 然而,使用其他设备或重置设备清除缓存,并允许重复购买。



Answer 16:

就我而言,我只是需要清除应用缓存。 清除缓存后,我能够再次开始购买流程。

从我的设备(4.4.2),我导航到“设置 - >应用程序管理器”。 接下来,我选择的应用程序从“已下载”选项卡,然后在“清除缓存”。



文章来源: In-App Billing test: android.test.purchased already owned