Avertissement : AIDL est désormais obsolète et sera supprimé dans une prochaine version. Pour implémenter des fonctionnalités liées à la facturation, utilisez la bibliothèque Google Play Billing.
Vous pouvez utiliser une interface Android Interface Definition Language (AIDL) pour implémenter certaines fonctionnalités du système de facturation de Google Play.
Acheter des produits

Figure 1. Séquence de base d'une demande d'achat
Voici un parcours d'achat type avec l'API AIDL Google Play Billing :
- Votre application envoie une requête
isBillingSupported
à Google Play pour déterminer si la version cible de l'API AIDL Google Play Billing que vous utilisez est compatible. Cette requête vérifie également que Google Play est compatible avec la facturation dans le pays de l'utilisateur. - Lorsque l'application démarre ou que l'utilisateur se connecte, il est recommandé de vérifier auprès de Google Play quels articles appartiennent à l'utilisateur. Pour interroger les achats de l'utilisateur, envoyez une requête
getPurchases
. Si la requête aboutit, Google Play renvoie unBundle
contenant une liste des ID produit correspondant aux articles achetés, une liste des détails de chaque achat, ainsi qu'une liste des signatures pour les achats. - En règle générale, vous devez informer l'utilisateur des produits disponibles à l'achat. Pour interroger les détails des produits intégrés que vous avez définis dans Google Play, votre application peut envoyer une requête
getSkuDetails
. Vous devez spécifier une liste des ID produit dans la requête. Si la requête aboutit, Google Play renvoie unBundle
contenant des informations détaillées sur le produit, y compris son prix, son titre, sa description et son type d'achat. - Si un produit intégré n'appartient pas à l'utilisateur, vous pouvez lancer un achat. Pour lancer une demande d'achat, votre application envoie une requête
getBuyIntent
, en spécifiant l'ID produit de l'article à acheter, ainsi que d'autres paramètres. Vous devez enregistrer l'ID produit lorsque vous créez un produit intégré dans la Google Play Console.- Google Play renvoie un objet
Bundle
contenant un élémentPendingIntent
que votre application utilise pour lancer l'interface de règlement spécifique à l'achat. - Votre application lance l'intent en attente en appelant la méthode
startIntentSenderForResult
. - Une fois le processus de règlement terminé (lorsque l'utilisateur a acheté l'article ou annulé l'achat), Google Play envoie une réponse
Intent
à la méthodeonActivityResult
. Le code de résultat d'onActivityResult
contient un code de résultat qui indique si l'achat a bien été effectué ou s'il a été annulé. La réponseIntent
contient des informations sur l'article acheté, y compris une chaînepurchaseToken
générée par Google Play pour identifier de manière unique cette transaction d'achat. L'Intent
contient également la signature de l'achat, signée avec votre clé de développeur privée.
- Google Play renvoie un objet
Pour en savoir plus sur les appels d'API et le serveur de réponse AIDL pour la facturation Google Play, consultez la documentation de référence de l'API AIDL Google Play Billing.
Consommer les produits intégrés
Vous pouvez utiliser le mécanisme de consommation pour suivre les produits gérés qui appartiennent à l'utilisateur.
Tous les produits gérés relèvent de l'API AIDL Google Play Billing. Autrement dit, la propriété de tous les achats de produits gérés est traitée par Google Play. Votre application peut interroger les informations d'achat de l'utilisateur si nécessaire. Lorsque l'utilisateur achète un produit géré, cet achat est enregistré dans Google Play. Lorsqu'un produit géré est acheté, il est considéré comme ayant un propriétaire. Il ne peut donc plus être acheté sur Google Play. Vous devez envoyer une demande de consommation du produit géré qui appartient à son utilisateur avant que Google Play n'en permette de nouveau la vente. Si vous consommez le produit géré, il revient à l'état "Sans propriétaire", et les données d'achat précédentes sont supprimées.

Figure 2. Séquence de base d'une requête de consommation
Pour récupérer la liste des produits appartenant à l'utilisateur, votre application envoie un appel getPurchases
à Google Play. Votre application peut envoyer une requête de consommation via un appel consumePurchase
. Dans l'argument de requête, vous devez spécifier la chaîne purchaseToken
unique du produit géré. Cette chaîne vous a été fournie par Google Play lors de l'achat. Google Play renvoie un code d'état indiquant si la consommation a bien été enregistrée.
Produits gérés non consommables et consommables
C'est à vous de décider si vous souhaitez traiter vos produits gérés comme des produits consommables ou non.
- Produits non consommables
- En règle générale, vous n'implémentez pas la consommation de produits gérés qui ne peuvent être achetés qu'une seule fois dans votre application et offrent un avantage permanent. Une fois achetés, ces produits sont associés en permanence au compte Google de l'utilisateur. Une mise à niveau premium ou un pack de niveaux sont des exemples de produits gérés non consommables.
- Produits consommables
- En revanche, vous pouvez mettre en œuvre la consommation des produits qui peuvent être achetés plusieurs fois. En général, ces produits entraînent certains effets temporaires. Par exemple, le personnage de jeu de l'utilisateur peut gagner des points de vie ou gagner des pièces d'or supplémentaires dans son inventaire. La distribution des avantages ou des effets du produit acheté dans votre application est appelée provisionnement du produit géré. Vous êtes responsable du contrôle et du suivi du provisionnement des produits gérés auprès de l'utilisateur.
Important : Avant de provisionner le produit géré consommable dans votre application, vous devez envoyer une requête de consommation à Google Play et recevoir une réponse indiquant que la consommation a été enregistrée.
Gérer les achats de consommables dans votre application
Voici le parcours de base concernant l'achat d'un produit géré consommable :
- Appelez la méthode
getBuyIntent
pour lancer un parcours d'achat. - Examinez le
Bundle
renvoyé par Google Play pour déterminer si l'achat a abouti. - Si l'achat a abouti, appelez la méthode
consumePurchase
afin de consommer cet achat. - Inspectez le code de réponse de Google Play pour déterminer si la consommation a bien été effectuée.
- Si la consommation a eu lieu, provisionnez le produit dans votre application.
Par la suite, lorsque l'utilisateur démarrera ou se connectera à votre application, vous devrez vérifier s'il possède des produits intégrés consommables en suspens. Si oui, veillez à les consommer et à les provisionner. Voici le parcours de démarrage recommandé si vous mettez en œuvre des produits intégrés consommables dans votre application :
- Envoyez une requête
getPurchases
pour interroger les produits intégrés qui appartiennent à l'utilisateur. - S'il existe des produits consommables intégrés, appelez
consumePurchase
pour les consommer. Cette étape est nécessaire, car l'application a peut-être finalisé le bon de commande pour le produit consommable, mais a pu s'arrêter ou se déconnecter avant qu'elle n'ait eu le temps d'envoyer une requête de consommation. - Inspectez le code de réponse de Google Play pour déterminer si la consommation a bien été effectuée.
- Si la consommation a eu lieu, provisionnez le produit dans votre application.
Configurer les achats avec récompense
Avertissement : Les récompenses ne sont plus prises en charge. Pour en savoir plus, consultez la section Créer un produit avec récompense.
Lorsque vous utilisez des produits avec récompense à l'aide d'AIDL, vous devez mettre en cache l'"intent" d'achat avant qu'un utilisateur ne doive collecter la récompense. Vous pouvez appeler cet intent au niveau d'un thread d'arrière-plan et enregistrer l'intent de réponse positive jusqu'à ce que l'utilisateur prenne les mesures nécessaires pour collecter la récompense.
Répertorier et charger les SKU
Avant de proposer un produit avec récompense à un utilisateur, appelez getSkuDetails()
pour obtenir des informations détaillées sur le produit. Un nouveau champ JSON, "rewardToken", est renseigné pour chaque produit avec récompense dans la liste des SKU.
getBuyIntentExtraParams()
au niveau d'un thread d'arrière-plan. Après avoir reçu une réponse de BILLING_RESPONSE_RESULT_OK
, activez le produit avec récompense pour l'utilisateur et enregistrez l'objet PendingIntent
renvoyé pour une utilisation ultérieure.
L'extrait de code suivant illustre le processus de chargement de l'annonce associée à un produit avec récompense :
Kotlin
val rewardToken = skuDetailsJson.optString("rewardToken") val extraParams = Bundle().putString("rewardToken", rewardToken) // This call blocks the current thread, so do this in the background. val buyIntentBundle : Bundle = mService.getBuyIntentExtraParams(9, packageName, sku, "inapp", "", extraParams) val response = buyIntentBundle.getInt("RESPONSE_CODE") if (response == BILLING_RESPONSE_RESULT_OK) { // Enable rewarded product. // Save this object for use later. val pendingIntentToSave = bundle.getParcelable(RESPONSE_BUY_INTENT) } else { // Don't offer rewarded product. }
Java
String rewardToken = skuDetailsJson.optString("rewardToken"); Bundle extraParams = new Bundle(); extraParams.putString("rewardToken", rewardToken); // This call blocks the current thread, so do this in the background. Bundle buyIntentBundle = mService.getBuyIntentExtraParams(9, getPackageName(), sku, "inapp", "", extraParams); int response = buyIntentBundle.getInt("RESPONSE_CODE"); if (response == BILLING_RESPONSE_RESULT_OK) { // Enable rewarded product. // Save this object for use later. PendingIntent pendingIntentToSave = bundle.getParcelable(RESPONSE_BUY_INTENT); } else { // Don't offer rewarded product. }
Déclarer des annonces adaptées à l'âge
Pour faciliter la mise en conformité avec les obligations légales relatives aux enfants et aux mineurs, y compris la loi COPPA (Children's Online Privacy Protection Act) et le Règlement général sur la protection des données (RGPD), votre application doit indiquer quelles annonces doivent être considérées comme étant destinées aux enfants aux États-Unis, et quelles annonces s'adressent aux utilisateurs n'ayant pas l'âge minimal requis applicable dans leur pays. Dans le centre d'aide AdMob, nous vous expliquons à quel moment baliser vos demandes d'annonces pour un traitement adapté aux contenus destinés aux enfants ou pour un traitement adapté aux utilisateurs n'ayant pas l'âge minimal requis, ainsi que les conséquences de cette action.
Pour indiquer qu'une requête avec récompense cible les enfants ou les utilisateurs n'ayant pas atteint l'âge minimal requis, incluez les paramètres supplémentaires childDirected
et underAgeOfConsent
, comme indiqué dans l'extrait de code suivant :
Kotlin
val rewardToken = skuDetailsJson.optString("rewardToken") val extraParams = Bundle().putString("rewardToken", rewardToken) .putInt("childDirected", ChildDirected.CHILD_DIRECTED) .putInt("underAgeOfConsent", UnderAgeOfConsent.UNDER_AGE_OF_CONSENT) // This call blocks the current thread, so do this in the background. val buyIntentBundle : Bundle = mService.getBuyIntentExtraParams(9, packageName, sku, "inapp", "", extraParams)
Java
Bundle extraParams = new Bundle(); extraParams.putString("rewardToken", rewardToken); extraParams.putInt("childDirected", ChildDirected.CHILD_DIRECTED); extraParams.putInt("underAgeOfConsent", UnderAgeOfConsent.UNDER_AGE_OF_CONSENT); // This call blocks the current thread, so do this in the background. Bundle buyIntentBundle = mService.getBuyIntentExtraParams( 9, getPackageName(), sku, "inapp", "", extraParams);
Diffuser des annonces avant de récompenser l'utilisateur
Une fois que l'utilisateur a cliqué sur le bouton pour commencer à regarder l'annonce, votre application peut utiliser l'objetPendingIntent
enregistré pour lancer la lecture des annonces. Pour ce faire, appelez startIntentSenderForResult()
:
Kotlin
startIntentSenderForResult( pendingIntentToSave, RC_BUY, Intent(), 0, 0, 0 )
Java
startIntentSenderForResult(pendingIntentToSave, RC_BUY, new Intent(), 0, 0, 0);
Ensuite, traitez les résultats du workflow de facturation dans onActivityResult()
, comme indiqué dans les extraits de code suivants. Lors du processus de lecture de l'annonce, Google Play utilise le même ensemble de codes de réponse du serveur que pour les autres flux de facturation.
Kotlin
fun onActivityResult(requestCode : Int, resultCode : Int, data : Intent) { if (requestCode == RC_BUY) { int responseCode = data.getIntExtra(RESPONSE_CODE) String purchaseData = data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA) String signature = data.getStringExtra(RESPONSE_INAPP_SIGNATURE) // Handle reward purchase. } }
Java
public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RC_BUY) { int responseCode = data.getIntExtra(RESPONSE_CODE); String purchaseData = data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA); String signature = data.getStringExtra(RESPONSE_INAPP_SIGNATURE); // Handle reward purchase. } }
Mise en cache locale
Étant donné que le client Google Play met désormais en cache les informations de facturation localement sur l'appareil, vous pouvez utiliser l'API AIDL Google Play Billing pour interroger ces informations plus fréquemment. Les appels d'API AIDL Google Play Billing suivants sont traités via des recherches dans le cache au lieu de nécessiter une connexion réseau, ce qui réduit considérablement le temps de réponse de l'API :
getBuyIntent
getPurchases
isBillingSupported