android - 响应代码项目已购买但购买列表为空

标签 android in-app-purchase android-inapp-purchase

我正在我的应用中实现 IAP。一个用于删除广告,另一个用于添加更多谜题。我正在我的设备上进行测试,但遇到了一个问题。购买商品后,我收到响应代码“商品已拥有”,但它未显示在购买列表中。

我正在这样设置我的计费客户端,

private void setUpBillingClient(){
        mBillingClient = BillingClient.newBuilder(this).setListener(this).build();
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) {
                if (billingResponseCode == BillingClient.BillingResponse.OK) {
                    List skuList = new ArrayList<>();
                    skuList.add(ITEM_SKU_MORE_PUZZLE);
                    skuList.add(ITEM_SKU_REMOVE_AD);
                    SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
                    params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
                    mBillingClient.querySkuDetailsAsync(params.build(),
                            new SkuDetailsResponseListener() {
                                @Override
                                public void onSkuDetailsResponse(int responseCode, List skuDetailsList) {
                                    // Process the result.
                                    if (responseCode == BillingClient.BillingResponse.OK
                                            && skuDetailsList != null) {
                                        for (Object skuDetailsObject : skuDetailsList) {
                                            SkuDetails skuDetails = (SkuDetails) skuDetailsObject;
                                            String sku = skuDetails.getSku();
                                            String price = skuDetails.getPrice();
                                            if (ITEM_SKU_MORE_PUZZLE.equals(sku)) {
                                                btnMorePuzzle.setText(price);
                                            }
                                            else if(ITEM_SKU_REMOVE_AD.equals(sku)) {
                                                btnRemoveAd.setText(price);
                                            }
                                        }
                                    }
                                }
                            });
                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                //Toast.makeText(getApplicationContext(),  getResources().getString(R.string.billing_connection_failure), Toast.LENGTH_SHORT);
            }
        });

        queryPurchases();
        queryPrefPurchases();
    }

第一个问题,为什么我已经购买了商品,但这里的Billing response OK。我不想将按钮的文本设置为价格,这是在购买产品后从此响应设置的。

这是我的 Onpurchase 实现,

@Override
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {
    if (responseCode == BillingClient.BillingResponse.OK && purchases != null) {
        for (Purchase purchase : purchases) {
            if (purchase.getSku().equals(ITEM_SKU_REMOVE_AD)) {
                mSharedPreferences.edit().putBoolean("ad_free", true).commit();
                btnRemoveAd.setText("Done");
                btnRemoveAd.setEnabled(false);
            }
            else if(purchase.getSku().equals(ITEM_SKU_MORE_PUZZLE)){
                mSharedPreferences.edit().putBoolean("more_puzzle", true).commit();
                btnMorePuzzle.setText("Done");
                btnMorePuzzle.setEnabled(false);
            }
        }
    } else if (responseCode == BillingClient.BillingResponse.ITEM_ALREADY_OWNED ) {
        // I am getting response "Item already owned" here for item bought but purchase list here is empty 
        // so i can't do anything for  purchased item
    }
}

第二个问题,我收到的回复是我的商品已经购买,但列表仍然是空的。 如何正确实现?

如果有人已经购买了产品,则应禁用该按钮。 另一个疑问是在测试时我是否必须等待 1-2 小时才能从 Playstore 退还该项目以再次测试或是否有任何其他方法。

我正在按照此代码进行应用内实现。 https://github.com/patpatchpatrick/Streakr/

最佳答案

这里只有一件事需要指出,即您查询的只是 SKU 类型的 INAPP 商品,而不是 SUBS。我认为您提供的产品类型属于订阅,而不是用于消费的应用内产品。这就是您的查询为空的原因。

关于android - 响应代码项目已购买但购买列表为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57291740/

相关文章:

SortedArrayList 中的 Java.lang.AssertionError

iOS 内购免费/付费持久化

android - 使用 Google Play Billing,是否可以等到确认购买后再授予应用内购买的权利?

Android 应用内购买 - 无法从 onBillingSetupFinished() 事件调用按钮 setText()

android - MPAndroidChart - 为顶部和底部轴绘制不同的标签

java - 双 Pane 首选项屏幕的问题

android - Amazon IAP 不调用 onPurchaseResponse

iOS - 我们可以为非消耗品的应用内购买添加促销代码吗?

Android 应用内计费 queryInventoryAsync 返回 sku 和购买项目大小 0

java - 改造 - java.lang.IllegalStateException : Expected BEGIN_ARRAY but was BEGIN_OBJECT