8 votes

Code de réponse L'article a déjà été acheté mais la liste d'achat est nulle.

J'implémente l'IAP dans mon application. L'un sert à supprimer la publicité et l'autre à ajouter des énigmes supplémentaires. Je testais cela sur mon appareil mais j'ai rencontré un problème. Après avoir acheté un article, je reçois le code de réponse "Article déjà possédé" mais il n'apparaît pas dans la liste des achats.

Je configure mon client de facturation de la manière suivante,

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();
    }

Première question : pourquoi la réponse de la facturation est-elle acceptable ici alors que j'ai déjà acheté l'article ? Je ne veux pas définir le texte du bouton comme étant le prix, qui est défini dans cette réponse après l'achat du produit.

C'est ma mise en œuvre de l'achat,

@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
    }
}

Deuxième question : je reçois une réponse indiquant que mon article a déjà été acheté, mais la liste reste vide. Comment l'implémenter correctement ?

Si quelqu'un a déjà acheté un produit, le bouton doit être désactivé. Un autre doute est que pendant le test, je dois attendre 1 à 2 heures pour me faire rembourser l'article par Playstore et tester à nouveau ou y a-t-il une autre méthode ?

Je suis ce code pour l'implémentation in-app. https://github.com/patpatchpatrick/Streakr/

1voto

Vanshaj Daga Points 1509

Il n'y a qu'une chose à souligner ici, c'est que vous interrogez uniquement les articles INAPP de type SKU et non les SUBS. Je pense que le type de produit que vous fournissez relève des abonnements et non des produits in-app qui sont utilisés pour être consommés. C'est pourquoi votre requête est vide.

0voto

Viraj S Points 378

J'ai trouvé une erreur dans votre onPurchasesUpdated, les conditions sont mal définies.
Ça devrait être quelque chose comme ça,

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} 

et je suggère également de mettre à jour la base de données pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X