Condividi tramite


Gestire un ampio catalogo di prodotti in-app

Se l'app offre un catalogo di prodotti in-app di grandi dimensioni, è possibile seguire facoltativamente il processo descritto in questo argomento per facilitare la gestione del catalogo. Nelle versioni precedenti a Windows 10, lo Store ha un limite di 200 presentazioni di prodotti per account sviluppatore e il processo descritto in questo argomento può essere usato per aggirare tale limitazione. A partire da Windows 10, lo Store non ha limiti al numero di presentazioni di prodotti per account sviluppatore e il processo descritto in questo articolo non è più necessario.

Importante

Questo articolo illustra come usare i membri dello spazio dei nomi Windows.ApplicationModel.Store. Questo spazio dei nomi non viene più aggiornato con nuove funzionalità ed è consigliabile usare invece lo spazio dei nomi Windows.Services.Store. Lo spazio dei nomi Windows.Services.Store supporta i tipi di componenti aggiuntivi più recenti, ad esempio componenti aggiuntivi e sottoscrizioni di consumo gestiti dallo Store, ed è progettato per essere compatibile con i tipi futuri di prodotti e funzionalità supportati dal Centro per i partner e dallo Store. Lo spazio dei nomi Windows.Services.Store è stato introdotto in Windows 10, versione 1607, e può essere usato solo nei progetti con destinazione Windows 10 Anniversary Edition (10.0; Build 14393) o versioni successive in Visual Studio. Per ulteriori informazioni, vedere Acquisti in-app e Versioni di prova.

Per abilitare questa funzionalità, si creeranno alcune voci di prodotto per livelli di prezzo specifici, ognuno dei quali può rappresentare centinaia di prodotti all'interno di un catalogo. Usare l'overload del metodo RequestProductPurchaseAsync che specifica un'offerta definita dall'app associata a un prodotto in-app elencato nello Store. Oltre a specificare un'offerta e un'associazione di prodotti durante la chiamata, l'app deve anche passare un oggetto ProductPurchaseDisplayProperties contenente i dettagli dell'offerta del grande catalogo. Se questi dettagli non vengono forniti, verranno invece utilizzati i dettagli per il prodotto elencato.

Lo Store userà solo il offerId dalla richiesta di acquisto nella risultante PurchaseResults. Questo processo non modifica direttamente le informazioni fornite in origine quando presentazione del prodotto in-app nello Store.

Prerequisiti

  • Questo argomento illustra il supporto dello Store per la rappresentazione di più offerte in-app usando un singolo prodotto in-app elencato nello Store. Se non si ha familiarità con gli acquisti in-app, vedere Abilitare gli acquisti di prodotti in-app per informazioni sulle licenze e come elencare correttamente l'acquisto in-app nello Store.
  • Quando si codificano e si testano le nuove offerte in-app per la prima volta, è necessario usare l'oggetto CurrentAppSimulator anziché l'oggetto CurrentApp. In questo modo è possibile verificare la logica di licenza usando chiamate simulate al server licenze anziché chiamare il server live. A tale scopo, è necessario personalizzare il file denominato WindowsStoreProxy.xml in %userprofile%\AppData\local\packages\<nome del pacchetto>\LocalState\Microsoft\Windows Store\ApiData. Il simulatore di Microsoft Visual Studio crea questo file quando esegui l'app per la prima volta oppure puoi caricarne uno personalizzato in fase di esecuzione. Per altre info, vedi Uso del file di WindowsStoreProxy.xml con CurrentAppSimulator.
  • Questo argomento fa riferimento anche agli esempi di codice forniti nell'esempio di Store. Questo esempio è un ottimo modo per acquisire esperienza pratica con le diverse opzioni di monetizzazione disponibili per le app UWP (Universal Windows Platform).

Effettuare la richiesta di acquisto per il prodotto in-app

La richiesta di acquisto per un prodotto specifico all'interno di un catalogo di grandi dimensioni viene gestita in modo analogo a qualsiasi altra richiesta di acquisto all'interno di un'app. Quando l'app chiama il nuovo overload del metodo RequestProductPurchaseAsync, l'app fornisce sia un OfferId che un oggetto ProductPurchaseDisplayProperties popolato con il nome del prodotto in-app.

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

Segnalare il completamento dell'offerta in-app

L'app dovrà segnalare l'evasione dell'ordine allo Store non appena l'offerta sia stata soddisfatta localmente. In uno scenario di catalogo di grandi dimensioni, se l'app non segnala l'evasione dell'offerta, l'utente non sarà in grado di acquistare offerte in-app usando la stessa presentazione del prodotto nello Store.

Come accennato in precedenza, lo Store usa solo le informazioni sull'offerta fornite per popolare l'PurchaseResultse non crea un'associazione permanente tra un'offerta di catalogo di grandi dimensioni e la presentazione dei prodotti nello Store. Di conseguenza, è necessario tenere traccia del diritto utente per i prodotti e fornire un contesto specifico del prodotto (ad esempio il nome dell'articolo acquistato o i relativi dettagli) all'utente all'esterno dell'operazione di RequestProductPurchaseAsync.

Il codice seguente illustra la chiamata di completamento e un pattern di messaggistica UI in cui vengono inserite le informazioni specifiche dell'offerta. In assenza di informazioni specifiche sul prodotto, l'esempio usa le informazioni del prodotto 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;
}