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/