在应用结算错误中:项已经拥有(BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED)

时间:2014-03-25 14:21:23

标签: android in-app-purchase in-app-billing

我正在开发支持应用购买的Android产品,并且有大量用户在购买应用,在所有用户中,有些用户面临“BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED”错误,并且返回的响应为7。 我在每次购买后都会拨打消费电话,并在应用程序启动时设置InApp时验证我的库存,并检查任何拥有的项目并调用消费。 任何建议都可以解决问题。

2 个答案:

答案 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)

我遇到了同样的问题,任何机构都有解决方案吗? 唯一的方法是更改​​测试帐户。