在App Purchase中似乎被多次调用

时间:2017-09-21 12:07:19

标签: android in-app-billing play-billing-library

我根据Google的教程,使用Play Billing Library 1.0实现了应用内购买。 我只有1件商品可以购买,当它解锁时,我会显示一个Toast.LENGTH_SHORT长度的Toast消息。然而,Toast在那里呆了10秒钟,所以我认为它被多次调用。当我通过queryPurchases(如果有人先前购买并在此期间重新安装应用程序)解锁时,它不会发生。

任何人都知道为什么Toast会停留这么久/为什么会多次调用它?

在我的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 个答案:

答案 0 :(得分:5)

如果我理解正确,您说当您第一次购买应用内商品时,您会收到多个Toast?

在Billing库的当前版本(1.0)中,这是因为系统正在进行多个广播。

例如,如果您在库中onPurchaseFinishedReceiver的第120行查看或断点BillingClientImpl.java,则在购买后至少调用两次。两次都附上了应用内购买数据,但我注意到每个广播的意图Action都不同。

在第一次广播中,行动是com.android.vending.billing.PURCHASES_UPDATED,但第二次是proxy_activity_response_intent_action。该库不会过滤掉Action值,因此所有这些广播都会导致您purchasesUpdatedListener被调用。

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

为避免多次敬酒,除非您的高级功能已解锁,否则请勿显示吐司。即如果它已经解锁,则只需忽略更改通知。

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

buildTypes {

    debug {
        minifyEnabled false
        debuggable true
        signingConfig signingConfigs.release
    }


    release {
        minifyEnabled false
        signingConfig signingConfigs.release
    }
}

答案 1 :(得分:2)

我不知道这是否适用于您的具体情况,但我们遇到了同样的事情,这是Google最终的错误。

有关详细信息,请参阅https://issuetracker.google.com/issues/66054158

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

西班牙多人的例子与上述情况不同。在西班牙方案中,用户实际上是购买IAP的两个副本,因此它们是两个单独的收据,并且用户应该获得两份他们购买的副本。在错误情形中,一次收据会向用户显示两次,因此实际上可以捕获重复的收据。但无论哪种方式,后端验证系统都需要在代码中容纳黑客/错误,这可能导致连续两次发送相同的收据。

答案 2 :(得分:1)

很好的答案,并深入了解@Kuffs!

Google很快会修复多个来电:https://issuetracker.google.com/issues/66054158

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

请检查TrivialDrive_v2实施,以了解如何优雅地处理此类情况。