Aktivieren von konsumierbaren In-App-Produktkäufen

Bieten Sie konsumierbare In-App-Produkte – Artikel, die gekauft, verwendet und wieder gekauft werden können – über die Store-Commerce-Plattform, um Ihren Kunden eine kauffreundliche und zuverlässige Einkaufserfahrung zu bieten. Dies ist besonders nützlich für Dinge wie In-Game-Währung (Gold, Münzen usw.), die gekauft und dann zum Kauf bestimmter Power-Ups verwendet werden können.

Wichtig

In diesem Artikel wird veranschaulicht, wie Sie Mitglieder des Windows.ApplicationModel.Store Namespace verwenden, um konsumierbare In-App-Produktkäufe zu ermöglichen. Dieser Namespace wird nicht mehr mit neuen Features aktualisiert, und es wird empfohlen, stattdessen den Windows.Services.Store Namespace zu verwenden. Der Windows.Services.Store-Namespace unterstützt die neuesten Add-On-Typen, z. B. vom Store verwaltete Verbrauchs-Add-Ons und Abonnements, und ist so konzipiert, dass er mit zukünftigen Produkttypen und Features kompatibel ist, die vom Partner Center und dem Store unterstützt werden. Der Windows.Services.Store-Namespace wurde in der Version 1607 von Windows 10 eingeführt und kann ausschließlich in Projekten verwendet werden, die auf Windows 10 Anniversary Edition (Build 14393 der Version 10.0) oder ein späteres Release in Visual Studio ausgelegt ist. Weitere Informationen zum Aktivieren konsumierbarer In-App-Produktkäufe mit dem Windows.Services.Store-Namespace finden Sie in diesem Artikel.

Voraussetzungen

  • In diesem Thema werden die Einkaufs- und Erfüllungsberichte von konsumierbaren In-App-Produkten behandelt. Wenn Sie mit In-App-Produkten nicht vertraut sind, lesen Sie "In-App-Produktkäufe aktivieren", um mehr über Lizenzinformationen zu erfahren und wie Sie In-App-Produkte im Store ordnungsgemäß auflisten.
  • Wenn Sie neue In-App-Produkte zum ersten Mal codieren und testen, müssen Sie das CurrentAppSimulator-Objekt anstelle des CurrentApp-Objekts verwenden. Auf diese Weise können Sie Ihre Lizenzlogik mithilfe simulierter Aufrufe an den Lizenzserver überprüfen, anstatt den Liveserver aufzurufen. Dazu müssen Sie die Datei namens WindowsStoreProxy.xml in %userprofile%\AppData\local\packages\<paketname>\LocalState\Microsoft\Windows Store\ApiData anpassen. Der Microsoft Visual Studio-Simulator erstellt diese Datei, wenn Sie Ihre App zum ersten Mal ausführen, oder Sie können auch eine benutzerdefinierte Zur Laufzeit laden. Weitere Informationen finden Sie unter Verwenden der WindowsStoreProxy.xml-Datei mit CurrentAppSimulator.
  • In diesem Thema wird auch auf Codebeispiele verwiesen, die im Store-Beispiel bereitgestellt werden. Dieses Beispiel ist eine hervorragende Möglichkeit, praktische Erfahrungen mit den verschiedenen Monetarisierungsoptionen zu erhalten, die für Universelle Windows-Plattform -Apps (UWP) bereitgestellt werden.

Schritt 1: Durchführen der Kaufanfrage

Die anfängliche Kaufanforderung erfolgt mit RequestProductPurchaseAsync wie jeder andere Kauf, der über den Store getätigt wurde. Der Unterschied bei konsumierbaren In-App-Produkten besteht darin, dass ein Kunde nach einem erfolgreichen Kauf dasselbe Produkt nicht erneut kaufen kann, bis die App den Store benachrichtigt hat, dass der vorherige Kauf erfolgreich erfüllt wurde. Es liegt in der Verantwortung Ihrer App, gekaufte Verbrauchsartikel zu erfüllen und den Store über die Erfüllung zu informieren.

Das folgende Beispiel zeigt eine In-App-Produktkaufanforderung. Sie werden Codekommentare bemerken, die angeben, wann Ihre App ihre lokale Erfüllung des konsumierbaren In-App-Produkts für zwei verschiedene Szenarien durchführen soll – wenn die Anforderung erfolgreich ist und wenn die Anforderung aufgrund eines nicht erfüllten Kaufs dieses Produkts nicht erfolgreich ist.

PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync("product1");
switch (purchaseResults.Status)
{
    case ProductPurchaseStatus.Succeeded:
        product1TempTransactionId = purchaseResults.TransactionId;

        // 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:
        product1TempTransactionId = purchaseResults.TransactionId;

        // 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;
}

Schritt 2: Nachverfolgen der lokalen Erfüllung des Verbrauchsartikels

Wenn Sie Ihrem Kunden Zugriff auf das konsumierbare In-App-Produkt gewähren, ist es wichtig, nachzuverfolgen, welches Produkt erfüllt ist (productId) und welcher Transaktion, der die Erfüllung zugeordnet ist (transactionId).

Wichtig

Ihre App ist für die genaue Meldung der Erfüllung an den Store verantwortlich. Dieser Schritt ist für die Aufrechterhaltung einer fairen und zuverlässigen Einkaufserfahrung für Ihre Kunden unerlässlich.

Im folgenden Beispiel wird die Verwendung der PurchaseResults-Eigenschaften aus dem RequestProductPurchaseAsync-Aufruf im vorherigen Schritt veranschaulicht, um das erworbene Produkt für die Erfüllung zu identifizieren. Eine Sammlung wird verwendet, um die Produktinformationen an einem Ort zu speichern, auf den später verwiesen werden kann, um zu bestätigen, dass die lokale Erfüllung erfolgreich war.

private void GrantFeatureLocally(string productId, Guid transactionId)
{
    if (!grantedConsumableTransactionIds.ContainsKey(productId))
    {
        grantedConsumableTransactionIds.Add(productId, new List<Guid>());
    }
    grantedConsumableTransactionIds[productId].Add(transactionId);

    // Grant the user their content. You will likely increase some kind of gold/coins/some other asset count.
}

Dieses nächste Beispiel zeigt, wie Sie das Array aus dem vorherigen Beispiel verwenden, um auf Produkt-ID-/Transaktions-ID-Paare zuzugreifen, die später beim Melden der Erfüllung an den Store verwendet werden.

Wichtig

Unabhängig davon, welche Methodik Ihre App verwendet, um die Erfüllung nachzuverfolgen und zu bestätigen, muss Ihre App ihre Sorgfalt nachweisen, um sicherzustellen, dass Ihren Kunden keine Artikel in Rechnung gestellt werden, die sie nicht erhalten haben.

private Boolean IsLocallyFulfilled(string productId, Guid transactionId)
{
    return grantedConsumableTransactionIds.ContainsKey(productId) &&
        grantedConsumableTransactionIds[productId].Contains(transactionId);
}

Schritt 3: Melden der Produkterfüllung an den Store

Nachdem die lokale Erfüllung abgeschlossen wurde, muss Ihre App einen ReportConsumableFulfillmentAsync-Aufruf ausführen, der die productId und die Transaktion enthält, in der der Produktkauf enthalten ist.

Wichtig

Wenn sie erfüllte In-App-Produkte nicht an den Store melden, kann der Benutzer dieses Produkt erst erneut kaufen, nachdem die Erfüllung des vorherigen Kaufs gemeldet wurde.

FulfillmentResult result = await CurrentAppSimulator.ReportConsumableFulfillmentAsync(
    "product2", product2TempTransactionId);

Schritt 4: Identifizieren nicht erfüllter Einkäufe

Ihre App kann die GetUnfulfilledConsumablesAsync-Methode verwenden, um jederzeit nach nicht erfüllten Verbrauchsartikeln in-App-Produkten zu suchen. Diese Methode sollte regelmäßig aufgerufen werden, um auf nicht erfüllte Verbrauchsmaterialien zu prüfen, die aufgrund unerwarteter App-Ereignisse wie einer Unterbrechung der Netzwerkkonnektivität oder der Beendigung der App vorhanden sind.

Im folgenden Beispiel wird veranschaulicht, wie GetUnfulfilledConsumablesAsync verwendet werden kann, um nicht erfüllte Verbrauchsmaterialien aufgezählt zu werden, und wie Ihre App diese Liste durchlaufen kann, um die lokale Erfüllung abzuschließen.

private async void GetUnfulfilledConsumables()
{
    products = await CurrentApp.GetUnfulfilledConsumablesAsync();

    foreach (UnfulfilledConsumable product in products)
    {
        logMessage += "\nProduct Id: " + product.ProductId + " Transaction Id: " + product.TransactionId;
        // This is where you would pass the product ID and transaction ID to
        // currentAppSimulator.reportConsumableFulfillment to indicate local fulfillment to the Windows Store.
    }
}