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

应用内购买似乎被多次调用

翟黎明
2023-03-14

根据谷歌的教程,我用播放计费库1.0实现了应用内购买。我只有一个购买项目,当它解锁时,我会显示一条长度为吐司的吐司消息。LENGTH_SHORT。然而,吐司会在那里停留10秒钟,所以我假设它会被多次调用。它不会发生,当我通过queryPurchase解锁它(如果有人购买它更早,并在此期间重新安装应用程序)。

有人知道为什么祝酒会持续这么久/为什么会被多次叫来吗?

在我的BillingManager课程中:

@Override
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {
    if (responseCode == BillingClient.BillingResponse.OK) {
        for (Purchase purchase : purchases) {
            handlePurchases(purchase);
        }
        mBillingUpdatesListener.onPurchasesUpdated(mPurchases);
    } else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {

    } else {

    }
}

public void handlePurchases(Purchase purchase) {
    //here could be validation on own server

    mPurchases.add(purchase);
}

主要活动实现BillingUpdatesListener:

@Override
public void onPurchasesUpdated(List<Purchase> purchases) {
    for (Purchase purchase : purchases) {
        switch (purchase.getSku()) {
            case "premium":
                unlockPremium();
                break;
        }
    }
}

public void unlockPremium() {
    mPremiumUnlocked = true;
    savePremiumUnlocked();
    Toast.makeText(this, getResources().getString(R.string.premium_congrats), Toast.LENGTH_SHORT).show();
    mAdView.setVisibility(GONE);
}

共有3个答案

微生季
2023-03-14

伟大的答案和看起来很深@库夫斯!

谷歌将很快修复多个电话:https://issuetracker.google.com/issues/66054158

然而,即使onPurchasesUpdate被多次触发,您与计费流的集成也应该有效,因为它无论如何都可能发生。例如,如果有人使用相同的@gmail帐户在另一台设备上并行购买。一些国家(如西班牙)的人确实经常与许多朋友和家人分享他们的@gmail账户。

请检查v2的实现,了解如何优雅地处理这种情况。

锺离烈
2023-03-14

我不知道这是否适用于你的确切场景,但我们正在经历同样的事情,这是谷歌端的一个错误。

有关更多信息,请参阅https://issuetracker.google.com/issues/66054158。

编辑:我刚刚看到@goRGon发布了同样的事情:)

西班牙多人的例子与上述情况不同。在西班牙的情况下,用户实际上购买了两份IAP,因此它们是两份单独的收据,用户应该得到两份他们购买的任何东西的奖励。在bug场景中,一张收据会呈现给用户两次,这样就可以捕捉到重复的收据。但无论如何,后端验证系统都需要适应可能导致同一收据连续发送两次的代码中的黑客/漏洞。

吕森
2023-03-14

如果我理解正确,你说当你第一次购买应用内产品时,你会得到多次祝酒?

在计费库的当前版本(1.0)中,发生这种情况是因为系统正在进行多次广播。

例如,如果查看或中断BillingClientImpl中第120行的PurchaseFinishedReceiver。java在库中,购买后至少会调用两次。这两次都附带了应用内购买数据,但我注意到每次广播的意图操作都不同。

在第一次广播中,动作是com.Android出售。演员表采购更新了,但在第二次更新中,它是代理(proxy)活动(response)(response)意图(action)。库不会过滤掉动作值,因此所有这些广播都会导致调用您的purchasesUpdatedListener

我没有进一步调查,但我认为我们可以从中得到的是,发生了某种变化,人们认为有必要传播这种变化。

为了避免多次敬酒,除非您的高级功能已解锁,否则不要显示敬酒。i、 e.如果已经解锁,只需忽略更改通知即可。

顺便说一下,在Android Studio中调试购买流程是完全可以的。只需用您的发布密钥签署您的调试apk,并确保apk版本不高于Play Store中的版本。

buildTypes {

    debug {
        minifyEnabled false
        debuggable true
        signingConfig signingConfigs.release
    }


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

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

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

  • 问题内容: 我的活动课在这里: 和相机预览类在这里: 但是,当我测试该类时,似乎首先调用onResume(),然后在1或2秒后再次调用。因此,相机必须再次刷新。如果我根本没有onResume(),则摄像头预览稳定,但是如果我从主屏幕或其他某个应用再次切换到该应用,则会崩溃。我发现onPause()不会影响任何一个。我的代码正确吗?我应该添加/删除哪些内容以使其不会再次刷新并且在应用切换后仍然不会崩

  • 我试图回到IabHelper。OnIabPurchaseFinishedListener当购买结束时,我的订阅,但问题是它没有调用购买完成。 我已经尝试了onactive结果,但仍然不能在这里工作是我的代码块,我正在扩展下面的片段 我提到了这个链接

  • 问题内容: 如果我在节点中编写以下程序: 然后在服务器上单击两次,在服务器上看到两次- 我不确定为什么单个HTTP请求导致两次执行。 问题答案: 那是正常现象-您的浏览器拨打了多个电话。 例如,大多数浏览器都会呼叫来获取。 尝试记录网址: 然后您会看到正在调用的内容。