Freigeben über


So wird’s gemacht: Verwalten eines großen Katalogs mit In-App-Produkten (HTML)

[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation]

In Windows 8.1 und Windows Phone 8.1 wird eine neue Lösung für Apps mit Katalogen für In-App-Produkte eingeführt, bei denen die Anzahl von Produkteinträgen die Store-Beschränkung von 200 Einträgen pro Entwicklerkonto übersteigt. Dank dieser Lösung müssen Sie nur einige wenige Produkteinträge für bestimmte Preisstufen erstellen, mit denen im Katalog jeweils Hunderte von Produkten dargestellt werden können.

Zur Nutzung dieser Funktion wurde eine neue Überladung der RequestProductPurchaseAsync-Methode zum Kauf eines von der App definierten Angebots eingeführt, das zu einem In-App-Produkt im Store gehört. Neben der Angabe einer Zuordnung eines Angebots zu einem Produkt während des Aufrufs sollte Ihre App auch ein ProductPurchaseDisplayProperties-Objekt übergeben, das die Angebotsdetails des großen Katalogs enthält. Wenn diese Details nicht angegeben sind, werden stattdessen die Details für das gelistete Produkt verwendet.

Im Store wird nur die OfferId aus der Kaufanforderung des entsprechenden PurchaseResults verwendet. Mit diesem Verfahren werden die Informationen, die ursprünglich bei der Eintragung des In-App-Produkts im Store bereitgestellt wurden, nicht direkt geändert.

Wissenswertes

Technologien

Voraussetzungen

  • In diesem Thema wird die Store-Unterstützung für die Darstellung mehrerer In-App-Produkte mithilfe eines einzelnen im Store aufgeführten In-App-Produkts erläutert. Wenn Sie mit In-App-Produkten noch nicht vertraut sind, lesen Sie Aktivieren von In-App-Produktkäufen. Dort finden Sie Lizenzinformationen und eine Anleitung zur richtigen Eintragung Ihres In-App-Produkts im Store.

  • In diesem Abschnitt wird außerdem auf Codebeispiele verwiesen, die in der MSDN Code Gallery unter Beispiel für Test-App und In-App-Einkauf zur Verfügung stehen. Dieses Beispiel bietet eine tolle Möglichkeit, die verschiedenen Monetarisierungsoptionen zu testen, die für Windows-Runtime-Apps verfügbar sind.

  • Wenn Sie Code für neue In-App-Produkte schreiben und erstmalig testen, müssen Sie anstelle des CurrentAppSimulator-Objekts das CurrentApp-Objekt verwenden. Auf diese Weise können Sie überprüfen, ob die Lizenzlogik simulierte Aufrufe an den Lizenzserver und nicht an den Live-Server verwendet. Dazu müssen Sie die Datei WindowsStoreProxy.xml in %userprofile%\AppData\local\packages\<package name>\LocalState\Microsoft\Windows Store\ApiData anpassen. Diese Datei wird vom Simulator in Microsoft Visual Studio erstellt, wenn Sie Ihre App erstmalig ausführen. Sie können aber auch eine benutzerdefinierte Version dieser Datei zur Laufzeit laden. Weitere Infos finden Sie in der CurrentAppSimulator-Dokumentation.

Durchführen der Kaufanforderung für das In-App-Produkt

Die Kaufanforderung für ein bestimmtes Produkt in einem umfangreichen Katalog wird ähnlich gehandhabt wie andere In-App-Kaufanforderungen. Wenn Ihre App die neue RequestProductPurchaseAsync-Methodenüberlast aufruft, stellt die App sowohl ein OfferId-Element als auch ein ProductPurchaseDisplayProperties-Objekt mit dem Namen des In-App-Produkts bereit.

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");
        });
}

Melden der Erfüllung des In-App-Produkts

Die App muss die Produkterfüllung an den Store melden, sobald die lokale Erfüllung für das Angebot abgeschlossen ist. Wenn die App die Erfüllung des Angebots bei Verwendung eines großen Katalogs nicht meldet, kann der Benutzer keine In-App-Angebote erwerben, für die der gleiche Store-Produkteintrag genutzt wird.

Wie bereits erwähnt verwendet der Store nur bereitgestellte Angebotsinformationen zum Auffüllen des PurchaseResults-Elements und erstellt keine beständige Zuordnung zwischen einem Angebot aus einem umfangreichen Katalog und einem Produkteintrag im Store. Daher müssen Sie die Benutzerberechtigungen für Produkte aus umfangreichen Katalogen nachverfolgen und dem Benutzer produktspezifischen Kontext (wie z. B. den Namen des angebotenen Artikels oder Details dazu) außerhalb des RequestProductPurchaseAsync-Vorgangs zur Verfügung stellen.

Der folgende Code veranschaulicht den Erfüllungsaufruf sowie ein Muster für Meldungen auf der Benutzeroberfläche, in das die angebotsspezifischen Informationen eingefügt werden. Da keine produktspezifischen Informationen vorhanden sind, werden im Beispiel Informationen aus dem ListingInformation-Element des Produkts verwendet.

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");
        });
}

Verwandte Themen

Beispiel für Test-App und In-App-Einkauf

Aktivieren von In-App-Produktkäufen

Unterstützen von In-App-Produktkäufen von Consumables

Beschreibung der App

RequestProductPurchaseAsync

ProductPurchaseDisplayProperties