2016-08-18 125 views
0

我有一个新的Android应用程序中,我添加应用内结算和我撕扯我的头发与无奈。错误您已拥有这项商品

我上传了一个已签名的APK并发布为alpha。我创建了一组应用内产品并将其全部激活。我创建了一个新的Gmail帐户,并将其定义为应用程序apk页面上的应用程序测试人员。 我有工厂重置我的android手机,并用新的Gmail帐户初始化它。我已将/ apps/testing链接输入到chrome并注册为测试人员。然后我下载并安装了我的应用程序。在我的应用程序中,我询问了可用的应用程序产品,并显示了我上面创建的设置。我选择了一个购买并完成了以下购买流程。 1.屏幕显示要购买和价格的产品,并要求按下去,我做 2.屏幕显示的支付方式,我选择赎回代码 3.屏幕显示兑换代码,我进入我的设置了促销代码之一开发者控制台前面(上面没有提到的 - 对不起),按赎回 4.屏幕显示产品,这一次与价格划掉,并提供选项,添加我选择的项目(很奇怪的被要求再次加买哎浩) 5.屏幕显示项目添加 6.几秒钟后屏幕显示错误,你已经拥有这个项目。

这怎么这用户以前没10分钟前存在并且如上所述已经仅用这个程序一次。

我已经看到堆栈溢出和其他地方类似这样的许多问题,并尝试了一切,清除谷歌播放商店缓存,清除谷歌播放商店数据等。上述这个序列是我最近尝试一个完全干净的用户完全干净的手机。

我可以上传使用我的应用程序代码,但忽略了一点,这是怎么能这样Gmail帐户已经拥有一个项目时,该Gmail帐户中从未从任何人之前购买任何东西。当然这是一个错误。

所有线索非常欢迎如何进行。代码现在又增加了,注意,这是一种混合型的Android应用程序,与在javascript/HTML的用户购买决策代码及以下

private void processCommand(JSONObject commandJSON) throws JSONException 
    { 
    String command = commandJSON.getString("method"); 
    if ("GetInAppProducts".equals(command)) 
     { 
     Log.d(TAG, "Querying Inventory"); 
     InAppPurchaseSkuString = null ; // clear the purchased sku. Note this is tested in mConsumeFinishedListener 
     mHelper.queryInventoryAsync(true, itemSkus, new IabHelper.QueryInventoryFinishedListener() 
      { 
      @Override 
      public void onQueryInventoryFinished(IabResult iabResult, Inventory inventory) 
       { 
       InventoryRecord = inventory ; 
       if (iabResult.isFailure()) 
        { 
        Log.d(TAG, "Query inventory failed"); 
        SendEndItemsToApp(); 
        } 
       else 
        { 
        Log.d(TAG, "Query inventory was successful."); 
        InventoryCheckCount = 0 ; // seems that we cannot just fire off a whole lot of these checks at the same time, so do them in sequence 
        if (itemSkus.size()>0) { CheckForOwnedItems(); } else { SendEndItemsToApp(); } 
        } 
       } 
      }); 

     } 
    else if ("BuyInAppProduct".equals(command)) 
     { 
     JSONArray params = commandJSON.getJSONArray("parameters"); 
     InAppPurchaseSkuString = params.getString(0); 
     Log.d(TAG, "User decision to purchase " + InAppPurchaseSkuString); 
     mHelper.launchPurchaseFlow(MainActivity.this, InAppPurchaseSkuString, InAppPurchaseActivityCode, mPurchaseFinishedListener, "mypurchasetoken"); // consider putting the user email address in the last field - need to get from app 
     }; 
    }//end of ProcessCommand 


public void CheckForOwnedItems() 
    { 
    Log.d(TAG, "Pre Purchase Inventory Processing Started"); 
    String sku = itemSkus.get(InventoryCheckCount); 
    if (InventoryRecord.getSkuDetails(sku) != null) 
     { 
     if (InventoryRecord.hasPurchase(sku)) 
      { 
      consumeItem(); 
      } 
     else 
      { 
      SendItemToApp(); 
      InventoryCheckCount++; 
      if (InventoryCheckCount < itemSkus.size()) { CheckForOwnedItems(); } else { SendEndItemsToApp(); } 
      }; 
     }; 
    }//end of CheckForOwnedItems 

public void SendItemToApp() 
    { 
    String sku = itemSkus.get(InventoryCheckCount); 
    String priceString = InventoryRecord.getSkuDetails(sku).getPrice().replaceAll("[^\\d.]+", ""); // RegExp removes all characters except digits and periods 
    String infoString = "InAppProductDetails('" + sku + "','" + "dummy" + "','" + priceString + "');"; // dummy is a placeholder for product description which is not (yet?) used in the app 
    Log.d(TAG, infoString); 
    mWebView.evaluateJavascript (infoString, new ValueCallback<String>() 
      { 
      @Override 
      public void onReceiveValue(String s) 
       { 
       //Log.d(TAG,"Returned from InAppProductDetails:"); 
       } 
      } 
     ); 
    } 

public void SendEndItemsToApp() 
    { 
    String endString = "InAppProductsEnd();"; // name is a placeholder for now 
    Log.d(TAG, endString); 
    mWebView.evaluateJavascript(endString, new ValueCallback<String>() 
      { 
      @Override 
      public void onReceiveValue(String s) 
       { 
       //Log.d(TAG,"Returned from InAppProductsEnd:"); 
       } 
      } 
     ); 
    } 

public void consumeItem() 
    { 
    Log.d(TAG,"Pre Purchase Inventory Query Started"); 
    String sku = itemSkus.get(InventoryCheckCount); 
    mHelper.consumeAsync(InventoryRecord.getPurchase(sku), mConsumeFinishedListener); 
    } 

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() 
    { 
    public void onConsumeFinished (Purchase purchase, IabResult result) 
     { 
     if (result.isSuccess()) 
      { 
      Log.d(TAG, "Pre Purchase Consume Item Completed"); 
      SendItemToApp(); 
      InventoryCheckCount++; 
      if (InventoryCheckCount < itemSkus.size()) { CheckForOwnedItems(); } else { SendEndItemsToApp(); } 

      } 
     else 
      { 
      Log.d(TAG,"Pre Purchase Consume Item Failed"); 
      } 
     } 
    }; 

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() 
    { 
    public void onIabPurchaseFinished (IabResult result, Purchase purchase) 
     { 
     if (result.isFailure()) 
      { 
      Log.d(TAG,"Purchase Scenario Failed"); 
      } 
     else if (purchase.getSku().equals(InAppPurchaseSkuString)) 
      { 
      Log.d(TAG,"Purchase Scenario Completed"); 
      String evalString = "InAppProductPurchased('" + InAppPurchaseSkuString + "');"; 
      Log.d(TAG, evalString); 
      mWebView.evaluateJavascript (evalString, new ValueCallback<String>() 
         { 
         @Override 
         public void onReceiveValue(String s) 
          { 
          Log.d(TAG, "Returned from InAppProductPurchased:"); 
          } 
         } 
       ); 
      } 
     } 
    }; 
+0

代码会很好。使用Android 5+,您无需重置手机,只需添加用户即可。 –

+0

你有没有找到解决办法? –

+0

是的,请参阅下面的答案 – user2539341

回答

0

中应用程序的行为在包装代码,我发现,使用时不会发生此错误贝宝(即真钱)进行购买,所以我相信这个“​​错误,你已经拥有这个项目”的消息在某种程度上与使用促销代码进行测试有关。并且(到目前为止)我的PayPal账户没有被收费(因为我是应用程序的resgistered测试人员)。

相关问题