Habilitar complementos de assinatura para o aplicativo
Seu aplicativo UWP (Plataforma Universal do Windows) pode oferecer compras no aplicativo de complementos de assinatura para seus clientes. Você pode usar assinaturas para vender produtos digitais em seu aplicativo (como recursos do aplicativo ou conteúdo digital) com períodos de cobrança recorrentes automatizados.
Observação
Para habilitar a compra de complementos de assinatura em seu aplicativo, seu projeto deve ter como destino o Windows 10 Anniversary Edition (10.0; Build 14393) ou uma versão posterior no Visual Studio (isso corresponde ao Windows 10, versão 1607) e deve usar as APIs no namespace Windows.Services.Store para implementar a experiência de compra no aplicativo em vez do namespace Windows.ApplicationModel.Store . Para obter mais informações sobre as diferenças entre esses namespaces, consulte Compras e avaliações no aplicativo.
Destaques do recurso
Os complementos de assinatura para aplicativos UWP dão suporte aos seguintes recursos:
- Você pode escolher entre períodos de assinatura de 1 mês, 3 meses, 6 meses, 1 ano ou 2 anos.
- Você pode adicionar períodos de teste gratuitos de 1 semana ou 1 mês à sua assinatura.
- O SDK do Windows fornece APIs que você pode usar em seu aplicativo para obter informações sobre complementos de assinatura disponíveis para o aplicativo e habilitar a compra de um complemento de assinatura. Também fornecemos APIs REST que você pode chamar de seus serviços para gerenciar assinaturas de um usuário.
- Você pode visualizar relatórios analíticos que fornecem o número de aquisições de assinaturas, assinantes ativos e assinaturas canceladas em um determinado período de tempo.
- Os clientes podem gerenciar sua assinatura na página de https://account.microsoft.com/services sua conta da Microsoft. Os clientes podem usar essa página para exibir todas as assinaturas adquiridas, cancelar uma assinatura e alterar a forma de pagamento associada à assinatura.
Etapas para habilitar um complemento de assinatura para seu aplicativo
Para habilitar a compra de complementos de assinatura em seu aplicativo, siga estas etapas.
Crie um envio de complemento para sua assinatura no Partner Center e publique o envio. Ao seguir o processo de envio do complemento, preste muita atenção às seguintes propriedades:
Tipo de produto: selecione Assinatura.
Período de assinatura: escolha o período de cobrança recorrente para sua assinatura. Você não pode alterar o período de assinatura depois de publicar seu complemento.
Cada complemento de assinatura dá suporte a um único período de assinatura e período de avaliação. Você deve criar um complemento de assinatura diferente para cada tipo de assinatura que deseja oferecer em seu aplicativo. Por exemplo, se você quisesse oferecer uma assinatura mensal sem avaliação, uma assinatura mensal com uma avaliação de um mês, uma assinatura anual sem avaliação e uma assinatura anual com uma avaliação de um mês, seria necessário criar quatro complementos de assinatura.
Período de avaliação: considere escolher um período de avaliação de 1 semana ou 1 mês para sua assinatura para permitir que os usuários experimentem o conteúdo da assinatura antes de comprá-lo. Você não pode alterar ou remover o período de avaliação depois de publicar seu complemento de assinatura.
Para adquirir uma avaliação gratuita de sua assinatura, o usuário deve comprá-la por meio do processo de compra padrão no aplicativo, incluindo uma forma de pagamento válida. Eles não são cobrados nenhum dinheiro durante o período de teste. No final do período de teste, a assinatura é convertida automaticamente na assinatura completa e o instrumento de pagamento do usuário será cobrado pelo primeiro período da assinatura paga. Se o usuário optar por cancelar sua assinatura durante o período de avaliação, a assinatura permanecerá ativa até o final do período de avaliação. Alguns períodos de teste não estão disponíveis para todos os períodos de assinatura.
Observação
Cada cliente pode adquirir uma avaliação gratuita de um complemento de assinatura apenas uma vez. Depois que um cliente adquire uma avaliação gratuita para uma assinatura, a Loja impede que o mesmo cliente adquira a mesma assinatura de avaliação gratuita novamente.
Visibilidade: se você estiver criando um complemento de teste que usará apenas para testar a experiência de compra no aplicativo para sua assinatura, recomendamos que você selecione uma das opções Oculto na Loja . Caso contrário, você pode selecionar a melhor opção de visibilidade para seu cenário.
Preço: escolha o preço da sua assinatura nesta seção. Você não pode aumentar o preço da assinatura depois de publicar o complemento. No entanto, você pode baixar o preço mais tarde.
Importante
Por padrão, quando você cria qualquer complemento, o preço é inicialmente definido como Gratuito. Como você não pode aumentar o preço de um complemento de assinatura depois de concluir o envio do complemento, certifique-se de escolher o preço da sua assinatura aqui.
Em seu aplicativo, use APIs no namespace Windows.Services.Store para determinar se o usuário atual já adquiriu seu complemento de assinatura e, em seguida, ofereça-o para venda ao usuário como uma compra no aplicativo. Consulte os exemplos de código neste artigo para obter mais detalhes.
Teste a implementação de compras no aplicativo de sua assinatura em seu aplicativo. Você precisará baixar seu aplicativo uma vez da Loja para seu dispositivo de desenvolvimento para usar sua licença para teste. Para obter mais informações, consulte nossas diretrizes de teste para compras no aplicativo.
Crie e publique um envio de aplicativo que inclua seu pacote de aplicativo atualizado, incluindo seu código testado. Para obter mais informações, consulte Envios de aplicativo.
Exemplos de código
Os exemplos de código nesta seção demonstram como usar as APIs no namespace Windows.Services.Store para obter informações sobre complementos de assinatura para o aplicativo atual e solicitar a compra de um complemento de assinatura em nome do usuário atual.
Esses exemplos têm os seguintes pré-requisitos:
- Um projeto do Visual Studio para um aplicativo da Plataforma Universal do Windows (UWP) direcionado ao Windows 10 Anniversary Edition (10.0; Build 14393) ou uma versão posterior.
- Você criou um envio de aplicativo no Partner Center e este aplicativo é publicado na Loja. Opcionalmente, você pode configurar o aplicativo para que ele não seja detectável na Store enquanto você o testa. Para obter mais informações, consulte as diretrizes de teste.
- Você criou um complemento de assinatura para o aplicativo no Partner Center.
O código nesses exemplos pressupõe:
- O arquivo de código tem instruções using para os namespaces Windows.Services.Store e System.Threading.Tasks.
- O app seja um app de usuário único executado somente no contexto do usuário que o iniciou. Para obter mais informações, confira Compras e avaliações no aplicativo.
Observação
Se você tiver um aplicativo da área de trabalho que usa a Ponte de Desktop, talvez seja necessário adicionar código adicional não mostrado nesses exemplos para configurar o objeto StoreContext. Para obter mais informações, confira Como usar a classe StoreContext em um aplicativo da área de trabalho que usa a Ponte de Desktop.
Comprar um complemento de assinatura
Este exemplo demonstra como solicitar a compra de um complemento de assinatura conhecido para seu aplicativo em nome do cliente atual. Este exemplo também mostra como lidar com o caso em que a assinatura tem um período de avaliação.
- O código primeiro determina se o cliente já tem uma licença ativa para a assinatura. Se o cliente já tiver uma licença ativa, seu código deverá desbloquear os recursos de assinatura conforme necessário (como isso é proprietário do seu aplicativo, isso é identificado com um comentário no exemplo).
- Em seguida, o código obtém o objeto StoreProduct que representa a assinatura que você deseja comprar em nome do cliente. O código pressupõe que você já sabe a ID da Loja do complemento de assinatura que deseja comprar e que atribuiu esse valor à variável subscriptionStoreId .
- O código determina se uma avaliação está disponível para a assinatura. Opcionalmente, seu aplicativo pode usar essas informações para exibir detalhes sobre a avaliação disponível ou a assinatura completa para o cliente.
- Por fim, o código chama o método RequestPurchaseAsync para solicitar a compra da assinatura. Se uma avaliação estiver disponível para a assinatura, a avaliação será oferecida ao cliente para compra. Caso contrário, a assinatura completa será oferecida para 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;
}
}
Obter informações sobre complementos de assinatura para o aplicativo atual
Este exemplo de código demonstra como obter informações para todos os complementos de assinatura disponíveis em seu aplicativo. Para obter essas informações, primeiro use o método GetAssociatedStoreProductsAsync para obter a coleção de objetos StoreProduct que representam cada um dos complementos disponíveis para o aplicativo. Em seguida, obtenha o StoreSku para cada produto e use as propriedades IsSubscription e SubscriptionInfo para acessar as informações de assinatura.
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;
}
}
}
}
Gerenciar assinaturas de seus serviços
Depois que seu aplicativo atualizado estiver na Loja e os clientes puderem comprar seu complemento de assinatura, você poderá ter cenários em que precisará gerenciar a assinatura de um cliente. Fornecemos APIs REST que você pode chamar de seus serviços para executar as seguintes tarefas de gerenciamento de assinatura:
Obtenha as assinaturas que um usuário tem o direito de usar. Se sua assinatura fizer parte de um serviço multiplataforma, você poderá chamar essa API para determinar se o usuário especificado tem direito à sua assinatura e o status de sua assinatura no contexto do seu aplicativo UWP. Em seguida, você pode usar essas informações para atualizar o status da assinatura em outras plataformas compatíveis com seu serviço.
Altere o estado de cobrança de uma assinatura para um determinado usuário. Use essa API para cancelar, estender ou desabilitar a renovação automática de uma assinatura.
Cancelamento
Os clientes podem usar a https://account.microsoft.com/services página de sua conta da Microsoft para exibir todas as assinaturas adquiridas, cancelar uma assinatura e alterar a forma de pagamento associada à assinatura. Quando um cliente cancela uma assinatura usando esta página, ele continua a ter acesso à assinatura durante o período de cobrança atual. Eles não recebem reembolso por nenhuma parte do período de cobrança atual. No final do período de cobrança atual, sua assinatura é desativada.
Você também pode cancelar uma assinatura em nome de um usuário usando nossa API REST para alterar o estado de cobrança de uma assinatura para um determinado usuário.
Renovações de assinatura e períodos de carência
Em algum momento durante cada período de cobrança, tentaremos cobrar o cartão de crédito do cliente para o próximo período de cobrança. Se o encargo falhar, a assinatura do cliente entrará no estado de cobrança. Isso significa que a assinatura ainda está ativa pelo restante do período de cobrança atual, mas tentaremos cobrar periodicamente o cartão de crédito para renovar automaticamente a assinatura. Esse estado pode durar até duas semanas, até o final do período de faturamento atual e a data de renovação para o próximo período de faturamento.
Não oferecemos períodos de carência para cobrança de assinatura. Se não conseguirmos cobrar com sucesso o cartão de crédito do cliente até o final do período de cobrança atual, a assinatura será cancelada e o cliente não terá mais acesso à assinatura após o período de cobrança atual.
Cenários sem suporte
No momento, não há suporte para os cenários a seguir para complementos de assinatura.
- No momento, não há suporte para a venda de assinaturas para clientes diretamente por meio da Loja. As assinaturas estão disponíveis apenas para compras no aplicativo de produtos digitais.
- Os clientes não podem alternar os períodos de assinatura usando a página de https://account.microsoft.com/services sua conta da Microsoft. Para mudar para um período de assinatura diferente, os clientes devem cancelar a assinatura atual e, em seguida, comprar uma assinatura com um período de assinatura diferente do seu aplicativo.
- No momento, não há suporte para a alternância de camada para complementos de assinatura (por exemplo, alternar um cliente de uma assinatura básica para uma assinatura premium com mais recursos).
- No momento, não há suporte para códigos promocionais e de vendas para complementos de assinatura.
- Renovar assinaturas existentes depois de definir a visibilidade do complemento de assinatura como Interromper aquisição. Consulte Definir preços e disponibilidade de complementos para obter mais detalhes.