Habilitar complementos de una suscripción para la aplicación

Tu aplicación de Plataforma universal de Windows (UWP) puede ofrecer compras desde la aplicación de complementos de suscripción a tus clientes. Puedes usar suscripciones para vender productos digitales en tu aplicación (como características de la aplicación o contenido digital) con períodos de facturación periódicos automatizados.

Nota:

Para habilitar la compra de complementos de suscripción en la aplicación, el proyecto debe tener como destino Windows 10 Anniversary Edition (10.0; Compilación 14393) o una versión posterior en Visual Studio (esto corresponde a Windows 10, versión 1607) y debe usar las API del espacio de nombres Windows.Services.Store para implementar la experiencia de compra desde la aplicación en lugar del espacio de nombres Windows.ApplicationModel.Store . Para obtener más información sobre las diferencias entre estos espacios de nombres, consulte Compras desde la aplicación y pruebas.

Características destacadas

Los complementos de suscripción para aplicaciones para UWP admiten las siguientes características:

  • Puede elegir entre períodos de suscripción de 1 mes, 3 meses, 6 meses, 1 año o 2 años.
  • Puede agregar períodos de evaluación gratuitos de 1 semana o 1 mes a la suscripción.
  • Windows SDK proporciona API que puedes usar en tu aplicación para obtener información sobre los complementos de suscripción disponibles para la aplicación y habilitar la compra de un complemento de suscripción. También proporcionamos API REST a las que puede llamar desde los servicios para administrar las suscripciones de un usuario.
  • Puede ver informes analíticos que proporcionan el número de adquisiciones de suscripciones, suscriptores activos y suscripciones canceladas en un período de tiempo determinado.
  • Los clientes pueden administrar su suscripción en la https://account.microsoft.com/services página de su cuenta Microsoft. Los clientes pueden usar esta página para ver todas las suscripciones que han adquirido, cancelar una suscripción y cambiar la forma de pago asociada a su suscripción.

Pasos para habilitar un complemento de suscripción para la aplicación

Para habilitar la compra de complementos de suscripción en la aplicación, siga estos pasos.

  1. Crea un envío de complemento para tu suscripción en el Centro de partners y publica el envío. A medida que siga el proceso de envío del complemento, preste mucha atención a las siguientes propiedades:

    • Tipo de producto: asegúrese de seleccionar Suscripción.

    • Período de suscripción: elija el período de facturación periódico de la suscripción. No puede cambiar el período de suscripción después de publicar el complemento.

      Cada complemento de suscripción admite un único período de suscripción y un período de prueba. Debe crear un complemento de suscripción diferente para cada tipo de suscripción que quiera ofrecer en la aplicación. Por ejemplo, si desea ofrecer una suscripción mensual sin evaluación, una suscripción mensual con una prueba de un mes, una suscripción anual sin evaluación y una suscripción anual con una prueba de un mes, tendría que crear cuatro complementos de suscripción.

    • Período de prueba: considere la posibilidad de elegir un período de prueba de 1 semana o 1 mes para su suscripción para permitir que los usuarios prueben el contenido de la suscripción antes de comprarlo. No puede cambiar ni quitar el período de prueba después de publicar el complemento de suscripción.

      Para adquirir una evaluación gratuita de la suscripción, un usuario debe comprar la suscripción a través del proceso de compra estándar desde la aplicación, incluida una forma de pago válida. No se les cobra ningún dinero durante el período de prueba. Al final del período de prueba, la suscripción se convierte automáticamente en la suscripción completa y el instrumento de pago del usuario se cobrará durante el primer período de la suscripción de pago. Si el usuario decide cancelar su suscripción durante el período de prueba, la suscripción permanece activa hasta el final del período de prueba. Algunos períodos de prueba no están disponibles para todos los períodos de suscripción.

      Nota

      Cada cliente puede adquirir una evaluación gratuita para un complemento de suscripción solo una vez. Después de que un cliente adquiera una evaluación gratuita para una suscripción, la Tienda impide que el mismo cliente vuelva a adquirir la misma suscripción de evaluación gratuita.

    • Visibilidad: si vas a crear un complemento de prueba que solo usarás para probar la experiencia de compra desde la aplicación para tu suscripción, te recomendamos que selecciones una de las opciones Ocultas en la Tienda . De lo contrario, puede seleccionar la mejor opción de visibilidad para su escenario.

    • Precios: elija el precio de la suscripción en esta sección. No puede aumentar el precio de la suscripción después de publicar el complemento. Sin embargo, puede reducir el precio más adelante.

      Importante

      De forma predeterminada, al crear cualquier complemento, el precio se establece inicialmente en Gratis. Dado que no puede aumentar el precio de un complemento de suscripción después de completar el envío del complemento, asegúrese de elegir el precio de la suscripción aquí.

  2. En la aplicación, use las API del espacio de nombres Windows.Services.Store para determinar si el usuario actual ya ha adquirido el complemento de suscripción y, a continuación, ofrecerlo para la venta al usuario como una compra desde la aplicación. Consulte los ejemplos de código de este artículo para obtener más detalles.

  3. Pruebe la implementación de compra desde la aplicación de la suscripción en la aplicación. Tendrás que descargar la aplicación una vez desde la Tienda al dispositivo de desarrollo para usar su licencia para las pruebas. Para obtener más información, consulta nuestra guía de pruebas para las compras desde la aplicación.

  4. Cree y publique un envío de aplicación que incluya el paquete de aplicación actualizado, incluido el código probado. Para obtener más información, consulta Envíos de aplicaciones.

Ejemplos de código

Los ejemplos de código de esta sección muestran cómo usar las API en el espacio de nombres Windows.Services.Store para obtener información sobre los complementos de suscripción para la aplicación actual y solicitar la compra de un complemento de suscripción en nombre del usuario actual.

Estos ejemplos cumplen los siguientes requisitos:

En el código de estos ejemplos se da por supuesto:

  • El archivo de código tiene instrucciones using para los espacios de nombres System.Threading.Tasks y Windows.Services.Store.
  • La aplicación es una de usuario único que se ejecuta solamente en el contexto del usuario que la inició. Para obtener más información, consulta Pruebas y compras desde la aplicación.

Nota

Si tienes una aplicación de escritorio que usa el Puente de dispositivo de escritorio, es posible que tengas que agregar código adicional que no se muestra en estos ejemplos para configurar el objeto StoreContext. Para obtener más información, consulta Uso de la clase StoreContext en una aplicación de escritorio que usa el Puente de escritorio.

Compra de un complemento de suscripción

En este ejemplo se muestra cómo solicitar la compra de un complemento de suscripción conocido para la aplicación en nombre del cliente actual. En este ejemplo también se muestra cómo controlar el caso en el que la suscripción tiene un período de prueba.

  1. El código determina primero si el cliente ya tiene una licencia activa para la suscripción. Si el cliente ya tiene una licencia activa, el código debe desbloquear las características de suscripción según sea necesario (ya que esto es propietario de la aplicación, esto se identifica con un comentario en el ejemplo).
  2. A continuación, el código obtiene el objeto StoreProduct que representa la suscripción que desea comprar en nombre del cliente. El código supone que ya conoces el identificador de la Tienda del complemento de suscripción que quieres comprar y que has asignado este valor a la variable subscriptionStoreId .
  3. A continuación, el código determina si hay una versión de prueba disponible para la suscripción. Opcionalmente, la aplicación puede usar esta información para mostrar detalles sobre la versión de prueba disponible o la suscripción completa al cliente.
  4. Por último, el código llama al método RequestPurchaseAsync para solicitar la compra de la suscripción. Si hay una versión de prueba disponible para la suscripción, la evaluación se ofrecerá al cliente para su compra. De lo contrario, se ofrecerá la suscripción completa para su compra.
private StoreContext context = null;
StoreProduct subscriptionStoreProduct;

// Assign this variable to the Store ID of your subscription add-on.
private string subscriptionStoreId = "";  

// This is the entry point method for the example.
public async Task SetupSubscriptionInfoAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    bool userOwnsSubscription = await CheckIfUserHasSubscriptionAsync();
    if (userOwnsSubscription)
    {
        // Unlock all the subscription add-on features here.
        return;
    }

    // Get the StoreProduct that represents the subscription add-on.
    subscriptionStoreProduct = await GetSubscriptionProductAsync();
    if (subscriptionStoreProduct == null)
    {
        return;
    }

    // Check if the first SKU is a trial and notify the customer that a trial is available.
    // If a trial is available, the Skus array will always have 2 purchasable SKUs and the
    // first one is the trial. Otherwise, this array will only have one SKU.
    StoreSku sku = subscriptionStoreProduct.Skus[0];
    if (sku.SubscriptionInfo.HasTrialPeriod)
    {
        // You can display the subscription trial info to the customer here. You can use 
        // sku.SubscriptionInfo.TrialPeriod and sku.SubscriptionInfo.TrialPeriodUnit 
        // to get the trial details.
    }
    else
    {
        // You can display the subscription purchase info to the customer here. You can use 
        // sku.SubscriptionInfo.BillingPeriod and sku.SubscriptionInfo.BillingPeriodUnit
        // to provide the renewal details.
    }

    // Prompt the customer to purchase the subscription.
    await PromptUserToPurchaseAsync();
}

private async Task<bool> CheckIfUserHasSubscriptionAsync()
{
    StoreAppLicense appLicense = await context.GetAppLicenseAsync();

    // Check if the customer has the rights to the subscription.
    foreach (var addOnLicense in appLicense.AddOnLicenses)
    {
        StoreLicense license = addOnLicense.Value;
        if (license.SkuStoreId.StartsWith(subscriptionStoreId))
        {
            if (license.IsActive)
            {
                // The expiration date is available in the license.ExpirationDate property.
                return true;
            }
        }
    }

    // The customer does not have a license to the subscription.
    return false;
}

private async Task<StoreProduct> GetSubscriptionProductAsync()
{
    // Load the sellable add-ons for this app and check if the trial is still 
    // available for this customer. If they previously acquired a trial they won't 
    // be able to get a trial again, and the StoreProduct.Skus property will 
    // only contain one SKU.
    StoreProductQueryResult result =
        await context.GetAssociatedStoreProductsAsync(new string[] { "Durable" });

    if (result.ExtendedError != null)
    {
        System.Diagnostics.Debug.WriteLine("Something went wrong while getting the add-ons. " +
            "ExtendedError:" + result.ExtendedError);
        return null;
    }

    // Look for the product that represents the subscription.
    foreach (var item in result.Products)
    {
        StoreProduct product = item.Value;
        if (product.StoreId == subscriptionStoreId)
        {
            return product;
        }
    }

    System.Diagnostics.Debug.WriteLine("The subscription was not found.");
    return null;
}

private async Task PromptUserToPurchaseAsync()
{
    // Request a purchase of the subscription product. If a trial is available it will be offered 
    // to the customer. Otherwise, the non-trial SKU will be offered.
    StorePurchaseResult result = await subscriptionStoreProduct.RequestPurchaseAsync();

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

    switch (result.Status)
    {
        case StorePurchaseStatus.Succeeded:
            // Show a UI to acknowledge that the customer has purchased your subscription 
            // and unlock the features of the subscription. 
            break;

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

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

        case StorePurchaseStatus.AlreadyPurchased:
            System.Diagnostics.Debug.WriteLine("The customer already owns this subscription." +
                    "ExtendedError: " + extendedError);
            break;
    }
}

Obtener información sobre los complementos de suscripción para la aplicación actual

En este ejemplo de código se muestra cómo obtener información de todos los complementos de suscripción que están disponibles en la aplicación. Para obtener esta información, use primero el método GetAssociatedStoreProductsAsync para obtener la colección de objetos StoreProduct que representan cada uno de los complementos disponibles para la aplicación. A continuación, obtenga storeSku para cada producto y use las propiedades IsSubscription y SubscriptionInfo para acceder a la información de suscripción.

private StoreContext context = null;

public async Task GetSubscriptionsInfo()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    // Subscription add-ons are Durable products.
    string[] productKinds = { "Durable" };
    List<String> filterList = new List<string>(productKinds);

    StoreProductQueryResult queryResult =
        await context.GetAssociatedStoreProductsAsync(productKinds);

    if (queryResult.ExtendedError != null)
    {
        // The user may be offline or there might be some other server failure.
        System.Diagnostics.Debug.WriteLine($"ExtendedError: {queryResult.ExtendedError.Message}");
        return;
    }

    foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
    {
        // Access the Store product info for the add-on.
        StoreProduct product = item.Value;

        // For each add-on, the subscription info is available in the SKU objects in the add-on. 
        foreach (StoreSku sku in product.Skus)
        {
            if (sku.IsSubscription)
            {
                // Use the sku.SubscriptionInfo property to get info about the subscription. 
                // For example, the following code gets the units and duration of the 
                // subscription billing period.
                StoreDurationUnit billingPeriodUnit = sku.SubscriptionInfo.BillingPeriodUnit;
                uint billingPeriod = sku.SubscriptionInfo.BillingPeriod;
            }
        }
    }
}

Administración de suscripciones desde los servicios

Después de que la aplicación actualizada esté en la Tienda y los clientes puedan comprar el complemento de suscripción, es posible que tengas escenarios en los que necesites administrar la suscripción de un cliente. Proporcionamos API REST a las que puede llamar desde los servicios para realizar las siguientes tareas de administración de suscripciones:

Cancelaciones

Los clientes pueden usar la https://account.microsoft.com/services página de su cuenta Microsoft para ver todas las suscripciones que han adquirido, cancelar una suscripción y cambiar la forma de pago asociada a su suscripción. Cuando un cliente cancela una suscripción mediante esta página, continúa teniendo acceso a la suscripción durante el período de facturación actual. No reciben un reembolso por ninguna parte del período de facturación actual. Al final del período de facturación actual, se desactiva su suscripción.

También puede cancelar una suscripción en nombre de un usuario mediante nuestra API REST para cambiar el estado de facturación de una suscripción para un usuario determinado.

Renovaciones de suscripciones y períodos de gracia

En algún momento durante cada período de facturación, intentaremos cargar la tarjeta de crédito del cliente durante el siguiente período de facturación. Si se produce un error en el cargo, la suscripción del cliente entra en el estado de discretización . Esto significa que su suscripción sigue activa durante el resto del período de facturación actual, pero intentaremos cargar periódicamente su tarjeta de crédito para renovar automáticamente la suscripción. Este estado puede durar hasta dos semanas, hasta el final del período de facturación actual y la fecha de renovación del siguiente período de facturación.

No ofrecemos períodos de gracia para la facturación de la suscripción. Si no se puede cargar correctamente la tarjeta de crédito del cliente al final del período de facturación actual, se cancelará la suscripción y el cliente dejará de tener acceso a la suscripción después del período de facturación actual.

Escenarios no admitidos

Actualmente no se admiten los siguientes escenarios para los complementos de suscripción.

  • En este momento no se admite la venta de suscripciones a los clientes directamente a través de la Tienda. Las suscripciones solo están disponibles para las compras desde la aplicación de productos digitales.
  • Los clientes no pueden cambiar los períodos de suscripción mediante la https://account.microsoft.com/services página de su cuenta Microsoft. Para cambiar a un período de suscripción diferente, los clientes deben cancelar su suscripción actual y, a continuación, comprar una suscripción con un período de suscripción diferente de la aplicación.
  • Actualmente, no se admite el cambio de nivel para complementos de suscripción (por ejemplo, cambiar un cliente de una suscripción básica a una suscripción Premium con más características).
  • Actualmente no se admiten códigos promocionales y de ventas para complementos de suscripción.
  • Renovar las suscripciones existentes después de establecer la visibilidad del complemento de suscripción en Detener la adquisición. Consulte Establecimiento de precios y disponibilidad de complementos para obtener más detalles.