Share via


Gerenciar um catálogo abrangente de produtos no aplicativo

Se o seu app oferecer um catálogo abrangente de produtos no aplicativo, você também poderá seguir o processo descrito neste tópico para ajudar a gerenciar seu catálogo. Em versões anteriores ao Windows 10, a Loja tem um limite de 200 listagens de produtos por conta de desenvolvedor, e o processo descrito neste tópico poderá ser usado para contornar essa limitação. A partir do Windows 10, a Loja não tem limite para o número de listagens de produtos por conta de desenvolvedor, e o processo descrito neste artigo não é mais necessário.

Importante

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

Para habilitar esse recurso, você criará algumas entradas de produtos para faixas de preços específicos, em que cada uma poderá representar centenas de produtos em um catálogo. Use a sobrecarga do método RequestProductPurchaseAsync que especifica a oferta definida em aplicativo associada a um produto no aplicativo listado na Loja. Além de especificar uma oferta e uma associação ao produto durante a chamada, seu aplicativo deve também passar um objeto ProductPurchaseDisplayProperties que contenha os detalhes da oferta de um catálogo abrangente. Se esses detalhes não forem fornecidos, os detalhes para o produto listado serão usados no lugar.

A Loja usará somente a offerId da solicitação de compra nos PurchaseResults resultantes. Esse processo não modifica diretamente as informações originalmente fornecidas ao listar o produto no aplicativo na Loja.

Pré-requisitos

  • Esse tópico abrange o suporte da Loja para a representação de várias ofertas no aplicativo usando um único produto no aplicativo listado na Loja. Se você não tiver familiaridade com compras no próprio aplicativo, revise Habilitar compras de produtos no aplicativo para saber mais sobre informações de licença e como listar adequadamente sua compra no próprio aplicativo na Windows Store.
  • Ao codificar e testar novas ofertas no aplicativo pela primeira vez, use o objeto CurrentAppSimulator em vez do objeto CurrentApp. Dessa forma, é possível verificar a lógica do licenciamento usando chamadas simuladas ao servidor de licenças, 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 app pela primeira vez, mas também é possível 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 os aplicativos UWP (Plataforma Universal do Windows).

Fazer a solicitação de compra para o produto no aplicativo

A solicitação de compra para um produto específico em um catálogo abrangente é efetuada da mesma maneira como qualquer outra solicitação de compra em um aplicativo. Quando o aplicativo chama a nova sobrecarga do método RequestProductPurchaseAsync, o aplicativo fornece OfferId e um objeto ProductPurchaseDisplayProperties populado com o nome do produto no aplicativo.

string offerId = "1234";
string displayPropertiesName = "MusicOffer1";
var displayProperties = new ProductPurchaseDisplayProperties(displayPropertiesName);

try
{
    PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync(
        "product1", offerId, displayProperties);
    switch (purchaseResults.Status)
    {
        case ProductPurchaseStatus.Succeeded:
            // 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:
            // 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;
        case ProductPurchaseStatus.NotPurchased:
            // Notify user that the purchase was not completed due to cancellation or error.
            break;
    }
}
catch (Exception)
{
    // Notify the user of the purchase error.
}

Relatar o atendimento da oferta no aplicativo

O aplicativo precisará relatar o atendimento do produto para a Loja quando a oferta tiver sido atendida localmente. Em um cenário de catálogo abrangente, se o aplicativo não relatar o atendimento da oferta, o usuário não poderá comprar qualquer oferta no aplicativo usando a mesma lista de produtos da Loja.

Como mencionado antes, a Loja usa apenas a informação da oferta fornecida para preencher os PurchaseResults, e não cria uma associação persistente entre uma oferta de catálogo abrangente e uma lista de produtos da Loja. Como resultado, você precisa rastrear os direitos do usuário para produtos, e fornecer um contexto específico do produto (como o nome do item comprado ou os detalhes sobre ele) para o usuário fora da operação RequestProductPurchaseAsync.

O seguinte código demonstra a chamada de atendimento, e um padrão de mensagem de IU onde a informação sobre a oferta específica é inserida. Na ausência dessas informações de produto específicas, o exemplo usará informações do produto ListingInformation.

string offerId = "1234";
product1ListingName = product1.Name;
string displayPropertiesName = "MusicOffer1";

if (String.IsNullOrEmpty(displayPropertiesName))
{
    displayPropertiesName = product1ListingName;
}
var offerIdMsg = " with offer id " + offerId;
if (String.IsNullOrEmpty(offerId))
{
    offerIdMsg = " with no offer id";
}

FulfillmentResult result = await CurrentAppSimulator.ReportConsumableFulfillmentAsync(productId, transactionId);
switch (result)
{
    case FulfillmentResult.Succeeded:
        Log("You bought and fulfilled " + displayPropertiesName + offerIdMsg);
        break;
    case FulfillmentResult.NothingToFulfill:
        Log("There is no purchased product 1 to fulfill.");
        break;
    case FulfillmentResult.PurchasePending:
        Log("You bought product 1. The purchase is pending so we cannot fulfill the product.");
        break;
    case FulfillmentResult.PurchaseReverted:
        Log("You bought product 1. But your purchase has been reverted.");
        // 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.");
        break;
}