首页 > 解决方案 > 为什么 onPurchasesUpdated() 的实现会导致 ITEM_ALREADY_OWNED 和一个空的购买列表?

问题描述

我目前正在为可消耗的虚拟硬币实施应用内购买。

我正在使用内部测试轨道并且我的测试帐户已连接。

启动计费流程由一个按钮启动。

但是有几个问题。

采购清单为空,我认为这不正常。

@Override
    public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {


        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) {

            for (Purchase purchase : purchases) {
                handlePurchase(purchase);
            }

        } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {

        } else {

        }

if 语句将不会运行。

如果我尝试通过将此代码段传递给 onPurchasesUpdated() 中的 else 语句来强制测试 handlePurchases() 的功能,则会导致空对象引用错误,因为它试图遍历空列表。

for (Purchase purchase : purchases) {
                handlePurchase(purchase);
            }

BillingResult 代码返回:ITEM_ALREADY_OWNED

为了解决这个问题,我尝试调用 consumeAsync(),如下面的代码所示。

    public void handlePurchase(Purchase purchase) {
        if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
            // Grant entitlement to the user.

            ConsumeParams consumeParams =
                    ConsumeParams.newBuilder()
                            .setPurchaseToken(purchase.getPurchaseToken())
                            .build();

            client.consumeAsync(consumeParams, consumeResponseListener);


        }
    }

此外,我还退还了 Play 管理中心订单管理中的所有现有订单。

我的问题是为什么 ITEM_ALREADY_OWNED 错误仍然存​​在,为什么采购清单是空的。

标签: androidin-app-billing

解决方案


推荐阅读