Käufe von konsumierbaren In-App-Produkten aktivieren

Sie können In-App-Käufe von Endverbraucherprodukten – Artikel, die gekauft, verwendet und wieder gekauft werden können – über die Store-Handelsplattform anbieten, um Kunden beim Kauf Stabilität und Zuverlässigkeit zu bieten. Dies ist besonders nützlich für Dinge wie spielinterne Währungen (Gold, Münzen usw.), die gekauft und dann zum Erwerben bestimmter Power-Ups verwendet werden können.

Wichtig

In diesem Artikel wird veranschaulicht, wie Sie Mitglieder des Windows.ApplicationModel.Store Namespace verwenden, um verbrauchsbare 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 von Partner Center und dem Store unterstützt werden. Der Windows.Services.Store-Namespace wurde in Windows 10 Version 1607 eingeführt und kann nur in Projekten verwendet werden, die Windows 10 Anniversary Edition (10.0; Build 14393) oder eine höhere Version in Visual Studio. Weitere Informationen zum Aktivieren verbrauchsbasierter In-App-Produktkäufe mit dem Windows.Services.Store-Namespace finden Sie in diesem Artikel.

Voraussetzungen

  • In diesem Thema erfahren Sie, wie In-App-Produktkäufe von Consumables erfüllt und gemeldet werden. 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 Ihrer In-App-Produkte im Store.
  • Wenn Sie Code für neue In-App-Produkte erstmalig schreiben und 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 Liveserver verwendet. Dazu müssen Sie die Datei mit dem Namen WindowsStoreProxy.xml in %userprofile%\AppData\local\packages\<paketname>\LocalState\Microsoft\Windows Store\ApiData anpassen. Diese Datei wird vom Simulator in Microsoft Visual Studio erstellt, wenn Sie Ihre App zum ersten Mal ausführen. Sie können jedoch auch eine benutzerdefinierte Version dieser Datei zur Laufzeit laden. Weitere Informationen finden Sie unter Verwenden der Datei „WindowsStoreProxy.xml“ mit CurrentAppSimulator.
  • In diesem Thema wird auch auf Codebeispiele verwiesen, die im Store-Beispiel zu finden sind. Dieses Beispiel bietet eine hervorragende Möglichkeit, die verschiedenen Monetarisierungsoptionen zu testen, die für universelle Windows-Plattform (UWP)-Apps verfügbar sind.

Schritt 1: Durchführen der Kaufanforderung

Die erste Kaufanforderung wird wie bei jedem Kauf über den Store mit RequestProductPurchaseAsync durchgeführt. Der Unterschied bei konsumierbaren In-App-Produkten besteht darin, dass ein Kunde nach einem erfolgreichen Kauf das gleiche Produkt erst dann erneut kaufen kann, wenn die App den Store benachrichtigt hat, dass der vorige Kauf des Produkts erfolgreich erfüllt wurde. Ihre App ist dafür verantwortlich, gekaufte Consumables zu erfüllen und den Store über die Erfüllung in Kenntnis zu setzen.

Im nächsten Beispiel wird eine In-App-Kaufanforderung für ein Consumable gezeigt. Sie sehen Codekommentare, die angeben, wann Ihre App den Kauf des konsumierbaren In-App-Produkts lokal erfüllen sollte, und zwar für zwei verschiedene Szenarien – eine erfolgreiche Kaufanforderung und eine nicht erfolgreiche Kaufanforderung aufgrund eines nicht erfüllten Kaufs desselben Produkts.

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: Verfolgen der lokalen Kauferfüllung des Verbrauchsartikels

Wenn Sie dem Kunden Zugriff auf das konsumierbare In-App-Produkt gewähren, müssen Sie dokumentieren, für welches Produkt der Kauf erfüllt wird (productId) und mit welcher Transaktion diese Erfüllung verbunden ist (transactionId).

Wichtig

Ihre App ist für die genaue Übermittlung der Erfüllung an den Store verantwortlich. Dieser Schritt ist die Grundlage dafür, dass der Kauf von den Kunden als fair und zuverlässig wahrgenommen wird.

Im folgenden Beispiel wird die Verwendung von PurchaseResults-Eigenschaften aus dem RequestProductPurchaseAsync-Aufruf im vorangehenden Schritt zum Identifizieren des Produkts für die Kauferfüllung gezeigt. Es wird eine Sammlung 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.
}

Im folgenden Beispiel wird die Verwendung des Arrays aus dem vorhergehenden Beispiel gezeigt, um auf Produkt-ID/Transaktions-ID-Paare zuzugreifen, die später beim Melden der Erfüllung an den Store verwendet werden.

Wichtig

Unabhängig von der Methodik, die Ihre App zum Nachverfolgen und Bestätigen der Erfüllung verwendet, muss Ihre App sorgfaltspflichtig sein, um sicherzustellen, dass Ihren Kunden keine Gebühren für nicht empfangene Artikel in Rechnung gestellt werden.

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 des Produktkaufs enthält.

Wichtig

Wenn erfüllte verbrauchsbare In-App-Produkte nicht an den Store gemeldet werden, kann der Benutzer dieses Produkt nicht erneut kaufen, bis die Erfüllung des vorherigen Kaufs gemeldet wird.

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

Schritt 4: Identifizieren nicht erfüllter Käufe

Ihre App kann jederzeit mithilfe der GetUnfulfilledConsumablesAsync-Methode eine Überprüfung auf nicht erfüllte Käufe konsumierbarer In-App-Produkte durchführen. Diese Methode sollte regelmäßig aufgerufen werden, um nicht erfüllte Käufe konsumierbarer Produkte zu ermitteln, die aufgrund unerwarteter Ereignisse in der App aufgetreten sind, beispielsweise Unterbrechungen der Netzwerkverbindung oder Beenden der App.

Im folgenden Beispiel wird gezeigt, auf welche Weise GetUnfulfilledConsumablesAsync verwendet werden kann, um nicht erfüllte Käufe konsumierbarer Produkte aufzuzählen, und wie Ihre App diese Liste iterieren 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.
    }
}