Compartir a través de


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

Si la aplicación ofrece un catálogo de productos grande en la aplicación, puede seguir opcionalmente el proceso descrito en este tema para ayudar a administrar el catálogo. En las versiones anteriores a Windows 10, la Tienda tiene un límite de 200 descripciones de productos por cuenta de desarrollador y el proceso descrito en este tema se puede usar para solucionar esa limitación. A partir de Windows 10, la Tienda no tiene límite para el número de listados de productos por 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, consulte Pruebas y compras desde la aplicación.

Para habilitar esta funcionalidad, creará una serie de entradas de producto para planes de tarifa específicos, con cada uno de ellos capaz de representar cientos de productos dentro de un catálogo. Usa la sobrecarga del método RequestProductPurchaseAsync que especifica una oferta definida por la aplicación asociada a un producto en la aplicación que aparece en la Tienda. Además de especificar una oferta y una asociación de productos durante la llamada, la aplicación también debe pasar un objeto ProductPurchaseDisplayProperties que contenga los detalles de la oferta de catálogo grande. Si no se proporcionan estos detalles, se usarán en su lugar los detalles del producto enumerado.

La Tienda solo usará el offerId de la solicitud de compra en el resultado PurchaseResults. Este proceso no modifica directamente la información proporcionada originalmente al mostrar el producto en la aplicación en la Tienda.

Requisitos previos

  • En este tema se describe la compatibilidad de la Tienda con la representación de varias ofertas desde la aplicación mediante un único producto en la aplicación que se muestra en la Tienda. Si no está familiarizado con las compras desde la aplicación, revise Habilitar compras de productos desde la aplicación para obtener información sobre la información de licencia y cómo enumerar correctamente la compra desde la aplicación en la Tienda.
  • Al codificar y probar nuevas ofertas desde la aplicación por primera vez, debe usar el objeto CurrentAppSimulator en lugar del objeto CurrentApp . De este modo, puede comprobar la lógica de licencia mediante 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 al ejecutar la aplicación por primera vez, o también puede cargar uno personalizado en tiempo de ejecución. Para obtener más información, consulta Uso del archivo WindowsStoreProxy.xml con CurrentAppSimulator.
  • En este tema también se hace referencia a ejemplos de código proporcionados en el ejemplo store. Este ejemplo es una excelente manera de obtener experiencia práctica con las diferentes opciones de monetización proporcionadas para las aplicaciones de Plataforma universal de Windows (UWP).

Realizar la solicitud de compra para el producto desde la aplicación

La solicitud de compra de un producto específico dentro de un catálogo grande se controla de la misma manera que cualquier otra solicitud de compra dentro de una aplicación. Cuando la aplicación llama a la nueva sobrecarga del método RequestProductPurchaseAsync , la aplicación proporciona un offerId y un objeto ProductPurchaseDisplayProperties rellenado con el nombre del producto en 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 el cumplimiento de la oferta en la aplicación

La aplicación tendrá que notificar el suministro de productos a la Tienda tan pronto como la oferta se haya cumplido localmente. En un escenario de catálogo grande, si la aplicación no informa del suministro de ofertas, el usuario no podrá comprar ninguna oferta desde la aplicación con esa misma lista de productos de la Tienda.

Como se mencionó anteriormente, la Tienda solo usa la información de la oferta proporcionada para rellenar PurchaseResults y no crea una asociación persistente entre una oferta de catálogo grande y la descripción del producto store. Como resultado, debe realizar un seguimiento de los derechos de usuario de los productos y proporcionar contexto específico del producto (como el nombre del artículo que se compra o detalles sobre él) al usuario fuera de la operación RequestProductPurchaseAsync .

El código siguiente muestra la llamada de cumplimiento y un patrón de mensajería de interfaz de usuario en el que se inserta la información de la oferta específica. En ausencia de esa información específica del producto, en el ejemplo se 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;
}