Compartir a través de


Administrar ofertas dirigidas mediante servicios de la Tienda

Si creas una oferta de destino en la página Ofertas dirigidas de participación > para tu aplicación en el Centro de partners, usa la API de ofertas dirigidas de Microsoft Store en el código de la aplicación para recuperar información que te ayude a implementar la experiencia en la aplicación para la oferta de destino. Para obtener más información sobre las ofertas dirigidas y cómo crearlas en el panel, consulte Uso de ofertas dirigidas para maximizar la participación y las conversiones.

La API de ofertas dirigidas es una API REST sencilla que puede usar para obtener las ofertas dirigidas que están disponibles para el usuario actual, en función de si el usuario forma parte del segmento de cliente para la oferta de destino. Para usar esta API en el código de la aplicación, siga estos pasos:

  1. Obtenga un token de cuenta Microsoft para el usuario que ha iniciado sesión actual de la aplicación.
  2. Obtenga las ofertas dirigidas para el usuario actual.
  3. Implemente la experiencia de compra desde la aplicación para el complemento asociado a una de las ofertas de destino. Para obtener más información sobre la implementación de compras desde la aplicación, consulte este artículo.

Para obtener un ejemplo de código completo que muestre todos estos pasos, consulte el ejemplo de código al final de este artículo. En las secciones siguientes se proporcionan más detalles sobre cada paso.

Obtención de un token de cuenta Microsoft para el usuario actual

En el código de la aplicación, obtenga un token de cuenta Microsoft (MSA) para el usuario que ha iniciado sesión actual. Debes pasar este token en el encabezado de Authorization solicitud de la API de ofertas de destino de Microsoft Store. La Tienda usa este token para recuperar las ofertas dirigidas que están disponibles para el usuario actual.

Para obtener el token de MSA, use la clase WebAuthenticationCoreManager para solicitar un token mediante el ámbito devcenter_implicit.basic,wl.basic. En el ejemplo siguiente se muestra cómo hacerlo: Este ejemplo es un extracto del ejemplo completo y requiere instrucciones using que se proporcionan en el ejemplo completo.

private async Task<string> GetMicrosoftAccountTokenAsync()
{
    var msaProvider = await WebAuthenticationCoreManager.FindAccountProviderAsync(
        "https://login.microsoft.com", "consumers");

    WebTokenRequest request = new WebTokenRequest(msaProvider, "devcenter_implicit.basic,wl.basic");
    WebTokenRequestResult result = await WebAuthenticationCoreManager.RequestTokenAsync(request);

    if (result.ResponseStatus == WebTokenRequestStatus.Success)
    {
        return result.ResponseData[0].Token;
    }
    else
    {
        return string.Empty;
    }
}

Para obtener más información sobre cómo obtener tokens de MSA, consulte Administrador de cuentas web.

Obtención de las ofertas dirigidas para el usuario actual

Después de tener un token de MSA para el usuario actual, llame al método GET del https://manage.devcenter.microsoft.com/v2.0/my/storeoffers/user URI para obtener las ofertas de destino disponibles para el usuario actual. Para obtener más información sobre este método REST, consulte Obtención de ofertas dirigidas.

Este método devuelve los identificadores de producto de los complementos asociados a las ofertas de destino que están disponibles para el usuario actual. Con esta información, puede ofrecer una o varias de las ofertas dirigidas como una compra desde la aplicación al usuario.

En el ejemplo siguiente se muestra cómo obtener las ofertas dirigidas para el usuario actual. Este ejemplo es un extracto del ejemplo completo. Requiere la biblioteca Json.NET de Newtonsoft y clases adicionales y las instrucciones using que se proporcionan en el ejemplo completo.

private async Task<List<TargetedOfferData>> GetTargetedOffersForUserAsync(string msaToken)
{
    if (string.IsNullOrEmpty(msaToken))
    {
        System.Diagnostics.Debug.WriteLine("Microsoft Account token is null or empty.");
        return null;
    }

    HttpClient httpClientGetOffers = new HttpClient();
    httpClientGetOffers.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", msaToken);
    List<TargetedOfferData> availableOfferData = null;

    try
    {
        string getOffersResponse = await httpClientGetOffers.GetStringAsync(new Uri(storeOffersUri));
        availableOfferData = 
            Newtonsoft.Json.JsonConvert.DeserializeObject<List<TargetedOfferData>>(getOffersResponse);
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }

    return availableOfferData;
}

Finalización del ejemplo de código

En el ejemplo de código siguiente se muestran las siguientes tareas:

  • Obtenga un token de MSA para el usuario actual.
  • Obtenga todas las ofertas dirigidas para el usuario actual mediante el método Get targeted offers (Obtener ofertas dirigidas).
  • Compre el complemento asociado a una oferta de destino.

En este ejemplo se requiere la biblioteca de Json.NET de Newtonsoft. En el ejemplo se usa esta biblioteca para serializar y deserializar datos con formato JSON.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Windows.Services.Store;
using Windows.Security.Authentication.Web.Core;

namespace DocumenationExamples
{
    public class TargetedOffersExample
    {
        private const string storeOffersUri = "https://manage.devcenter.microsoft.com/v2.0/my/storeoffers/user";
        private const string jsonMediaType = "application/json";
        private static string[] productKinds = { "Durable", "Consumable", "UnmanagedConsumable" };
        private static StoreContext storeContext = StoreContext.GetDefault();

        public async void DemonstrateTargetedOffers()
        {
            // Get the Microsoft Account token for the current user.
            string msaToken = await GetMicrosoftAccountTokenAsync();

            if (string.IsNullOrEmpty(msaToken))
            {
                System.Diagnostics.Debug.WriteLine("Microsoft Account token could not be retrieved.");
                return;
            }

            // Get the targeted Store offers for the current user.
            List<TargetedOfferData> availableOfferData =
                await GetTargetedOffersForUserAsync(msaToken);

            if (availableOfferData == null || availableOfferData.Count == 0)
            {
                System.Diagnostics.Debug.WriteLine("There was an error retrieving targeted offers," +
                    "or there are no targeted offers available for the current user.");
                return;
            }

            // Get the product ID of the add-on that is associated with the first available offer
            // in the response data.
            TargetedOfferData offerData = availableOfferData[0];
            string productId = offerData.Offers[0];

            // Get the Store ID of the add-on that has the matching product ID, and then purchase the add-on.
            List<String> filterList = new List<string>(productKinds);
            StoreProductQueryResult queryResult = await storeContext.GetAssociatedStoreProductsAsync(filterList);
            foreach (KeyValuePair<string, StoreProduct> result in queryResult.Products)
            {
                if (result.Value.InAppOfferToken == productId)
                {
                    await PurchaseOfferAsync(result.Value.StoreId);
                    return;
                }
            }

            System.Diagnostics.Debug.WriteLine("No add-on with the specified product ID could be found " +
                "for the current app.");
            return;
        }

        private async Task<string> GetMicrosoftAccountTokenAsync()
        {
            var msaProvider = await WebAuthenticationCoreManager.FindAccountProviderAsync(
                "https://login.microsoft.com", "consumers");

            WebTokenRequest request = new WebTokenRequest(msaProvider, "devcenter_implicit.basic,wl.basic");
            WebTokenRequestResult result = await WebAuthenticationCoreManager.RequestTokenAsync(request);

            if (result.ResponseStatus == WebTokenRequestStatus.Success)
            {
                return result.ResponseData[0].Token;
            }
            else
            {
                return string.Empty;
            }
        }

        private async Task<List<TargetedOfferData>> GetTargetedOffersForUserAsync(string msaToken)
        {
            if (string.IsNullOrEmpty(msaToken))
            {
                System.Diagnostics.Debug.WriteLine("Microsoft Account token is null or empty.");
                return null;
            }

            HttpClient httpClientGetOffers = new HttpClient();
            httpClientGetOffers.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", msaToken);
            List<TargetedOfferData> availableOfferData = null;

            try
            {
                string getOffersResponse = await httpClientGetOffers.GetStringAsync(new Uri(storeOffersUri));
                availableOfferData = 
                    Newtonsoft.Json.JsonConvert.DeserializeObject<List<TargetedOfferData>>(getOffersResponse);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            return availableOfferData;
        }

        private async Task PurchaseOfferAsync(string storeId)
        {
            if (string.IsNullOrEmpty(storeId))
            {
                System.Diagnostics.Debug.WriteLine("storeId is null or empty.");
                return;
            }

            // Purchase the add-on for the current user. Typically, a game or app would first show
            // a UI that prompts the user to buy the add-on; for simplicity, this example
            // simply purchases the add-on.
            StorePurchaseResult result = await storeContext.RequestPurchaseAsync(storeId);

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

            switch (result.Status)
            {
                case StorePurchaseStatus.AlreadyPurchased:
                    System.Diagnostics.Debug.WriteLine("The user has already purchased the product.");
                    break;

                case StorePurchaseStatus.Succeeded:
                    System.Diagnostics.Debug.WriteLine("The purchase was successful.");
                    break;

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

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

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

                default:
                    System.Diagnostics.Debug.WriteLine("The purchase was unsuccessful due to an unknown error. " +
                        "ExtendedError: " + extendedError);
                    break;
            }
        }
    }

    public class TargetedOfferData
    {
        [JsonProperty(PropertyName = "offers")]
        public IList<string> Offers { get; } = new List<string>();

        [JsonProperty(PropertyName = "trackingId")]
        public string TrackingId { get; set; }
    }
}