当前位置: 首页 > 知识库问答 >
问题:

成功购买时Android应用内购买失败

丁宏盛
2023-03-14

我正在开发一个应用内购买。我已将该应用程序放在 Play 商店进行封闭测试。在帐户设置中使用测试人员电子邮件和添加的测试人员电子邮件。我在 Play 商店中有 2 个托管产品。我在调试模式下测试了 android.test.purchased 并且工作正常。但是在我购买 SKU 时从 Play 商店安装的发布版本中,它成功完成了购买,但由于某种原因我收到了失败响应。我试图弄清楚这一点。此外,我在购买后正在消费这些物品,因此它再次可用。这是我的代码

 mHelper = new IabHelper(this, Constants.BASE64_ENCODED_PUBLIC_KEY);

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        public void onIabSetupFinished(IabResult result) {
            if (!result.isSuccess()) {
                Log.d(TAG, "In-app Billing setup failed due to: " +
                        result.getMessage());
            } else {
                //do further steps here.
                Log.d(TAG, "In-app Billing is set up OK");
            }
        }
    });

然后点击按钮

mHelper.launchPurchaseFlow(PurchaseActivity.this, ITEM_SKU, 10001,
                                mPurchaseFinishedListener, "mypurchasetoken");
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            if (result.isFailure()) {
                Toast.makeText(PurchaseActivity.this, "mPurchaseFinishedListener: " + result.getMessage(), Toast.LENGTH_SHORT).show();
                if (result.getResponse() == 7) {
                    consumeItem();
                } else {
                    dismissProgressDialog();
                    Log.d(TAG, "onIabPurchaseFinishedWithError: " + result.getMessage());
                    AlertHelper.errorAlert(PurchaseActivity.this,
                            getString(R.string.purchase_unsuccessful_text), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    dialogInterface.dismiss();
                                }
                            });

                }
            } else if (purchase.getSku().equals(ITEM_SKU)) {
                Log.d(TAG, "onIabPurchaseFinishedWithSuccess: ");
                consumeItem();
            }

        }
    };

public void consumeItem() {
   /* if (isTest) {
        try {
            int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:" + getPackageName() + ":android.test.purchased");
            if (response == 0) {
                //Save purchase status to shared pref.
                updateUserAccount(ITEM_SKU);

                //Sign up user to our server.
                signUpUserToServer("android.test.purchased:9090");
                Log.d(TAG, "onConsumeFinishedSuccessfully");
            } else {
                Log.d(TAG, "onConsumeFinishedWithError: " + response);
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    } else*/
    mHelper.queryInventoryAsync(mReceivedInventoryListener);
}
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
                                         Inventory inventory) {

        if (result.isFailure()) {
            dismissProgressDialog();
            Log.d(TAG, "onQueryInventoryFinishedWithError: " + result.getMessage());
            Toast.makeText(PurchaseActivity.this, "mReceivedInventoryListener: " + result.getMessage(), Toast.LENGTH_SHORT)
                    .show();
        } else {
            Log.d(TAG, "onQueryInventoryFinished. asyncConsume fired. ");
            mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                    mConsumeFinishedListener);
        }
    }
};

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
    public void onConsumeFinished(Purchase purchase, IabResult result) {

        if (result.isSuccess()) {
            if (isAlreadyOwned) {
                isAlreadyOwned = false;
                processPurchaseClick();
            } else {
                //Save purchase status to shared pref.
                updateUserAccount(ITEM_SKU);

                //Sign up user to our server.
                signUpUserToServer(purchase.getToken());
                Log.d(TAG, "onConsumeFinishedSuccessfully");
            }
        } else {
            Toast.makeText(PurchaseActivity.this, "onConsumeFinishedWithError: " + result.getMessage(), Toast.LENGTH_SHORT)
                    .show();
            Log.d(TAG, "onConsumeFinishedWithError: " + result.getMessage());
        }
    }
};

从我的测试帐户成功购买后,我会得到失败结果和R字符串。onPurchasefinishedListener中的purchase_successful_文本。帮帮我

共有1个答案

公良弘毅
2023-03-14

伙计们,我想通了,所以我把答案贴出来,这样可能会对某人有所帮助。我的Base64公钥是另一个应用程序的。我把正确的钥匙放在那里,它起作用了。这个答案帮助了我。

 类似资料:
  • 准备工作 付费应用协议 如果你还没有,你需要在 iTunes Connect 签署付费应用协议, 并设置您的银行和税务信息。 iTunes Connect 开发人员帮助: 协议、税务和银行概述 创建您的应用内购买 然后,您需要在iTunes Connect中配置您的应用内购买,并包含名称,定价和说明等详细信息,以突出显示您的应用内购买的功能。 iTunes Connect开发人员帮助:创建应用程序

  • 这个问题(Android应用内计费动态产品列表)是3年前问过的。动态的应用内购买项目在Android上还是不可用的吗? 我之所以要实现这种功能,是因为我的应用程序提供了一种让某些用户创建自己的应用内购买的方式,供其他人购买。

  • 域名 服务器 注册域名 runkoa 购买阿里云 购买3毛4分一小时的阿里云,用来学习linux服务器部署 购买原则 如果是短时间学习按需合算,如果长时间是包月合算,另外如果有虚拟机用虚拟机 设置自动释放,不用的时候自动销毁,提前做好计划,我要玩啥,计划个时间,学不会就自动释放,强迫自己快速学习 如果是大规模测试,其实这种按需的还是有他的优势的,测试并发,高可用非常好的 注册阿里云账户并登陆 ht

  • 我在google play store中有一个应用程序,在添加计费3V以处理订阅时遇到了一些问题。任何新的订阅者在付款和付款完成并出现在谷歌控制台后都无法访问我的应用程序。 我希望能在我的应用程序中帮助我处理应用程序内购买,代码如下: public static void isUserHasSubscription(Context Context,onCheck onCheck){BillingC

  • 本文向大家介绍比较资产购买和股票购买。,包括了比较资产购买和股票购买。的使用技巧和注意事项,需要的朋友参考一下 资产购买和股票购买之间的主要区别如下- 资产购买 购买股票 所有权可以转让。 无法申请税收优惠。 更复杂。 无法重新协商员工协议。 买方承担风险和责任。 所有权可能会丢失,交手。 在市场上更普遍。 不需要退还资产。 少数股东会制造问题。

  • 问题内容: 是否可以在内实施应用内购买?如果是这样,怎么办?我正在尝试将“购买”按钮用作运气不好的按钮。我不确定代码是否需要放入或视图控制器中。我看过大量的教程,但它们似乎都针对单视图应用程序,而不是SpriteKit。 问题答案: 首先,将其放入游戏场景行中,并确保已导入框架“ StoreKit” 接下来,您想将这些行放到didmovetoview中。请记住,在“对象:”之后,您输入的字符串应该