Compartilhar via


Como gerenciar um catálogo abrangente de produtos no aplicativo (HTML)

[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente]

O Windows 8.1 e o Windows Phone 8.1 apresentam uma nova solução para aplicativos que oferecem catálogos de produtos no aplicativo, que vai além da limitação da Loja de 200 listas de produtos por conta de desenvolvedor. Essa solução permite que você crie apenas um grupo de entradas de produtos para faixas de preços específicos, em que cada uma pode representar centenas de produtos em um catálogo.

Para habilitar essa funcionalidade, uma nova sobrecarga do método RequestProductPurchaseAsync foi introduzida para aquisição de uma oferta definida no aplicativo associada ao produto no aplicativo listado na Store. 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 Store 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 Store.

O que você precisa saber

Tecnologias

Pré-requisitos

  • Esse tópico abrange o suporte da Loja para a representação de vários produtos no aplicativo usando uma única listagem de produtos no aplicativo na Loja. Se você não tiver familiaridade com produtos no aplicativo, examine Habilitar compras de produto no aplicativo para saber mais sobre informações de licença e como listar adequadamente seu produto no aplicativo na Loja.

  • Este tópico também faz referência a exemplos de código fornecidos no Exemplo de aplicativo de avaliação e de compra no aplicativo, disponível na Galeria de Códigos do MSDN. Este exemplo é uma ótima maneira de obter experiência prática com as diferentes opções de monetização fornecidas para os aplicativos do Tempo de Execução do Windows.

  • Ao codificar e testar novos produtos 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 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, mas também é possível carregar um arquivo personalizado no tempo de execução. Para saber mais, consulte a documentação do CurrentAppSimulator.

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 preenchido com o nome do produto no aplicativo.

function purchaseAndFulfillOfferAsProduct() {
    var offerId = "1234";
    var displayPropertiesName = "MusicOffer1";
    var displayProperties = new ProductPurchaseDisplayProperties(displayPropertiesName);

    currentApp.requestProductPurchaseAsync("product1", offerId, displayProperties).done(
        function (purchaseResults) {
            if (purchaseResults.status === ProductPurchaseStatus.succeeded) {
                grantFeatureLocally("product1", purchaseResults.transactionId);
                fulfillProduct1("product1", purchaseResults.transactionId, purchaseResults.offerId);
            } else if (purchaseResults.status === ProductPurchaseStatus.notFulfilled) {
                if (isNotLocallyFulfilled("product1", purchaseResults.transactionId)) {
                    grantFeatureLocally("product1", purchaseResults.transactionId);
                }
                fulfillProduct1("product1", purchaseResults.transactionId, purchaseResults.offerId);
            } else if (purchaseResults.status === ProductPurchaseStatus.notPurchased) {
                log("Product 1 was not purchased.", "sample", "status");
            }
        },
        function () {
            log("Unable to buy product 1.", "sample", "error");
        });
}

Relatar o atendimento do produto 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.

function fulfillProduct1(productId, transactionId, offerId) {
    var displayPropertiesName = document.getElementById("displayPropertiesName").value;
    if (displayPropertiesName === "") {
        displayPropertiesName = product1ListingName;
    }
    var offerIdMsg = " with offer id " + offerId;
    if (!offerId) {
        offerIdMsg = " with no offer id";
    }

    currentApp.reportConsumableFulfillmentAsync(productId, transactionId).done(
        function (result) {
            switch (result) {
                case FulfillmentResult.succeeded:
                    log("You bought and fulfilled " + displayPropertiesName  + offerIdMsg, "sample", "status");
                    break;
                case FulfillmentResult.nothingToFulfill:
                    log("There is no purchased product 1 to fulfill.", "sample", "status");
                    break;
                case FulfillmentResult.purchasePending:
                    log("You bought product 1. The purchase is pending so we cannot fulfill the product.", "sample", "status");
                    break;
                case FulfillmentResult.purchaseReverted:
                    log("You bought product 1. But your purchase has been reverted.", "sample", "status");
                    // 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.", "sample", "status");
                    break;
            }
        },
        function (error) {
            log("You bought Product 1. There was an error when attempting to fulfill.", "sample", "error");
        });
}

Tópicos relacionados

Aplicativo de avaliação e exemplo de compra no aplicativo

Habilitar compras de produto no aplicativo

Habilitar compras de produto no aplicativo consumível

Descrição do aplicativo

RequestProductPurchaseAsync

ProductPurchaseDisplayProperties