Administrar un catálogo extenso de productos desde la aplicación

Si tu aplicación ofrece un catálogo de productos de gran tamaño en la aplicación, también puedes seguir el proceso descrito en este tema para ayudar a administrar dicho catálogo. En versiones anteriores a Windows 10, la Tienda tiene un límite de 200 descripciones de producto por cada cuenta de desarrollador, y el proceso descrito en este tema puede usarse para evitar esa limitación. A partir de Windows 10, la Tienda no tiene ningún límite para el número de descripciones de producto por cada cuenta de desarrollador, y el proceso descrito en este artículo ya no es necesario.

Importante

En este artículo se muestra cómo usar miembros del espacio de nombres Windows.ApplicationModel.Store . Este espacio de nombres ya no se actualiza con nuevas características y se recomienda usar el espacio de nombres Windows.Services.Store en su lugar. El espacio de nombres Windows.Services.Store admite los tipos de complementos más recientes, como complementos y suscripciones consumibles administrados por la Tienda, y está diseñado para ser compatible con futuros tipos de productos y características compatibles con el Centro de partners y la Tienda. El espacio de nombres Windows.Services.Store se introdujo en Windows 10, versión 1607, y solo se puede usar en proyectos que tienen como destino Windows 10 Anniversary Edition (10.0; Compilación 14393) o una versión posterior en Visual Studio. Para obtener más información, consulta Pruebas y compras desde la aplicación.

Para habilitar esta funcionalidad, crearás unas cuantas entradas de productos para franjas de precios específicas, cada una de ellas capaz de representar cientos de productos en un catálogo. Usa la sobrecarga del método RequestProductPurchaseAsync, que especifica una oferta definida por la aplicación asociada con un producto incluido en la Tienda. Además de especificar una asociación entre oferta y producto durante la llamada, tu aplicación también deberá pasar un objeto ProductPurchaseDisplayProperties que contenga los detalles de la oferta del catálogo de gran volumen. Si estos detalles no se suministran, se usarán los detalles que figuran sobre el producto.

La Tienda usará únicamente el offerId de la solicitud de compra en el PurchaseResults resultante. Este proceso no modifica directamente la información suministrada inicialmente al incluir el producto desde la aplicación en la Tienda.

Requisitos previos

  • En este tema se aborda el soporte técnico de la Tienda para la representación de varias ofertas desde la aplicación usando un solo producto desde la aplicación incluido en la Tienda. Si no estás familiarizado con las compras desde la aplicación, consulta Habilitar compras de productos desde la aplicación para ver información sobre la licencia y cómo incluir de la forma adecuada tu compra desde la aplicación en la Tienda.
  • Cuando codificas y pruebas nuevas ofertas desde la aplicación por primera vez, debes usar el objeto CurrentAppSimulator en lugar del objeto CurrentApp. De esta manera, puedes comprobar la lógica de la licencia con llamadas simuladas al servidor de licencias, en lugar de llamar al servidor activo. Para ello, debes personalizar el archivo denominado WindowsStoreProxy.xml en %userprofile%\AppData\local\packages\<package name>\LocalState\Microsoft\Windows Store\ApiData. El simulador de Microsoft Visual Studio crea este archivo la primera vez que se ejecuta la aplicación, aunque también puedes cargar un archivo personalizado en el tiempo de ejecución. Para obtener más información, consulta Uso del archivo WindowsStoreProxy.xml con CurrentAppSimulator.
  • Este tema también hace referencia a los ejemplos de código que se proporcionan en la muestra de la Tienda. Esta muestra es ideal para conseguir experiencia práctica con las diferentes opciones de monetización que se proporcionan para las aplicaciones para la Plataforma universal de Windows (UWP).

Realizar la solicitud de compra del producto desde la aplicación

La solicitud de compra de un producto concreto dentro de un catálogo voluminoso se controla en gran medida como cualquier otra solicitud de compra dentro de la aplicación. Cuando tu aplicación llama a la nueva sobrecarga del método RequestProductPurchaseAsync, proporciona tanto un OfferId como un objeto ProductPurchaseDisplayProperties rellenado con el nombre del producto desde la aplicación.

string offerId = "1234";
string displayPropertiesName = "MusicOffer1";
var displayProperties = new ProductPurchaseDisplayProperties(displayPropertiesName);

try
{
    PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync(
        "product1", offerId, displayProperties);
    switch (purchaseResults.Status)
    {
        case ProductPurchaseStatus.Succeeded:
            // 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:
            // 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;
        case ProductPurchaseStatus.NotPurchased:
            // Notify user that the purchase was not completed due to cancellation or error.
            break;
    }
}
catch (Exception)
{
    // Notify the user of the purchase error.
}

Notificar la cumplimentación de la oferta desde la aplicación

Tu aplicación deberá notificar a la Tienda la cumplimentación del producto en cuanto la oferta se haya suministrado localmente. En un escenario con un catálogo voluminoso, si tu aplicación no notifica la cumplimentación de la oferta, el usuario no podrá comprar ninguna oferta desde la aplicación a través de la misma lista de productos de la Tienda.

Tal y como se mencionó antes, la Tienda usa la información de las ofertas suministradas solamente para rellenar PurchaseResults, y no crea una asociación permanente entre una oferta del catálogo extenso y la lista de productos de la Tienda. En consecuencia, es necesario realizar un seguimiento de la autorización del usuario para productos del catálogo y ofrecer al usuario contexto específico de producto (como el nombre del artículo que se va a comprar o detalles al respecto) fuera de la operación RequestProductPurchaseAsync.

El siguiente código refleja la llamada de cumplimentación y un patrón de mensaje de interfaz de usuario en el que se inserta la información de la oferta en cuestión. Cuando no existe información específica del producto, el ejemplo usa información del producto ListingInformation.

string offerId = "1234";
product1ListingName = product1.Name;
string displayPropertiesName = "MusicOffer1";

if (String.IsNullOrEmpty(displayPropertiesName))
{
    displayPropertiesName = product1ListingName;
}
var offerIdMsg = " with offer id " + offerId;
if (String.IsNullOrEmpty(offerId))
{
    offerIdMsg = " with no offer id";
}

FulfillmentResult result = await CurrentAppSimulator.ReportConsumableFulfillmentAsync(productId, transactionId);
switch (result)
{
    case FulfillmentResult.Succeeded:
        Log("You bought and fulfilled " + displayPropertiesName + offerIdMsg);
        break;
    case FulfillmentResult.NothingToFulfill:
        Log("There is no purchased product 1 to fulfill.");
        break;
    case FulfillmentResult.PurchasePending:
        Log("You bought product 1. The purchase is pending so we cannot fulfill the product.");
        break;
    case FulfillmentResult.PurchaseReverted:
        Log("You bought product 1. But your purchase has been reverted.");
        // Since the user' s purchase was revoked, they got their money back.
        // You may want to revoke the user' s access to the consumable content that was granted.
        break;
    case FulfillmentResult.ServerError:
        Log("You bought product 1. There was an error when fulfilling.");
        break;
}