Activer les extensions d’abonnement de votre application

Votre application plateforme Windows universelle (UWP) peut proposer des achats in-app de modules complémentaires d’abonnement à vos clients. Vous pouvez utiliser des abonnements pour vendre des produits numériques dans votre application (tels que des fonctionnalités d’application ou du contenu numérique) avec des périodes de facturation récurrentes automatisées.

Notes

Pour activer l’achat de modules complémentaires d’abonnement dans votre application, votre projet doit cibler Windows 10 édition anniversaire (10.0 ; Build 14393) ou une version ultérieure dans Visual Studio (cela correspond à Windows 10, version 1607), et elle doit utiliser les API dans l’espace de noms Windows.Services.Store pour implémenter l’expérience d’achat dans l’application au lieu de l’espace de noms Windows.ApplicationModel.Store. Pour plus d’informations sur les différences entre ces espaces de noms, consultez Achats et essais in-app.

Présentation des fonctionnalités

Les extensions d’abonnement pour les applications UWP prennent en charge les fonctionnalités suivantes :

  • Vous pouvez choisir parmi des périodes d’abonnement de 1 mois, 3 mois, 6 mois, 1 an ou 2 ans.
  • Vous pouvez ajouter des périodes d’essai gratuites de 1 semaine ou 1 mois à votre abonnement.
  • Le Kit de développement logiciel (SDK) Windows fournit des API que vous pouvez utiliser dans votre application pour obtenir des informations sur les extensions d’abonnement disponibles pour l’application et activer l’achat d’un module complémentaire d’abonnement. Nous fournissons également des API REST que vous pouvez appeler à partir de vos services pour gérer les abonnements d’un utilisateur.
  • Vous pouvez afficher des rapports analytiques qui fournissent le nombre d’acquisitions d’abonnements, d’abonnés actifs et d’abonnements annulés au cours d’une période donnée.
  • Les clients peuvent gérer leur abonnement sur la https://account.microsoft.com/services page de leur compte Microsoft. Les clients peuvent utiliser cette page pour afficher tous les abonnements qu’ils ont acquis, annuler un abonnement et modifier le mode de paiement associé à leur abonnement.

Étapes d’activation d’un module complémentaire d’abonnement pour votre application

Pour activer l’achat de modules complémentaires d’abonnement dans votre application, procédez comme suit.

  1. Créez une soumission de module complémentaire pour votre abonnement dans l’Espace partenaires et publiez la soumission. Lorsque vous suivez le processus de soumission des modules complémentaires, portez une attention particulière aux propriétés suivantes :

    • Type de produit : veillez à sélectionner Abonnement.

    • Période d’abonnement : choisissez la période de facturation périodique de votre abonnement. Vous ne pouvez pas modifier la période d’abonnement après la publication de votre module complémentaire.

      Chaque module complémentaire d’abonnement prend en charge une seule période d’abonnement et une période d’essai. Vous devez créer un module complémentaire d’abonnement différent pour chaque type d’abonnement que vous souhaitez proposer dans votre application. Par exemple, si vous souhaitez proposer un abonnement mensuel sans essai, un abonnement mensuel avec un essai d’un mois, un abonnement annuel sans essai et un abonnement annuel avec un essai d’un mois, vous devez créer quatre extensions d’abonnement.

    • Période d’essai : envisagez de choisir une période d’essai d’une semaine ou d’un mois pour votre abonnement afin de permettre aux utilisateurs d’essayer le contenu de votre abonnement avant de l’acheter. Vous ne pouvez pas modifier ou supprimer la période d’évaluation après la publication de votre module complémentaire d’abonnement.

      Pour obtenir un essai gratuit de votre abonnement, un utilisateur doit acheter votre abonnement par le biais du processus d’achat in-app standard, y compris un mode de paiement valide. Ils ne sont pas facturés pendant la période d’essai. À la fin de la période d’essai, l’abonnement passe automatiquement en abonnement complet et l’instrument de paiement de l’utilisateur est facturé pour la première période de l’abonnement payant. Si l’utilisateur choisit d’annuler son abonnement pendant la période d’évaluation, l’abonnement reste actif jusqu’à la fin de la période d’essai. Certaines périodes d’essai ne sont pas disponibles pour toutes les périodes d’abonnement.

      Notes

      Chaque client peut acquérir un essai gratuit pour un module complémentaire d’abonnement une seule fois. Une fois qu’un client a acquis un essai gratuit pour un abonnement, le Windows Store empêche le même client d’acquérir à nouveau le même abonnement d’essai gratuit.

    • Visibilité : si vous créez un module complémentaire de test que vous utiliserez uniquement pour tester l’expérience d’achat dans l’application de votre abonnement, nous vous recommandons de sélectionner l’une des options Masqué dans le Windows Store . Sinon, vous pouvez sélectionner la meilleure option de visibilité pour votre scénario.

    • Tarification : choisissez le prix de votre abonnement dans cette section. Vous ne pouvez pas augmenter le prix de l’abonnement après avoir publié le module complémentaire. Toutefois, vous pouvez réduire le prix ultérieurement.

      Important

      Par défaut, lorsque vous créez un module complémentaire, le prix est initialement défini sur Gratuit. Étant donné que vous ne pouvez pas augmenter le prix d’un module complémentaire d’abonnement une fois que vous avez terminé la soumission de l’extension, veillez à choisir le prix de votre abonnement ici.

  2. Dans votre application, utilisez les API de l’espace de noms Windows.Services.Store pour déterminer si l’utilisateur actuel a déjà acquis votre module complémentaire d’abonnement, puis le proposer à la vente à l’utilisateur en tant qu’achat dans l’application. Pour plus d’informations , consultez les exemples de code de cet article.

  3. Testez l’implémentation d’achat dans l’application de votre abonnement dans votre application. Vous devez télécharger votre application une seule fois à partir du Store sur votre appareil de développement pour utiliser sa licence à des fins de test. Pour plus d’informations, consultez nos conseils de test pour les achats dans l’application.

  4. Créez et publiez une soumission d’application qui inclut votre package d’application mis à jour, y compris votre code testé. Pour plus d’informations, consultez Soumissions d’applications.

Exemples de code

Les exemples de code de cette section montrent comment utiliser les API dans l’espace de noms Windows.Services.Store pour obtenir des informations sur les modules complémentaires d’abonnement pour l’application actuelle et demander l’achat d’un module complémentaire d’abonnement pour le compte de l’utilisateur actuel.

Les conditions préalables de ces exemples sont les suivantes :

Le code de ces exemples suppose :

  • Le fichier de code contient des instructions using pour les espaces de noms Windows.Services.Store et System.Threading.Tasks .
  • Cette application mono-utilisateur ne s’exécute que dans le contexte de l’utilisateur qui l’a lancée. Pour plus d’informations, consultez Versions d’évaluation et achats in-app.

Notes

Si vous avez une application de bureau qui utilise le Pont du bureau, vous devrez peut-être ajouter du code supplémentaire non indiqué dans ces exemples pour configurer l’objet StoreContext. Pour plus d’informations, voir Utilisation de la classe StoreContext dans une application de bureau qui utilise Desktop Bridge.

Acheter un module complémentaire d’abonnement

Cet exemple montre comment demander l’achat d’un module complémentaire d’abonnement connu pour votre application pour le compte du client actuel. Cet exemple montre également comment gérer le cas où l’abonnement a une période d’essai.

  1. Le code détermine d’abord si le client dispose déjà d’une licence active pour l’abonnement. Si le client dispose déjà d’une licence active, votre code doit déverrouiller les fonctionnalités de l’abonnement si nécessaire (étant donné que cela est propriétaire de votre application, cela est identifié par un commentaire dans l’exemple).
  2. Ensuite, le code obtient l’objet StoreProduct qui représente l’abonnement que vous souhaitez acheter pour le compte du client. Le code suppose que vous connaissez déjà l’ID Store du module complémentaire d’abonnement que vous souhaitez acheter et que vous avez affecté cette valeur à la variable subscriptionStoreId .
  3. Le code détermine ensuite si une version d’évaluation est disponible pour l’abonnement. Si vous le souhaitez, votre application peut utiliser ces informations pour afficher des détails sur la version d’évaluation ou l’abonnement complet disponible pour le client.
  4. Enfin, le code appelle la méthode RequestPurchaseAsync pour demander l’achat de l’abonnement. Si une version d’évaluation est disponible pour l’abonnement, la version d’évaluation est proposée au client pour achat. Sinon, l’abonnement complet sera proposé à l’achat.
private StoreContext context = null;
StoreProduct subscriptionStoreProduct;

// Assign this variable to the Store ID of your subscription add-on.
private string subscriptionStoreId = "";  

// This is the entry point method for the example.
public async Task SetupSubscriptionInfoAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    bool userOwnsSubscription = await CheckIfUserHasSubscriptionAsync();
    if (userOwnsSubscription)
    {
        // Unlock all the subscription add-on features here.
        return;
    }

    // Get the StoreProduct that represents the subscription add-on.
    subscriptionStoreProduct = await GetSubscriptionProductAsync();
    if (subscriptionStoreProduct == null)
    {
        return;
    }

    // Check if the first SKU is a trial and notify the customer that a trial is available.
    // If a trial is available, the Skus array will always have 2 purchasable SKUs and the
    // first one is the trial. Otherwise, this array will only have one SKU.
    StoreSku sku = subscriptionStoreProduct.Skus[0];
    if (sku.SubscriptionInfo.HasTrialPeriod)
    {
        // You can display the subscription trial info to the customer here. You can use 
        // sku.SubscriptionInfo.TrialPeriod and sku.SubscriptionInfo.TrialPeriodUnit 
        // to get the trial details.
    }
    else
    {
        // You can display the subscription purchase info to the customer here. You can use 
        // sku.SubscriptionInfo.BillingPeriod and sku.SubscriptionInfo.BillingPeriodUnit
        // to provide the renewal details.
    }

    // Prompt the customer to purchase the subscription.
    await PromptUserToPurchaseAsync();
}

private async Task<bool> CheckIfUserHasSubscriptionAsync()
{
    StoreAppLicense appLicense = await context.GetAppLicenseAsync();

    // Check if the customer has the rights to the subscription.
    foreach (var addOnLicense in appLicense.AddOnLicenses)
    {
        StoreLicense license = addOnLicense.Value;
        if (license.SkuStoreId.StartsWith(subscriptionStoreId))
        {
            if (license.IsActive)
            {
                // The expiration date is available in the license.ExpirationDate property.
                return true;
            }
        }
    }

    // The customer does not have a license to the subscription.
    return false;
}

private async Task<StoreProduct> GetSubscriptionProductAsync()
{
    // Load the sellable add-ons for this app and check if the trial is still 
    // available for this customer. If they previously acquired a trial they won't 
    // be able to get a trial again, and the StoreProduct.Skus property will 
    // only contain one SKU.
    StoreProductQueryResult result =
        await context.GetAssociatedStoreProductsAsync(new string[] { "Durable" });

    if (result.ExtendedError != null)
    {
        System.Diagnostics.Debug.WriteLine("Something went wrong while getting the add-ons. " +
            "ExtendedError:" + result.ExtendedError);
        return null;
    }

    // Look for the product that represents the subscription.
    foreach (var item in result.Products)
    {
        StoreProduct product = item.Value;
        if (product.StoreId == subscriptionStoreId)
        {
            return product;
        }
    }

    System.Diagnostics.Debug.WriteLine("The subscription was not found.");
    return null;
}

private async Task PromptUserToPurchaseAsync()
{
    // Request a purchase of the subscription product. If a trial is available it will be offered 
    // to the customer. Otherwise, the non-trial SKU will be offered.
    StorePurchaseResult result = await subscriptionStoreProduct.RequestPurchaseAsync();

    // Capture the error message for the operation, if any.
    string extendedError = string.Empty;
    if (result.ExtendedError != null)
    {
        extendedError = result.ExtendedError.Message;
    }

    switch (result.Status)
    {
        case StorePurchaseStatus.Succeeded:
            // Show a UI to acknowledge that the customer has purchased your subscription 
            // and unlock the features of the subscription. 
            break;

        case StorePurchaseStatus.NotPurchased:
            System.Diagnostics.Debug.WriteLine("The purchase did not complete. " +
                "The customer may have cancelled the purchase. ExtendedError: " + extendedError);
            break;

        case StorePurchaseStatus.ServerError:
        case StorePurchaseStatus.NetworkError:
            System.Diagnostics.Debug.WriteLine("The purchase was unsuccessful due to a server or network error. " +
                "ExtendedError: " + extendedError);
            break;

        case StorePurchaseStatus.AlreadyPurchased:
            System.Diagnostics.Debug.WriteLine("The customer already owns this subscription." +
                    "ExtendedError: " + extendedError);
            break;
    }
}

Obtenir des informations sur les modules complémentaires d’abonnement pour l’application actuelle

Cet exemple de code montre comment obtenir des informations pour tous les modules complémentaires d’abonnement disponibles dans votre application. Pour obtenir ces informations, utilisez d’abord la méthode GetAssociatedStoreProductsAsync pour obtenir la collection d’objets StoreProduct qui représentent chacun des modules complémentaires disponibles pour l’application. Ensuite, obtenez la référence StoreSku pour chaque produit et utilisez les propriétés IsSubscription et SubscriptionInfo pour accéder aux informations d’abonnement.

private StoreContext context = null;

public async Task GetSubscriptionsInfo()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    // Subscription add-ons are Durable products.
    string[] productKinds = { "Durable" };
    List<String> filterList = new List<string>(productKinds);

    StoreProductQueryResult queryResult =
        await context.GetAssociatedStoreProductsAsync(productKinds);

    if (queryResult.ExtendedError != null)
    {
        // The user may be offline or there might be some other server failure.
        System.Diagnostics.Debug.WriteLine($"ExtendedError: {queryResult.ExtendedError.Message}");
        return;
    }

    foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
    {
        // Access the Store product info for the add-on.
        StoreProduct product = item.Value;

        // For each add-on, the subscription info is available in the SKU objects in the add-on. 
        foreach (StoreSku sku in product.Skus)
        {
            if (sku.IsSubscription)
            {
                // Use the sku.SubscriptionInfo property to get info about the subscription. 
                // For example, the following code gets the units and duration of the 
                // subscription billing period.
                StoreDurationUnit billingPeriodUnit = sku.SubscriptionInfo.BillingPeriodUnit;
                uint billingPeriod = sku.SubscriptionInfo.BillingPeriod;
            }
        }
    }
}

Gérer les abonnements à partir de vos services

Une fois que votre application mise à jour est dans le Store et que les clients peuvent acheter votre module complémentaire d’abonnement, vous pouvez avoir des scénarios dans lesquels vous devez gérer l’abonnement pour un client. Nous fournissons des API REST que vous pouvez appeler à partir de vos services pour effectuer les tâches de gestion des abonnements suivantes :

Annulations

Les clients peuvent utiliser la https://account.microsoft.com/services page de leur compte Microsoft pour afficher tous les abonnements qu’ils ont acquis, annuler un abonnement et modifier le mode de paiement associé à leur abonnement. Lorsqu’un client annule un abonnement à l’aide de cette page, il continue à avoir accès à l’abonnement pendant la durée de la période de facturation actuelle. Ils n’obtiennent pas de remboursement pour une partie de la période de facturation actuelle. À la fin de la période de facturation actuelle, leur abonnement est désactivé.

Vous pouvez également annuler un abonnement pour le compte d’un utilisateur en utilisant notre API REST pour modifier l’état de facturation d’un abonnement pour un utilisateur donné.

Renouvellements d’abonnement et périodes de grâce

À un moment donné, au cours de chaque période de facturation, nous tenterons de facturer les carte de crédit du client pour la période de facturation suivante. Si les frais échouent, l’abonnement du client entre dans l’état de relance . Cela signifie que son abonnement est toujours actif pour le reste de la période de facturation actuelle, mais nous essaierons régulièrement de facturer leur crédit carte pour renouveler automatiquement l’abonnement. Cet état peut durer jusqu’à deux semaines, jusqu’à la fin de la période de facturation actuelle et à la date de renouvellement de la prochaine période de facturation.

Nous n’offrons pas de périodes de grâce pour la facturation de l’abonnement. Si nous ne parvenons pas à facturer le crédit du client carte à la fin de la période de facturation actuelle, l’abonnement sera annulé et le client n’aura plus accès à l’abonnement après la période de facturation actuelle.

Scénarios non pris en charge

Les scénarios suivants ne sont actuellement pas pris en charge pour les modules complémentaires d’abonnement.

  • La vente d’abonnements aux clients directement via le Store n’est pas prise en charge pour le moment. Les abonnements sont disponibles uniquement pour les achats dans l’application de produits numériques.
  • Les clients ne peuvent pas changer de période d’abonnement à l’aide de la https://account.microsoft.com/services page de leur compte Microsoft. Pour basculer vers une autre période d’abonnement, les clients doivent annuler leur abonnement actuel, puis acheter un abonnement avec une autre période d’abonnement à partir de votre application.
  • Le changement de niveau n’est actuellement pas pris en charge pour les modules complémentaires d’abonnement (par exemple, le passage d’un client d’un abonnement de base à un abonnement Premium avec davantage de fonctionnalités).
  • Les codes commerciaux et promotionnels ne sont actuellement pas pris en charge pour les modules complémentaires d’abonnement.
  • Renouvellement des abonnements existants après avoir défini la visibilité de votre complément d’abonnement sur Arrêter l’acquisition. Pour plus d’informations , consultez Définir la tarification et la disponibilité des modules complémentaires.