您请求的应用内购买V3项目不可用

时间:2016-06-08 13:42:10

标签: android in-app-purchase

我知道这个问题在Stack-overflow中无处不在,这个问题有很多答案,但我无法解决。我已经尝试了很多答案,但仍然无法解决问题,我知道我在代码中的某个地方犯了一些愚蠢的错误,有人能帮我找到问题吗?

以下是针对应用内商品的我的屏幕截图: -

enter image description here

Manifest中声明的权限: -



<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.android.vending.BILLING" />
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
&#13;
&#13;
&#13;

将SKU定义为: -

public static final String SKU1 =&#34; gas&#34 ;; public static final String SKU2 =&#34; infinite_gas&#34 ;;

购买方法: -

public void launchPurchaseFlow(Activity act, String sku, String itemType,
        int requestCode, OnIabPurchaseFinishedListener listener,
        String extraData) {
    checkNotDisposed();
    checkSetupDone("launchPurchaseFlow");
    flagStartAsync("launchPurchaseFlow");
    IabResult result;

    if (itemType.equals(ITEM_TYPE_SUBS) && !mSubscriptionsSupported) {
        IabResult r = new IabResult(IABHELPER_SUBSCRIPTIONS_NOT_AVAILABLE,
                "Subscriptions are not available.");
        flagEndAsync();
        if (listener != null)
            listener.onIabPurchaseFinished(r, null);
        return;
    }
    try {
        logDebug("Constructing buy intent for " + sku + ", item type: "
                + itemType);
        Bundle buyIntentBundle = mService.getBuyIntent(3,
                mContext.getPackageName(), sku, itemType, extraData);
        int response = getResponseCodeFromBundle(buyIntentBundle);
        if (response != BILLING_RESPONSE_RESULT_OK) {
            logError("Unable to buy item, Error response: "
                    + getResponseDesc(response));
            flagEndAsync();
            result = new IabResult(response, "Unable to buy item");
            if (listener != null)
                listener.onIabPurchaseFinished(result, null);
            return;
        }

        PendingIntent pendingIntent = buyIntentBundle
                .getParcelable(RESPONSE_BUY_INTENT);
        logDebug("Launching buy intent for " + sku + ". Request code: "
                + requestCode);
        mRequestCode = requestCode;
        mPurchaseListener = listener;
        mPurchasingItemType = itemType;
        act.startIntentSenderForResult(pendingIntent.getIntentSender(),
                requestCode, new Intent(), Integer.valueOf(0),
                Integer.valueOf(0), Integer.valueOf(0));
    } catch (SendIntentException e) {
        logError("SendIntentException while launching purchase flow for sku "
                + sku);
        e.printStackTrace();
        flagEndAsync();

        result = new IabResult(IABHELPER_SEND_INTENT_FAILED,
                "Failed to send intent.");
        if (listener != null)
            listener.onIabPurchaseFinished(result, null);
    } catch (RemoteException e) {
        logError("RemoteException while launching purchase flow for sku "
                + sku);
        e.printStackTrace();
        flagEndAsync();

        result = new IabResult(IABHELPER_REMOTE_EXCEPTION,
                "Remote exception while starting purchase flow");
        if (listener != null)
            listener.onIabPurchaseFinished(result, null);
    }
}

绑定服务意图: -

Intent serviceIntent = new Intent(
                "com.android.vending.billing.InAppBillingService.BIND");
        serviceIntent.setPackage("com.android.vending");
        if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0)
                .isEmpty()) {
            // service available to handle that Intent
            mContext.bindService(serviceIntent, mServiceConn,
                    Context.BIND_AUTO_CREATE);

消费方法: -

void consume(Purchase itemInfo) throws IabException {
        checkNotDisposed();
        checkSetupDone("consume");

        if (!itemInfo.mItemType.equals(ITEM_TYPE_INAPP)) {
            throw new IabException(IABHELPER_INVALID_CONSUMPTION,
                    "Items of type '" + itemInfo.mItemType
                            + "' can't be consumed.");
        }

        try {
            String token = itemInfo.getToken();
            String sku = itemInfo.getSku();
            if (token == null || token.equals("")) {
                logError("Can't consume " + sku + ". No token.");
                throw new IabException(IABHELPER_MISSING_TOKEN,
                        "PurchaseInfo is missing token for sku: " + sku + " "
                                + itemInfo);
            }

            logDebug("Consuming sku: " + sku + ", token: " + token);
            int response = mService.consumePurchase(3,
                    mContext.getPackageName(), token);
            if (response == BILLING_RESPONSE_RESULT_OK) {
                logDebug("Successfully consumed sku: " + sku);
            } else {
                logDebug("Error consuming consuming sku " + sku + ". "
                        + getResponseDesc(response));
                throw new IabException(response, "Error consuming sku " + sku);
            }
        } catch (RemoteException e) {
            throw new IabException(IABHELPER_REMOTE_EXCEPTION,
                    "Remote exception while consuming. PurchaseInfo: "
                            + itemInfo, e);
        }
    }

购买时出错: -

enter image description here

注意: - Alpha测试阶段的应用程序已发布。 我是否需要从某个地方批准我的测试人员帐户?

以下是我的整个过程: -

  1. 上传已签名的apk,并将其发布给开发者 安慰。     我已将我的apk发布到alpha频道。     我已将产品ID列入开发者控制台。     我已激活我的产品ID并在开发者控制台上将其标记为活动。     我在开发者控制台中列出了测试帐户。     我安装了相同的apk,我上传到开发者控制台到我的deveice。     设备使用测试帐户而不是开发人员帐户登录。     我在我的应用程序中使用的ID与我根据logcat消息在控制台上列出的ID相同。
  2. 非常感谢任何帮助

    提前致谢。

1 个答案:

答案 0 :(得分:0)

是的,我解决了这个问题,我在最后也是非常重要的一步中失踪了: -

使用测试帐户打开选择加入的网址,然后点击&#34;成为测试人员&#34;