Compartir a través de


Habilitación de compras de productos consumibles en la aplicación

Ofrecer productos consumibles desde la aplicación (artículos que se pueden comprar, usar y comprar de nuevo) a través de la plataforma comercial store para proporcionar a los clientes una experiencia de compra sólida y confiable. Esto es especialmente útil para cosas como la moneda en el juego (oro, monedas, etcetera.) que se pueden comprar y luego usar para comprar potenciaciones específicas.

Importante

En este artículo se muestra cómo usar miembros del espacio de nombres Windows.ApplicationModel.Store para habilitar las compras de productos consumibles desde la aplicación. 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 sobre cómo habilitar las compras de productos consumibles desde la aplicación mediante el espacio de nombres Windows.Services.Store , consulte este artículo.

Requisitos previos

  • En este tema se tratan los informes de compra y cumplimiento de productos consumibles en la aplicación. Si no está familiarizado con los productos 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 los productos desde la aplicación en la Tienda.
  • Al codificar y probar nuevos productos 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).

Paso 1: Realizar la solicitud de compra

La solicitud de compra inicial se realiza con RequestProductPurchaseAsync como cualquier otra compra realizada a través de la Tienda. La diferencia para los productos consumibles desde la aplicación es que después de una compra correcta, un cliente no puede volver a comprar el mismo producto hasta que la aplicación haya notificado a la Tienda que la compra anterior se ha completado correctamente. Es responsabilidad de la aplicación cumplir los consumibles comprados y notificar a la Tienda el cumplimiento.

En el ejemplo siguiente se muestra una solicitud de compra de productos consumible desde la aplicación. Observará comentarios de código que indican cuándo la aplicación debe llevar a cabo su cumplimiento local del producto consumible en la aplicación para dos escenarios diferentes, cuando la solicitud se realiza correctamente y cuando la solicitud no se realiza correctamente debido a una compra no completa de ese mismo producto.

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;
}

Paso 2: Seguimiento del cumplimiento local del consumible

Al conceder al cliente acceso al producto consumible desde la aplicación, es importante realizar un seguimiento de qué producto se cumple (productId) y qué transacción está asociada a (transactionId).

Importante

La aplicación es responsable de informar con precisión del cumplimiento de la Tienda. Este paso es esencial para mantener una experiencia de compra justa y confiable para sus clientes.

En el ejemplo siguiente se muestra el uso de las propiedades PurchaseResults de la llamada RequestProductPurchaseAsync en el paso anterior para identificar el producto comprado para su suministro. Una colección se usa para almacenar la información del producto en una ubicación a la que se puede hacer referencia posteriormente para confirmar que el suministro local se realizó correctamente.

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.
}

En este ejemplo siguiente se muestra cómo usar la matriz del ejemplo anterior para acceder a los pares id. de producto o identificador de transacción que se usan más adelante al notificar el suministro a store.

Importante

Independientemente de la metodología que use la aplicación para realizar un seguimiento y confirmar el cumplimiento, la aplicación debe demostrar la diligencia debida para asegurarse de que los clientes no se cobran por los elementos que no han recibido.

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

Paso 3: Notificar el suministro de productos a la Tienda

Una vez completado el suministro local, la aplicación debe realizar una llamada ReportConsumableFulfillmentAsync que incluya productId y la transacción en la que se incluye la compra del producto.

Importante

Si no se informa de los productos consumibles consumibles cumplidos en la Tienda, el usuario no podrá volver a comprar ese producto hasta que se notifique el cumplimiento de la compra anterior.

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

Paso 4: Identificación de compras no rellenadas

La aplicación puede usar el método GetUnfulfilledConsumablesAsync para comprobar si hay productos consumibles no rellenados en la aplicación en cualquier momento. Se debe llamar a este método periódicamente para comprobar si hay consumibles no rellenados que existen debido a eventos de aplicación imprevistos, como una interrupción en la conectividad de red o la terminación de la aplicación.

En el ejemplo siguiente se muestra cómo se puede usar GetUnfulfilledConsumablesAsync para enumerar consumibles no rellenados y cómo la aplicación puede recorrer en iteración esta lista para completar el suministro local.

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.
    }
}