响应码项目已购买,但购买清单为空

Sur*_*ary 7 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();
    }
Run Code Online (Sandbox Code Playgroud)

第一个问题,当我已经购买了商品后,为什么在这里开票响应是可以的。我不想将按钮文字设置为价格,购买产品后此响应会设置该价格。

这是我的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
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个问题,在这里我得到的答复是我的物品已经购买,但清单仍然为空。如何正确实施?

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

我正在遵循此代码进行应用内实施。 https://github.com/patpatchpatrick/Streakr/

小智 0

我发现您的 onPurchasesUpdated 中有一个错误,条件设置错误。
它应该是这样的,

if(BillingResponse.OK && purchases != null) {
// update records
} else if(BillingResponse.ITEM_NOT_OWNED){ //this condition was missing
// update records if required or ask to buy
} else if(BillingResponse.ITEM_ALREADY_OWNED ){ // update records} 
Run Code Online (Sandbox Code Playgroud)

我还建议为此更新数据库。