Habilitar compras de produtos consumíveis no aplicativo

Ofereça produtos consumíveis no aplicativo (itens que podem ser comprados, usados e comprados novamente) por meio da plataforma de comércio da Store para fornecer aos seus clientes uma experiência de compra robusta e confiável. Isso é especialmente útil para coisas como moeda do jogo (ouro, moedas, etc.) que podem ser compradas e usadas para comprar power-ups específicos.

Importante

Este artigo demonstra como usar membros do namespace Windows.ApplicationModel.Store para habilitar compras de produtos consumíveis no aplicativo. Esse namespace não está mais sendo atualizado com novos recursos e recomendamos que você use o namespace Windows.Services.Store . O namespace Windows.Services.Store dá suporte aos tipos de complemento mais recentes, como complementos consumíveis gerenciados pela Loja e assinaturas, e foi projetado para ser compatível com tipos futuros de produtos e recursos compatíveis com o Partner Center e a Loja. O namespace Windows.Services.Store foi introduzido no Windows 10, versão 1607 e só pode ser usado em projetos direcionados ao Windows 10 Anniversary Edition (10.0; Build 14393) ou uma versão posterior no Visual Studio. Para obter mais informações sobre como habilitar compras de produtos consumíveis no aplicativo usando o namespace Windows.Services.Store , consulte este artigo.

Pré-requisitos

  • Este tópico aborda os relatórios de compra e processamento de produtos consumíveis no aplicativo. Se você não estiver familiarizado com produtos no aplicativo, consulte Habilitar compras de produtos no aplicativo para saber mais sobre as informações de licença e como listar corretamente os produtos no aplicativo na Loja.
  • Ao codificar e testar novos produtos no aplicativo pela primeira vez, você deve usar o objeto CurrentAppSimulator em vez do objeto CurrentApp . Dessa forma, você pode verificar sua lógica de licença usando chamadas simuladas para o servidor de licença em vez de chamar o servidor ativo. Para fazer isso, você precisa personalizar o arquivo chamado WindowsStoreProxy.xml em %userprofile%\AppData\local\packages\<package name>\LocalState\Microsoft\Windows Store\ApiData. O simulador do Microsoft Visual Studio cria esse arquivo quando você executa seu aplicativo pela primeira vez, ou você também pode carregar um arquivo personalizado em tempo de execução. Para obter mais informações, consulte Usando o arquivo WindowsStoreProxy.xml com CurrentAppSimulator.
  • Este tópico também faz referência a exemplos de código fornecidos no exemplo da Loja. Este exemplo é uma ótima maneira de obter experiência prática com as diferentes opções de monetização fornecidas para aplicativos da Plataforma Universal do Windows (UWP).

Passo 1: Fazendo a solicitação de compra

A solicitação de compra inicial é feita com RequestProductPurchaseAsync como qualquer outra compra feita por meio da Loja. A diferença para produtos consumíveis no aplicativo é que, após uma compra bem-sucedida, um cliente não pode comprar o mesmo produto novamente até que o aplicativo tenha notificado a Loja de que a compra anterior foi atendida com êxito. É responsabilidade do seu aplicativo atender aos consumíveis comprados e notificar a Loja sobre o atendimento.

O exemplo a seguir mostra uma solicitação de compra de produto consumível no aplicativo. Você observará comentários de código indicando quando seu aplicativo deve realizar o atendimento local do produto consumível no aplicativo para dois cenários diferentes: quando a solicitação é bem-sucedida e quando a solicitação não é bem-sucedida devido a uma compra não atendida desse mesmo produto.

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

Etapa 2: Rastreando o atendimento local do consumível

Ao conceder ao cliente acesso ao produto consumível no aplicativo, é importante acompanhar qual produto é processado (productId) e a qual transação esse processamento está associado (transactionId).

Importante

Seu aplicativo é responsável por relatar com precisão o atendimento à Loja. Esta etapa é essencial para manter uma experiência de compra justa e confiável para seus clientes.

O exemplo a seguir demonstra o uso das propriedades PurchaseResults da chamada RequestProductPurchaseAsync na etapa anterior para identificar o produto comprado para atendimento. Uma coleção é usada para armazenar as informações do produto em um local que pode ser referenciado posteriormente para confirmar que o processamento local foi bem-sucedido.

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

Este próximo exemplo mostra como usar a matriz do exemplo anterior para acessar pares de ID do produto/ID da transação que são usados posteriormente ao relatar o atendimento à Loja.

Importante

Seja qual for a metodologia que seu aplicativo usa para rastrear e confirmar o processamento, ele deve demonstrar a devida diligência para garantir que seus clientes não sejam cobrados por itens que não receberam.

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

Etapa 3: Relatar o atendimento do produto à Loja

Depois que o atendimento local for concluído, seu aplicativo deverá fazer uma chamada ReportConsumableFulfillmentAsync que inclua o productId e a transação na qual a compra do produto está incluída.

Importante

A falha em relatar produtos consumíveis no aplicativo atendidos à Loja fará com que o usuário não possa comprar esse produto novamente até que o processamento da compra anterior seja relatado.

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

Etapa 4: Identificando compras não atendidas

Seu aplicativo pode usar o método GetUnfulfilledConsumablesAsync para verificar se há produtos consumíveis no aplicativo não atendidos a qualquer momento. Esse método deve ser chamado regularmente para verificar se há consumíveis não atendidos que existem devido a eventos imprevistos do aplicativo, como uma interrupção na conectividade de rede ou encerramento do aplicativo.

O exemplo a seguir demonstra como GetUnfulfilledConsumablesAsync pode ser usado para enumerar consumíveis não atendidos e como seu aplicativo pode iterar por meio dessa lista para concluir o atendimento 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.
    }
}