Share via


Cómo administrar un catálogo extenso de productos desde la aplicación (HTML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente

Windows 8.1 y Windows Phone 8.1 presentan una nueva solución para las aplicaciones con catálogos de productos desde la aplicación que superan el límite de la Tienda Windows de 200 entradas de productos por cuenta de desarrollador. Esta solución permite crear infinidad de entradas de productos para determinadas franjas de precios, cada una de ellas capaz de representar cientos de productos en un catálogo.

Para hacer posible esta funcionalidad, se ha incluido una nueva sobrecarga del método RequestProductPurchaseAsync, que permite comprar una oferta definida por la aplicación asociada con un producto desde la aplicación 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 elaborar la lista de productos desde la aplicación de la Tienda.

Lo que debes saber

Tecnologías

Requisitos previos

  • En este tema se aborda el soporte técnico de la Tienda para la representación de varios productos desde la aplicación usando un solo listado de productos desde la aplicación en la Tienda. Si no estás familiarizado con los productos 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 producto desde la aplicación en la Tienda.

  • Este tema también hace referencia a los ejemplos de código proporcionados en la Aplicación de prueba y muestra de compra desde la aplicación disponible en la Galería de código de MSDN. Este ejemplo es ideal para conseguir experiencia práctica con las diferentes opciones de monetización proporcionadas para las aplicaciones de Windows en tiempo de ejecución.

  • Cuando codificas y pruebas nuevos productos 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 del servidor activo. Para lograrlo, también debes personalizar el archivo llamado "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 ejecutas tu aplicación o puedes cargar un archivo personalizado en tiempo de ejecución. Para obtener más información, consulta los documentos CurrentAppSimulator.

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.

function purchaseAndFulfillOfferAsProduct() {
    var offerId = "1234";
    var displayPropertiesName = "MusicOffer1";
    var displayProperties = new ProductPurchaseDisplayProperties(displayPropertiesName);

    currentApp.requestProductPurchaseAsync("product1", offerId, displayProperties).done(
        function (purchaseResults) {
            if (purchaseResults.status === ProductPurchaseStatus.succeeded) {
                grantFeatureLocally("product1", purchaseResults.transactionId);
                fulfillProduct1("product1", purchaseResults.transactionId, purchaseResults.offerId);
            } else if (purchaseResults.status === ProductPurchaseStatus.notFulfilled) {
                if (isNotLocallyFulfilled("product1", purchaseResults.transactionId)) {
                    grantFeatureLocally("product1", purchaseResults.transactionId);
                }
                fulfillProduct1("product1", purchaseResults.transactionId, purchaseResults.offerId);
            } else if (purchaseResults.status === ProductPurchaseStatus.notPurchased) {
                log("Product 1 was not purchased.", "sample", "status");
            }
        },
        function () {
            log("Unable to buy product 1.", "sample", "error");
        });
}

Notificar la cumplimentación del producto desde la aplicación

Tu aplicación deberá notificar a Windows en tiempo de ejecución de 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 ha mencionado 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 del producto, el ejemplo usa información del producto ListingInformation.

function fulfillProduct1(productId, transactionId, offerId) {
    var displayPropertiesName = document.getElementById("displayPropertiesName").value;
    if (displayPropertiesName === "") {
        displayPropertiesName = product1ListingName;
    }
    var offerIdMsg = " with offer id " + offerId;
    if (!offerId) {
        offerIdMsg = " with no offer id";
    }

    currentApp.reportConsumableFulfillmentAsync(productId, transactionId).done(
        function (result) {
            switch (result) {
                case FulfillmentResult.succeeded:
                    log("You bought and fulfilled " + displayPropertiesName  + offerIdMsg, "sample", "status");
                    break;
                case FulfillmentResult.nothingToFulfill:
                    log("There is no purchased product 1 to fulfill.", "sample", "status");
                    break;
                case FulfillmentResult.purchasePending:
                    log("You bought product 1. The purchase is pending so we cannot fulfill the product.", "sample", "status");
                    break;
                case FulfillmentResult.purchaseReverted:
                    log("You bought product 1. But your purchase has been reverted.", "sample", "status");
                    // 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.", "sample", "status");
                    break;
            }
        },
        function (error) {
            log("You bought Product 1. There was an error when attempting to fulfill.", "sample", "error");
        });
}

Temas relacionados

Aplicación de prueba y muestra de compra desde la aplicación

Habilitar compras de producto en la aplicación

Habilitar compras de productos consumibles desde la aplicación

Descripción de la aplicación

RequestProductPurchaseAsync

ProductPurchaseDisplayProperties