我正在开发支持应用购买的Android产品,并且有大量用户在购买应用,在所有用户中,有些用户面临“BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED”错误,并且返回的响应为7。 我在每次购买后都会拨打消费电话,并在应用程序启动时设置InApp时验证我的库存,并检查任何拥有的项目并调用消费。 任何建议都可以解决问题。
答案 0 :(得分:1)
见here。谷歌表示你必须使用托管的inapp项目。如果您不这样做,则用户无法再购买另一个。购买成功后,请使用:
int response = mService.consumePurchase(3, getPackageName(), token);
您从purchaseData JSON对象获取令牌:
final String token = jo.getString("purchaseToken");
但是如果你出于某些原因没有消费购买,你就会陷入困境。
我遇到了同样的问题,因为我升级到了iap api v3而在v2中这不是问题。
如果出现此错误,请尝试使用给定productId的所有购买。或者只是消费在设置服务期间购买的所有东西。请注意,您可能希望在consumePurchase()成功返回后实际配置购买,具体取决于应用程序的语义。
连接服务后(在onServiceConnected()中)调用以下代码,当然在后台执行:
String continuationToken="";
boolean hasMorePurchases=false;
do {
try {
Bundle purchases = mService.getPurchases(3, activity.getPackageName(), "inapp", continuationToken);
int response = purchases.getInt("RESPONSE_CODE");
if (response == 0) {
continuationToken = purchases.getString("INAPP_CONTINUATION_TOKEN");
if(!TextUtils.isEmpty(continuationToken)) hasMorePurchases=true;
final ArrayList<String> purchaseDataList = purchases.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
for(String purchaseJSON : purchaseDataList) {
JSONObject object = new JSONObject(purchaseJSON);
String productId = object.getString("productId");
String orderId = object.getString("orderId");
String purchaseToken = object.getString("purchaseToken");
Log.i(getClass().getSimpleName(),"consuming purchase of " + productId + ", orderId " + orderId);
mService.consumePurchase(3, activity.getPackageName(), purchaseToken);
}
} else {
Log.e(getClass().getSimpleName(), "could not get purchases: " + response);
}
} catch (RemoteException e) {
Log.e(getClass().getSimpleName(), "RemoteException during getPurchases:", e);
} catch (JSONException e) {
Log.e(getClass().getSimpleName(), "JSONException during getSkuDetails:", e);
}
} while(hasMorePurchases);
请注意,每次调用getPurchases都会返回最多700次购买,因此您需要使用延续令牌来获取更多内容。
如果您收到ALREADY_OWNED错误代码且仅涉及所涉及的productId,您当然可以使用此代码。然后,尝试再次开始购买。
答案 1 :(得分:0)
我遇到了同样的问题,任何机构都有解决方案吗? 唯一的方法是更改测试帐户。