Condividi tramite


Gestire un catalogo di prodotti in-app di grandi dimensioni

Se la tua app offre un ampio catalogo di prodotti in-app, puoi facoltativamente seguire la procedura descritta in questo argomento per gestire meglio il tuo catalogo. Nelle versioni precedenti a Windows 10, lo Store ha un limite di 200 elenchi di prodotti per account sviluppatore e il processo descritto in questo argomento può essere utilizzato per aggirare tale limitazione. A partire da Windows 10, lo Store non ha limiti al numero di elenchi di prodotti per account sviluppatore e il processo descritto in questo articolo non è più necessario.

Importante

In questo articolo viene illustrato come utilizzare i membri dello spazio dei nomi Windows.ApplicationModel.Store . Questo spazio dei nomi non viene più aggiornato con nuove funzionalità e ti consigliamo di utilizzare il fileWindows.Services.Store invece dello spazio dei nomi. Lo spazio dei nomi Windows.Services.Store supporta i tipi di componenti aggiuntivi più recenti, ad esempio i componenti aggiuntivi e gli abbonamenti di consumo gestiti dallo Store ed è progettato per essere compatibile con futuri tipi 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 utilizzato solo nei progetti destinati a Windows 10 Anniversary Edition (10.0; Build 14393) o una versione successiva in Visual Studio. Per maggiori informazioni, vedere acquisti e prove in-app.

Per abilitare questa funzionalità, creerai una manciata di voci di prodotto per fasce di prezzo specifiche, ciascuna in grado di rappresentare centinaia di prodotti all'interno di un catalogo. Utilizzare 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 trasmettere un oggetto ProductPurchaseDisplayProperties che contiene i dettagli dell'offerta del catalogo di grandi dimensioni.. Se questi dettagli non vengono forniti, verranno utilizzati i dettagli del prodotto elencato.

Lo Store utilizzerà solo offerIddalla richiesta di acquisto nella risultantePurchaseResults. Questo processo non modifica direttamente le informazioni originariamente fornite quando si elenca il prodotto in-app nello Store.

Prerequisiti

  • Questo argomento riguarda il supporto dello Store per la rappresentazione di più offerte in-app utilizzando un singolo prodotto in-app elencato nello Store. Se non hai familiarità con gli acquisti in-app, consulta Abilita gli acquisti di prodotti in-app per conoscere le informazioni sulla licenza e come elencare correttamente i tuoi acquisti in-app nello Store.
  • Quando codifichi e provi nuove offerte in-app per la prima volta, devi utilizzare l'oggetto CurrentAppSimulator invece del CurrentApp. In questo modo puoi verificare la logica della tua licenza utilizzando chiamate simulate al server delle licenze invece di chiamare il server live. Per fare ciò, è necessario personalizzare il file denominato WindowsStoreProxy.xml in %userprofile%\AppData\local\packages\<nome 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 anche caricarne uno personalizzato in fase di runtime. Per maggiori informazioni, consultare Utilizzando il file WindowsStoreProxy.xml con CurrentAppSimulator.
  • Questo argomento fa riferimento anche agli esempi di codice forniti nelcampione di negozio. Questo esempio è un ottimo modo per acquisire esperienza pratica con le diverse opzioni di monetizzazione fornite per le app UWP (Universal Windows Platform).

Effettua la richiesta di acquisto del prodotto in-app

La richiesta di acquisto per un prodotto specifico all'interno di un ampio catalogo viene gestita più o meno allo stesso modo di qualsiasi altra richiesta di acquisto all'interno di un'app. Quando la tua app chiama il nuovo overload del metodo RequestProductPurchaseAsync l'app fornisce sia un fileOfferId e 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.
}

Segnala l'adempimento dell'offerta in-app

La tua app dovrà segnalare l'adempimento del prodotto allo Store non appena l'offerta sarà stata soddisfatta a livello locale. In uno scenario con catalogo di grandi dimensioni, se l'app non segnala l'adempimento dell'offerta, l'utente non sarà in grado di acquistare offerte in-app utilizzando la stessa scheda di prodotto dello Store.

Come accennato in precedenza, lo Store utilizza solo le informazioni sull'offerta fornite per popolare il file PurchaseResults,e non crea un'associazione persistente tra un'ampia offerta di catalogo e l'elenco dei prodotti dello Store. Di conseguenza è necessario tenere traccia dei diritti dell'utente per i prodotti e fornire all'utente il contesto specifico del prodotto (come il nome dell'articolo acquistato o i dettagli su di esso) al di fuori dell'operazione RequestProductPurchaseAsync .

Il codice seguente illustra la chiamata di evasione e un modello di messaggistica dell'interfaccia utente in cui sono inserite le informazioni specifiche sull'offerta. In assenza di informazioni specifiche sul prodotto, l'esempio utilizza 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;
}