Partager via


Activer les achats de produits consommables dans l’application

Proposez des produits consommables dans l’application ( articles qui peuvent être achetés, utilisés et achetés à nouveau) par le biais de la plateforme de commerce du Store pour fournir à vos clients une expérience d’achat robuste et fiable. Cela est particulièrement utile pour les choses telles que la devise en jeu (or, pièces, etc.) qui peuvent être achetées, puis utilisées pour acheter des power-ups spécifiques.

Important

Cet article montre comment utiliser des membres de l’espace de noms Windows.ApplicationModel.Store pour activer les achats de produits in-app consommables. Cet espace de noms n’est plus mis à jour avec de nouvelles fonctionnalités et nous vous recommandons d’utiliser l’espace de noms Windows.Services.Store à la place. L’espace de noms Windows.Services.Store prend en charge les derniers types d’extensions, tels que les modules complémentaires consommables gérés par le Store et les abonnements, et est conçu pour être compatible avec les futurs types de produits et de fonctionnalités pris en charge par l’Espace partenaires et le Store. L’espace de noms Windows.Services.Store a été introduit dans la version 1607 de Windows 10 et ne peut être utilisé que dans les projets ciblant Windows 10 édition anniversaire (10.0 Build 14393) ou une version ultérieure dans Visual Studio. Pour plus d’informations sur l’activation des achats de produits in-app consommables à l’aide de l’espace de noms Windows.Services.Store , consultez cet article.

Prérequis

  • Cette rubrique traite des rapports d’achat et de traitement des produits consommables dans l’application. Si vous n’êtes pas familiarisé avec les produits dans l’application, consultez Activer les achats de produits dans l’application pour en savoir plus sur les informations de licence et comment répertorier correctement les produits dans l’application dans le Windows Store.
  • Lorsque vous codez et testez de nouveaux produits dans l’application pour la première fois, vous devez utiliser l’objet CurrentAppSimulator au lieu de l’objet CurrentApp . De cette façon, vous pouvez vérifier votre logique de licence à l’aide d’appels simulés au serveur de licences au lieu d’appeler le serveur en direct. Pour ce faire, vous devez personnaliser le fichier nommé WindowsStoreProxy.xml dans %userprofile%\AppData\local\packages\package name>\<LocalState\Microsoft\Windows Store\ApiData. Le simulateur Microsoft Visual Studio crée ce fichier lorsque vous exécutez votre application pour la première fois, ou vous pouvez également charger un fichier personnalisé lors de l’exécution. Pour plus d’informations, consultez Utilisation du fichier WindowsStoreProxy.xml avec CurrentAppSimulator.
  • Cette rubrique fait également référence à des exemples de code fournis dans l’exemple Store. Cet exemple est un excellent moyen d’obtenir une expérience pratique avec les différentes options de monétisation fournies pour les applications plateforme Windows universelle (UWP).

Étape 1 : Effectuer la demande d’achat

La demande d’achat initiale est effectuée avec RequestProductPurchaseAsync comme tout autre achat effectué via le Windows Store. La différence pour les produits in-app consommables est qu’après un achat réussi, un client ne peut pas acheter à nouveau le même produit tant que l’application n’a pas informé le Store que l’achat précédent a été correctement rempli. Il incombe à votre application de remplir les consommables achetés et de notifier le Store de l’exécution.

L’exemple suivant montre une demande d’achat de produit in-app consommable. Vous remarquerez que les commentaires de code indiquent quand votre application doit effectuer son traitement local du produit in-app consommable pour deux scénarios différents : lorsque la demande réussit et que la demande n’est pas réussie en raison d’un achat non rempli de ce même produit.

PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync("product1");
switch (purchaseResults.Status)
{
    case ProductPurchaseStatus.Succeeded:
        product1TempTransactionId = purchaseResults.TransactionId;

        // Grant the user their purchase here, and then pass the product ID and transaction ID to
        // CurrentAppSimulator.ReportConsumableFulfillment to indicate local fulfillment to the
        // Windows Store.
        break;

    case ProductPurchaseStatus.NotFulfilled:
        product1TempTransactionId = purchaseResults.TransactionId;

        // First check for unfulfilled purchases and grant any unfulfilled purchases from an
        // earlier transaction. Once products are fulfilled pass the product ID and transaction ID
        // to CurrentAppSimulator.ReportConsumableFulfillment to indicate local fulfillment to the
        // Windows Store.
        break;
}

Étape 2 : Suivi de l’exécution locale du consommable

Lorsque vous accordez à votre client l’accès au produit in-app consommable, il est important de suivre le produit qui est rempli (productId) et la transaction associée à (transactionId).

Important

Votre application est responsable de la création de rapports précis sur le Windows Store. Cette étape est essentielle pour maintenir une expérience d’achat équitable et fiable pour vos clients.

L’exemple suivant illustre l’utilisation des propriétés PurchaseResults de l’appel RequestProductPurchaseAsync à l’étape précédente pour identifier le produit acheté pour l’exécution. Une collection est utilisée pour stocker les informations de produit dans un emplacement qui peut être référencé ultérieurement pour confirmer que l’exécution locale a réussi.

private void GrantFeatureLocally(string productId, Guid transactionId)
{
    if (!grantedConsumableTransactionIds.ContainsKey(productId))
    {
        grantedConsumableTransactionIds.Add(productId, new List<Guid>());
    }
    grantedConsumableTransactionIds[productId].Add(transactionId);

    // Grant the user their content. You will likely increase some kind of gold/coins/some other asset count.
}

Cet exemple montre comment utiliser le tableau de l’exemple précédent pour accéder aux paires ID de produit/ID de transaction qui sont utilisées ultérieurement lors de la création de rapports sur le Store.

Important

Quelle que soit la méthodologie utilisée par votre application pour suivre et confirmer l’exécution, votre application doit démontrer une diligence raisonnable pour vous assurer que vos clients ne sont pas facturés pour les éléments qu’ils n’ont pas reçus.

private Boolean IsLocallyFulfilled(string productId, Guid transactionId)
{
    return grantedConsumableTransactionIds.ContainsKey(productId) &&
        grantedConsumableTransactionIds[productId].Contains(transactionId);
}

Étape 3 : Création de rapports sur le traitement des produits dans le Windows Store

Une fois le traitement local terminé, votre application doit effectuer un appel ReportConsumableFulfillmentAsync qui inclut le productId et la transaction dans laquelle l’achat du produit est inclus.

Important

L’échec du rapport des produits consommables dans l’application dans le Store entraîne l’impossibilité pour l’utilisateur d’acheter ce produit à nouveau jusqu’à ce que l’achat précédent soit signalé.

FulfillmentResult result = await CurrentAppSimulator.ReportConsumableFulfillmentAsync(
    "product2", product2TempTransactionId);

Étape 4 : Identification des achats non remplis

Votre application peut utiliser la méthode GetUnfulfilledConsumablesAsync pour rechercher des produits consommables non remplis à tout moment. Cette méthode doit être appelée régulièrement pour vérifier les consommables non remplis qui existent en raison d’événements d’application imprévus tels qu’une interruption de la connectivité réseau ou de l’arrêt de l’application.

L’exemple suivant montre comment GetUnfulfilledConsumablesAsync peut être utilisé pour énumérer les consommables non remplis et comment votre application peut itérer dans cette liste pour terminer l’exécution locale.

private async void GetUnfulfilledConsumables()
{
    products = await CurrentApp.GetUnfulfilledConsumablesAsync();

    foreach (UnfulfilledConsumable product in products)
    {
        logMessage += "\nProduct Id: " + product.ProductId + " Transaction Id: " + product.TransactionId;
        // This is where you would pass the product ID and transaction ID to
        // currentAppSimulator.reportConsumableFulfillment to indicate local fulfillment to the Windows Store.
    }
}