应用内结算testing:android.test.purchased已经拥有

我目前正在为未来的应用程序testing应用程序内结账,并且在我第一次成功“购买”testing项目“android.test.purchased”之后,每当我尝试再次购买时,我都会收到响应代码7,这意味着我已经拥有这个项目。

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

据我所知,这次购买应该总是可能的,对吧? 所以开发者可以testing他/她的应用程序?

如果没有,我怎么能“重置”它的状态不拥有? 我正在使用Google应用内结算示例中的util包。

将此代码添加到线程以启动消费请求。

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

purchaseToken在这里用于购买testing

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

 if (response == 0) 

那么消费是成功的。

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

 adb shell pm clear com.android.vending 

事实certificate,android.test.purchased项目的行为就像一个普通的ID。 这意味着如果你想再次购买它,你必须在代码中的某处使用它。 我认为Google文档在这个问题上是误导性的,他们应该添加另一个静态ID,您可以无限购买以进行testing。

应用内版本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); } } }; 

版本3 :清除Google Play商店的caching将使“android.test.purchased”再次可用。

这是我们如何消耗物品

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

在我看来,如果你的程序没有被devise为消费这个物品,你不需要调整代码来清除外部供应商的内存。 这会让你的代码变得更加脆弱,于是你将花费大量的时间来添加和删除不属于你的软件的代码,所以实现这样的解决scheme是一个糟糕的devise。

为我清除android.test.purchased工作的最佳解决scheme是

 adb uninstall com.yourapp.name 

接着

 adb shell pm clear com.android.vending 

我不需要清除现金,浏览我的应用程序设置或更改代码。 我确实需要将adb添加到windows系统的pathvariables中,这非常简单。 所以是的,你需要使用你可能需要的adb所以..

您只需添加您的C:\ … \ android-sdk \ platform-tools; 在Windows环境variables的path中,我想在Mac和Linux操作系统中它是非常简单的。 希望它可以帮助别人花几天时间在应用帐单中实现android。

主要问题是你必须使用“android.test.purchased”项目。 但是这个项目在你的查询库存中是不可用的,所以你不能使用正常的stream程。

因此,如果您正在使用IabHelper,则可以在IabHelper类中临时更改“IInAppBillingService mService” 向公众提供,以便从您的IabHelper访问。

那么在你的课堂上,你可以像这样消耗,

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

如果成功,则回应为0。

希望这个帮助。

我用adbshell:

 adb shell pm clear com.android.vending 
 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(); } } }; 

如果你在testing环境

1)在android.test.purchased的情况下,我可以通过重新启动Android设备(消耗库存)重置假支付。

2)在InApp util中有一个名为Security.java的文件,如下所示,暂时为。 由于安全例外,testing付款(假)总是返回错误。

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

出于testing的目的,我还build议您在调用初始化gp购买stream程的方法之前,先插入一段代码,以清除您购买的所有产品。 当您仅testing一个项目时,这特别舒适。 像这样:

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

转到Google Play控制台并打开“订单pipe理”选项卡。 在那里你可以退款/取消testing购买。

这是消耗品和非消耗品之间的区别; 非消耗品(你似乎在这里处理的)持续追踪他们的状态,而消耗品可以多次购买。 您必须进入Playpipe理控制台,然后取消/退款销售以再次进行testing。

就我而言,Google似乎没有为该项目logging购买。 Google Play服务的本地副本caching了购买。 这样,当第二个请求在同一个设备上进行时, android.test.purchased already owned 。 但是,使用其他设备或重置设备会清除caching,并允许重复购买。

就我而言,我只需要清除应用程序caching。 清除caching后,我可以再次启动购买stream程。

从我的设备(4.4.2),我导航到“设置 – >应用程序pipe理器”。 接下来,我从“下载”选项卡中select应用程序,然后select“清除caching”。