2016-08-18 126 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測試人員)。

相關問題