我有一個新的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:");
}
}
);
}
}
};
代碼會很好。使用Android 5+,您無需重置手機,只需添加用戶即可。 –
你有沒有找到解決辦法? –
是的,請參閱下面的答案 – user2539341