Gerenciar um catálogo abrangente de produtos no aplicativo
Se seu aplicativo oferece um grande catálogo de produtos no aplicativo, você pode, opcionalmente, 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 pode 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á 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, confira Compras e avaliações no aplicativo.
Para habilitar esse recurso, você criará um punhado de entradas de produto para faixas de preço específicas, com cada uma capaz de representar centenas de produtos em um catálogo. Use a sobrecarga do método RequestProductPurchaseAsync que especifica uma oferta definida pelo aplicativo associada a um produto no aplicativo listado na Loja. Além de especificar uma oferta e uma associação de produto durante a chamada, seu aplicativo também deve passar um objeto ProductPurchaseDisplayProperties que contém os detalhes da oferta de catálogo grande. Se esses detalhes não forem fornecidos, os detalhes do produto listado serão usados.
A Loja usará apenas o offerId da solicitação de compra no PurchaseResults resultante. Esse processo não modifica diretamente as informações originalmente fornecidas ao listar o produto no aplicativo na Loja.
Pré-requisitos
- Este tópico aborda 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 estiver familiarizado com compras no aplicativo, consulte Habilitar compras de produtos no aplicativo para saber mais sobre as informações de licença e como listar corretamente sua compra no aplicativo na Loja.
- Ao codificar e testar novas ofertas 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).
Fazer a solicitação de compra do produto no aplicativo
A solicitação de compra de um produto específico em um catálogo grande é tratada da mesma maneira que qualquer outra solicitação de compra em um aplicativo. Quando seu aplicativo chama a nova sobrecarga do método RequestProductPurchaseAsync , seu aplicativo fornece um objeto OfferId e um objeto ProductPurchaseDisplayProperties preenchido 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 cumprimento da oferta no aplicativo
Seu aplicativo precisará relatar o atendimento do produto à Loja assim que a oferta for atendida localmente. Em um cenário de catálogo grande, se seu aplicativo não relatar o cumprimento da oferta, o usuário não poderá comprar nenhuma oferta no aplicativo usando a mesma listagem de produtos da Loja.
Conforme mencionado anteriormente, a Loja usa apenas as informações de oferta fornecidas para preencher o PurchaseResults e não cria uma associação persistente entre uma oferta de catálogo grande e a listagem de produtos da Loja. Como resultado, você precisa acompanhar o direito do usuário para produtos e fornecer contexto específico do produto (como o nome do item que está sendo comprado ou detalhes sobre ele) para o usuário fora da operação RequestProductPurchaseAsync .
O código a seguir demonstra a chamada de atendimento e um padrão de mensagens de interface do usuário no qual as informações específicas da oferta são inseridas. Na ausência dessas informações específicas do produto, o exemplo usa 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;
}