Analyser les abandons d'achat de produits dans Play Billing

1. Introduction

Dans cet atelier de programmation, vous allez vous concentrer sur la création d'un produit unique, l'intégration de votre application à la bibliothèque Play Billing (PBL) et l'analyse des raisons des abandons d'achat.

Audience

Cet atelier de programmation s'adresse aux développeurs d'applications Android qui utilisent la bibliothèque Play Billing (PBL) ou qui souhaitent l'utiliser pour monétiser leurs produits ponctuels.

Ce que vous allez apprendre...

  • Découvrez comment créer des produits ponctuels dans la Google Play Console.
  • Intégrer votre application à PBL
  • Découvrez comment traiter les achats de produits ponctuels consommables et non consommables dans la Bibliothèque Play Billing.
  • Comment analyser les abandons d'achat ?

Ce dont vous avez besoin...

2. Créer l'application exemple

L'application exemple est conçue pour être une application Android entièrement fonctionnelle, dont le code source complet présente les aspects suivants :

  • Intégrer l'application à PBL
  • Récupérer les produits ponctuels
  • Lancer les parcours d'achat pour les produits ponctuels
  • Scénarios d'achat qui entraînent les réponses de facturation suivantes :
    • BILLING_UNAVAILABLE
    • USER_CANCELLED
    • OK
    • ITEM_ALREADY_OWNED

La vidéo de démonstration suivante montre à quoi ressemblera l'application exemple et comment elle se comportera une fois déployée et exécutée.

Prérequis

Avant de créer et de déployer l'application exemple, procédez comme suit :

Build

L'objectif de cette étape de compilation est de générer un fichier Android App Bundle signé de l'application exemple.

Pour générer l'app bundle Android, procédez comme suit :

  1. Téléchargez l'application exemple depuis GitHub.
  2. Créez l'application exemple. Avant de créer l'application, modifiez le nom du package de l'application exemple, puis créez-la. Si vous avez des packages d'autres applications dans votre Play Console, assurez-vous que le nom de package que vous fournissez pour l'application exemple est unique.

    Remarque : La compilation de l'application exemple ne crée qu'un fichier APK que vous pouvez utiliser pour les tests locaux. Toutefois, l'exécution de l'application ne récupère pas les produits ni les prix, car les produits n'ont pas été configurés dans la Play Console. Vous le ferez plus loin dans cet atelier de programmation.
  3. Générez un Android App Bundle signé.
    1. Générer une clé d'importation et un keystore
    2. Signer votre application avec votre clé d'importation
    3. Configurer la signature d'application Play

L'étape suivante consiste à importer l'app bundle Android dans la Google Play Console.

3. Créer un produit ponctuel dans la Play Console

Pour créer des produits ponctuels dans la Google Play Console, vous devez disposer d'une application dans la Play Console. Créez une application dans la Play Console, puis importez l'app bundle signé que vous avez créé précédemment.

Créer une application

Pour créer une application :

  1. Connectez-vous à la Google Play Console à l'aide de votre compte de développeur.
  2. Cliquez sur Créer une application. La page Créer une application s'ouvre.
  3. Saisissez le nom de l'application, sélectionnez la langue par défaut et indiquez d'autres informations la concernant.
  4. Cliquez sur Create app (Créer une application). Une application est alors créée dans la Google Play Console.

Vous pouvez maintenant importer l'app bundle signé de l'application exemple.

Importer l'app bundle signé

  1. Importez l'app bundle signé dans le canal de test interne de la console Google Play. Vous ne pourrez configurer les fonctionnalités liées à la monétisation dans la Play Console qu'après l'avoir importée.
  2. Cliquez sur Tester et publier > Tests > Version interne > Créer une version.
  3. Saisissez un nom de version et importez le fichier du bundle d'application signé.
  4. Cliquez sur Suivant, puis sur Enregistrer et publier.

Vous pouvez maintenant créer vos produits ponctuels.

Créer un produit ponctuel

Pour créer un produit ponctuel :

  1. Dans la Google Play Console, accédez à Monétiser avec Play > Produits > Produits ponctuels dans le menu de navigation de gauche.
  2. Cliquez sur Créer un produit ponctuel.
  3. Saisissez les informations suivantes sur le produit :
    • ID produit : saisissez un ID produit unique. Saisissez one_time_product_01.
    • (Facultatif) Tags : ajoutez des tags pertinents.
    • Nom : saisissez le nom d'un produit. Exemple :Product name
    • Description : saisissez une description du produit. Exemple :Product description
    • (Facultatif) Ajoutez une image d'icône : importez une icône représentant votre produit.
    Remarque : Pour cet atelier de programmation, vous pouvez ignorer la configuration de la section Taxes, conformité et programmes.
  4. Cliquez sur Suivant.
  5. Ajoutez une option d'achat et configurez sa disponibilité selon la région. Un produit ponctuel doit comporter au moins une option d'achat, qui définit comment le droit d'accès est accordé, son prix et sa disponibilité selon la région. Pour cet atelier de programmation, nous allons ajouter l'option standard Acheter pour le produit.Dans la section Option d'achat, saisissez les informations suivantes :
    • ID de l'option d'achat : saisissez l'ID d'une option d'achat. Exemple :buy
    • Type d'achat : sélectionnez Acheter.
    • (Facultatif) Tags : ajoutez des tags spécifiques à cette option d'achat.
    • (Facultatif) Cliquez sur Options avancées pour configurer les options avancées. Pour cet atelier de programmation, vous pouvez ignorer la configuration des options avancées.
  6. Dans la section Disponibilité et prix, cliquez sur Définir les prix > Modifier le prix de façon groupée.
  7. Sélectionnez l'option Pays / Région. Toutes les régions sont alors sélectionnées.
  8. Cliquez sur Continuer. Une boîte de dialogue s'ouvre pour vous permettre de saisir un prix. Saisissez 10 USD, puis cliquez sur Appliquer.
  9. Cliquez sur Enregistrer, puis sur Activer. L'option d'achat est alors créée et activée.

Pour les besoins de cet atelier de programmation, créez trois produits ponctuels supplémentaires avec les ID de produit suivants :

  • consumable_product_01
  • consumable_product_02
  • consumable_product_03

L'application exemple est configurée pour utiliser ces ID de produit. Vous pouvez fournir différents ID de produit. Dans ce cas, vous devrez modifier l'application exemple pour utiliser l'ID de produit que vous avez fourni.

Ouvrez l'application exemple dans la Google Play Console, puis accédez à Monétiser avec Play > Produits > Produits ponctuels. Cliquez ensuite sur Créer un produit ponctuel et répétez les étapes 3 à 9.

Vidéo sur la création de produits ponctuels

La vidéo exemple suivante montre les étapes de création unique d'un produit décrites précédemment.

4. Intégrer à PBL

Nous allons maintenant voir comment intégrer votre application à la Bibliothèque Play Billing (PBL). Cette section décrit les étapes générales de l'intégration et fournit un extrait de code pour chacune d'elles. Vous pouvez utiliser ces extraits comme guide pour implémenter votre intégration.

Pour intégrer votre application à PBL, procédez comme suit :

  1. Ajoutez la dépendance de la bibliothèque Play Billing à l'application exemple.
    dependencies {
    val billing_version = "8.0.0"
    
    implementation("com.android.billingclient:billing-ktx:$billing_version")
    }
    
  2. Initialisez le BillingClient. BillingClient est le SDK client qui réside dans votre application et communique avec la bibliothèque Play Billing. L'extrait de code suivant montre comment initialiser le client de facturation.
    protected BillingClient createBillingClient() {
    return BillingClient.newBuilder(activity)
        .setListener(purchasesUpdatedListener)
        .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
        .enableAutoServiceReconnection()
        .build();
    }
    
  3. Connectez-vous à Google Play.L'extrait de code suivant montre comment se connecter à Google Play.
    public void startBillingConnection(ImmutableList<Product> productList) {
    Log.i(TAG, "Product list sent: " + productList);
    Log.i(TAG, "Starting connection");
    billingClient.startConnection(
        new BillingClientStateListener() {
          @Override
          public void onBillingSetupFinished(BillingResult billingResult) {
            if (billingResult.getResponseCode() == BillingResponseCode.OK) {
              // Query product details to get the product details list.
              queryProductDetails(productList);
            } else {
              // BillingClient.enableAutoServiceReconnection() will retry the connection on
              // transient errors automatically.
              // We don't need to retry on terminal errors (e.g., BILLING_UNAVAILABLE,
              // DEVELOPER_ERROR).
              Log.e(TAG, "Billing connection failed: " + billingResult.getDebugMessage());
              Log.e(TAG, "Billing response code: " + billingResult.getResponseCode());
            }
          }
    
          @Override
          public void onBillingServiceDisconnected() {
            Log.e(TAG, "Billing Service connection lost.");
          }
        });
    }
    
  4. Récupérez les informations détaillées sur le produit ponctuel.Après avoir intégré votre application à PBL, vous devez récupérer les informations détaillées sur le produit ponctuel dans votre application. L'extrait de code suivant montre comment récupérer les informations détaillées sur le produit ponctuel dans votre application.
    private void queryProductDetails(ImmutableList<Product> productList) {
    Log.i(TAG, "Querying products for: " + productList);
    QueryProductDetailsParams queryProductDetailsParams =
        QueryProductDetailsParams.newBuilder().setProductList(productList).build();
    billingClient.queryProductDetailsAsync(
        queryProductDetailsParams,
        new ProductDetailsResponseListener() {
          @Override
          public void onProductDetailsResponse(
              BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) {
            // check billingResult
            Log.i(TAG, "Billing result after querying: " + billingResult.getResponseCode());
            // process returned productDetailsList
            Log.i(
                TAG,
                "Print unfetched products: " + productDetailsResponse.getUnfetchedProductList());
            setupProductDetailsMap(productDetailsResponse.getProductDetailsList());
            billingServiceClientListener.onProductDetailsFetched(productDetailsMap);
          }
        });
    }
    
    L'extraction de ProductDetails renvoie une réponse semblable à la suivante :
    {
        "productId": "consumable_product_01",
        "type": "inapp",
        "title": "Shadow Coat (Yolo's Realm | Play Samples)",
        "name": "Shadow Coat",
        "description": "A sleek, obsidian coat for stealth and ambushes",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 1990000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$1.99",
                "offerIdToken": "<--offerIdToken-->",
                "purchaseOptionId": "buy",
                "offerTags": []
            }
        ]
    },
    {
        "productId": "consumable_product_02",
        "type": "inapp",
        "title": "Emperor Den (Yolo's Realm | Play Samples)",
        "name": "Emperor Den",
        "description": "A fair lair glowing with molten rock and embers",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 2990000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$2.99",
                "offerIdToken": "<--offerIdToken-->",
                "purchaseOptionId": "buy",
                "offerTags": []
            }
        ]
    }
    
  5. Lancez le parcours de facturation.
    public void launchBillingFlow(String productId) {
    ProductDetails productDetails = productDetailsMap.get(productId);
    if (productDetails == null) {
      Log.e(
          TAG, "Cannot launch billing flow: ProductDetails not found for productId: " + productId);
      billingServiceClientListener.onBillingResponse(
          BillingResponseCode.ITEM_UNAVAILABLE,
          BillingResult.newBuilder().setResponseCode(BillingResponseCode.ITEM_UNAVAILABLE).build());
      return;
    }
    ImmutableList<ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            ProductDetailsParams.newBuilder().setProductDetails(productDetails).build());
    
    BillingFlowParams billingFlowParams =
        BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(productDetailsParamsList)
            .build();
    
    billingClient.launchBillingFlow(activity, billingFlowParams);
    }
    
  6. Détecter et traiter les achats. Au cours de cette étape, vous devez :
    1. Valider l'achat
    2. Accorder un droit d'accès à l'utilisateur
    3. Informer l'utilisateur
    4. Informer Google du processus d'achat
    Parmi ces étapes, a, b et c doivent être effectuées dans votre backend. Elles ne sont donc pas abordées dans cet atelier de programmation. L'extrait suivant montre comment informer Google d'un produit à usage unique consommable :
    private void handlePurchase(Purchase purchase) {
    // Step 1: Send the purchase to your secure backend to verify the purchase following
    // https://developer.android.com/google/play/billing/security#verify
    
    // Step 2: Update your entitlement storage with the purchase. If purchase is
    // in PENDING state then ensure the entitlement is marked as pending and the
    // user does not receive benefits yet. It is recommended that this step is
    // done on your secure backend and can combine in the API call to your
    // backend in step 1.
    
    // Step 3: Notify the user using appropriate messaging.
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
      for (String product : purchase.getProducts()) {
        Log.d(TAG, product + " purchased successfully! ");
      }
    }
    
    // Step 4: Notify Google the purchase was processed.
    // For one-time products, acknowledge the purchase.
    // This sample app (client-only) uses billingClient.acknowledgePurchase().
    // For consumable one-time products, consume the purchase
    // This sample app (client-only) uses billingClient.consumeAsync()
    // If you have a secure backend, you must acknowledge purchases on your server using the
    // server-side API.
    // See https://developer.android.com/google/play/billing/security#acknowledge
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED && !purchase.isAcknowledged()) {
    
      if (shouldConsume(purchase)) {
        ConsumeParams consumeParams =
            ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();
        billingClient.consumeAsync(consumeParams, consumeResponseListener);
    
      } else {
        AcknowledgePurchaseParams acknowledgePurchaseParams =
            AcknowledgePurchaseParams.newBuilder()
                .setPurchaseToken(purchase.getPurchaseToken())
                .build();
        billingClient.acknowledgePurchase(
            acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
      }
     }
    }
    

5. Analyser les abandons d'achat

Jusqu'à présent, les réponses Play Billing dans l'atelier de programmation se sont concentrées sur des scénarios limités tels que les réponses USER_CANCELLED, BILLING_UNAVAILABLE, OK et ITEM_ALREADY_OWNED. Toutefois, la facturation Play peut renvoyer 13 codes de réponse différents qui peuvent être déclenchés par divers facteurs réels.

Cette section détaille les causes des réponses d'erreur USER_CANCELLED et BILLING_UNAVAILABLE, et suggère des mesures correctives possibles que vous pouvez mettre en œuvre.

Code d'erreur de réponse USER_CANCELED

Ce code de réponse indique que l'utilisateur a abandonné l'interface utilisateur du parcours d'achat avant de finaliser l'achat.

Causes probables

Quelles actions pouvez-vous effectuer ?

  • Cela peut indiquer que les utilisateurs ont une faible intention et sont sensibles aux prix.
  • L'achat est en attente ou le paiement est refusé.

Code d'erreur de réponse BILLING_UNAVAILABLE

Ce code de réponse signifie que l'achat n'a pas pu être finalisé en raison d'un problème lié au fournisseur de services de paiement de l'utilisateur ou au mode de paiement choisi. Par exemple, la carte de crédit de l'utilisateur a expiré ou il se trouve dans un pays où le service n'est pas disponible. Ce code n'indique pas une erreur liée au système de facturation Play lui-même.

Causes probables

Quelles actions pouvez-vous effectuer ?

  • L'application Play Store sur l'appareil de l'utilisateur est obsolète.
  • L'utilisateur se trouve dans un pays où Play n'est pas disponible.
  • L'utilisateur est un utilisateur de la version Enterprise, et son administrateur d'entreprise ne l'autorise pas à effectuer des achats.
  • Google Play ne peut pas débiter le mode de paiement de l'utilisateur. Par exemple, sa carte de crédit est peut-être arrivée à expiration.
  • Surveiller les tendances des problèmes système et dans des régions spécifiques
  • Envisagez de migrer vers PBL 8, car il est compatible avec le code de sous-réponse PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS, qui est plus précis. Si vous recevez ce code de réponse, pensez à informer les utilisateurs de l'échec ou à leur suggérer d'autres modes de paiement.
  • Ce code de réponse est conçu pour les nouvelles tentatives, ce qui vous permet d'implémenter des stratégies de nouvelle tentative appropriées.
    Dans ce cas, il est peu probable que les nouvelles tentatives automatiques permettent de remédier à la situation. Toutefois, une nouvelle tentative manuelle peut être utile si l'utilisateur résout la condition à l'origine du problème. Par exemple, si l'utilisateur met à jour sa version du Play Store vers une version compatible, une nouvelle tentative manuelle de l'opération initiale peut fonctionner.

    Si vous recevez ce code de réponse lorsque la session utilisateur n'est pas en cours, une nouvelle tentative n'est pas forcément judicieuse. Lorsque vous obtenez une réponse `BILLING_UNAVAILABLE` liée au parcours d'achat, l'utilisateur a très probablement reçu des informations de Google Play au cours du processus d'achat et sait peut-être ce qu'il s'est passé. Dans ce cas, vous pouvez afficher un message d'erreur indiquant qu'un problème est survenu et proposer un bouton "Réessayer" pour permettre à l'utilisateur d'effectuer une nouvelle tentative manuelle après avoir résolu le problème.

Stratégies de nouvelle tentative pour les codes d'erreur de réponse

Les stratégies de réessai efficaces pour les erreurs récupérables de la bibliothèque Play Billing (PBL) varient en fonction du contexte, comme les interactions des utilisateurs en session (par exemple, lors d'un achat) par rapport aux opérations en arrière-plan (par exemple, l'interrogation des achats lors de la reprise de l'application). Il est important d'implémenter ces stratégies, car certaines valeurs BillingResponseCode indiquent des problèmes temporaires qui peuvent être résolus en effectuant une nouvelle tentative, tandis que d'autres sont permanentes et ne nécessitent pas de nouvelles tentatives.

Pour les erreurs rencontrées lorsqu'une session utilisateur est en cours, il est conseillé d'utiliser une stratégie de nouvelle tentative simple avec un nombre maximal de tentatives défini afin de minimiser les perturbations de l'expérience utilisateur. À l'inverse, pour les opérations en arrière-plan telles que la confirmation de nouveaux achats, qui ne nécessitent pas d'exécution immédiate, l'intervalle exponentiel entre les tentatives est l'approche recommandée.

Pour en savoir plus sur les codes de réponse spécifiques et les stratégies de nouvelle tentative recommandées correspondantes, consultez Gérer les codes de réponse BillingResult.

6. Étapes suivantes

Documents de référence

7. Félicitations !

Félicitations ! Vous avez réussi à parcourir la Google Play Console pour créer un produit ponctuel, tester les codes de réponse de facturation et analyser les abandons d'achat.

Enquête

Vos commentaires sur cet atelier de programmation sont très importants. Prenez quelques minutes pour répondre à notre enquête.