我有一个新的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