Aktivieren von Abonnement-Add-Ons für die App

Ihre Universelle Windows-Plattform-App (UWP) kann Ihren Kunden In-App-Käufe von Abonnement-Add-Ons anbieten. Sie können Abonnements verwenden, um digitale Produkte in Ihrer App (z. B. App-Features oder digitale Inhalte) mit automatisierten wiederkehrenden Abrechnungszeiträumen zu verkaufen.

Hinweis

Um den Kauf von Abonnement-Add-Ons in Ihrer App zu aktivieren, muss Ihr Projekt Windows 10 Anniversary Edition (10.0; Build 14393) oder eine höhere Version in Visual Studio (dies entspricht Windows 10, Version 1607), und es muss die APIs im Windows.Services.Store Namespace verwenden, um die In-App-Kauferfahrung anstelle des Windows.ApplicationModel.Store Namespace zu implementieren. Weitere Informationen zu den Unterschieden zwischen diesen Namespaces finden Sie unter In-App-Käufe und Testversionen.

Wichtige Features

Abonnement-Add-Ons für UWP-Apps unterstützen die folgenden Features:

  • Sie können zwischen Abonnementlaufzeiten von 1 Monat, 3 Monaten, 6 Monaten, 1 Jahr oder 2 Jahren wählen.
  • Sie können Ihrem Abonnement kostenlose Testzeiträume von 1 Woche oder 1 Monat hinzufügen.
  • Das Windows SDK stellt APIs bereit, die Sie in Ihrer App verwenden können, um Informationen zu verfügbaren Abonnement-Add-Ons für die App abzurufen und den Kauf eines Abonnement-Add-Ons zu aktivieren. Wir stellen auch REST-APIs bereit, die Sie von Ihren Diensten aufrufen können, um Abonnements für einen Benutzer zu verwalten.
  • Sie können Analyseberichte anzeigen, die die Anzahl der Abonnementkäufe, aktiven Abonnenten und gekündigten Abonnements in einem bestimmten Zeitraum angeben.
  • Kunden können ihr Abonnement auf der https://account.microsoft.com/services Seite für ihr Microsoft-Konto verwalten. Kunden können diese Seite verwenden, um alle erworbenen Abonnements anzuzeigen, ein Abonnement zu kündigen und die Zahlungsform zu ändern, die ihrem Abonnement zugeordnet ist.

Schritte zum Aktivieren eines Abonnement-Add-Ons für Ihre App

Führen Sie die folgenden Schritte aus, um den Kauf von Abonnement-Add-Ons in Ihrer App zu aktivieren.

  1. Erstellen Sie eine Add-On-Übermittlung für Ihr Abonnement im Partner Center, und veröffentlichen Sie die Übermittlung. Achten Sie beim Ausführen des Add-On-Übermittlungsprozesses genau auf die folgenden Eigenschaften:

    • Produkttyp: Stellen Sie sicher, dass Sie Abonnement auswählen.

    • Abonnementzeitraum: Wählen Sie den wiederkehrenden Abrechnungszeitraum für Ihr Abonnement aus. Sie können den Abonnementzeitraum nicht ändern, nachdem Sie Ihr Add-On veröffentlicht haben.

      Jedes Abonnement-Add-On unterstützt einen einzelnen Abonnementzeitraum und einen Testzeitraum. Sie müssen für jeden Abonnementtyp, den Sie in Ihrer App anbieten möchten, ein anderes Abonnement-Add-On erstellen. Wenn Sie beispielsweise ein monatliches Abonnement ohne Testversion, ein monatliches Abonnement mit einer einmonatigen Testversion, ein Jahresabonnement ohne Testversion und ein Jahresabonnement mit einer einmonatigen Testversion anbieten möchten, müssen Sie vier Abonnement-Add-Ons erstellen.

    • Testzeitraum: Erwägen Sie, einen Testzeitraum von 1 Woche oder 1 Monat für Ihr Abonnement auszuwählen, damit Benutzer Ihre Abonnementinhalte vor dem Kauf ausprobieren können. Sie können den Testzeitraum nach der Veröffentlichung Ihres Abonnement-Add-Ons nicht mehr ändern oder entfernen.

      Um eine kostenlose Testversion Ihres Abonnements zu erhalten, muss ein Benutzer Ihr Abonnement über den standardmäßigen In-App-Kaufprozess erwerben, einschließlich einer gültigen Zahlungsmethode. Ihnen wird während des Testzeitraums kein Geld in Rechnung gestellt. Am Ende des Testzeitraums wird das Abonnement automatisch in das vollständige Abonnement umgewandelt, und das Zahlungsinstrument des Benutzers wird für den ersten Zeitraum des kostenpflichtigen Abonnements in Rechnung gestellt. Wenn der Benutzer sein Abonnement während des Testzeitraums kündigen möchte, bleibt das Abonnement bis zum Ende des Testzeitraums aktiv. Einige Testzeiträume sind nicht für alle Abonnementperioden verfügbar.

      Hinweis

      Jeder Kunde kann nur einmal eine kostenlose Testversion für ein Abonnement-Add-On erwerben. Nachdem ein Kunde eine kostenlose Testversion für ein Abonnement erworben hat, verhindert der Store, dass derselbe Kunde jemals dasselbe kostenlose Testabonnement erneut erhält.

    • Sichtbarkeit: Wenn Sie ein Test-Add-On erstellen, das Sie nur zum Testen der In-App-Kauferfahrung für Ihr Abonnement verwenden, empfiehlt es sich, eine der Optionen Im Store ausgeblendet auszuwählen. Andernfalls können Sie die beste Sichtbarkeitsoption für Ihr Szenario auswählen.

    • Preise: Wählen Sie in diesem Abschnitt den Preis Ihres Abonnements aus. Sie können den Preis für das Abonnement nicht erhöhen, nachdem Sie das Add-On veröffentlicht haben. Sie können den Preis jedoch später senken.

      Wichtig

      Wenn Sie ein Add-On erstellen, ist der Preis standardmäßig auf Free festgelegt. Da Sie den Preis für ein Abonnement-Add-On nicht erhöhen können, nachdem Sie die Add-On-Übermittlung abgeschlossen haben, sollten Sie hier den Preis Ihres Abonnements auswählen.

  2. Verwenden Sie in Ihrer App APIs im Windows.Services.Store-Namespace , um zu ermitteln, ob der aktuelle Benutzer Ihr Abonnement-Add-On bereits erworben hat, und bieten Sie es dann dem Benutzer als In-App-Kauf an. Weitere Informationen finden Sie in den Codebeispielen in diesem Artikel.

  3. Testen Sie die In-App-Kaufimplementierung Ihres Abonnements in Ihrer App. Sie müssen Ihre App einmal aus dem Store auf Ihr Entwicklungsgerät herunterladen, um die Lizenz zum Testen zu verwenden. Weitere Informationen finden Sie in unserem Testleitfaden für In-App-Käufe.

  4. Erstellen und veröffentlichen Sie eine App-Übermittlung, die Ihr aktualisiertes App-Paket einschließlich Ihres getesteten Codes enthält. Weitere Informationen finden Sie unter App-Übermittlungen.

Codebeispiele

Die Codebeispiele in diesem Abschnitt veranschaulichen, wie Sie die APIs im Windows.Services.Store-Namespace verwenden, um Informationen zu Abonnement-Add-Ons für die aktuelle App abzurufen und den Kauf eines Abonnement-Add-Ons im Namen des aktuellen Benutzers anzufordern.

Für diese Beispiele gelten die folgenden Voraussetzungen:

  • Ein Visual Studio-Projekt für eine Universelle Windows-Plattform-App (UWP), die Windows 10 Anniversary Edition (10.0; Build 14393) oder höher.
  • Sie haben eine App-Übermittlung im Partner Center erstellt, und diese App wird im Store veröffentlicht. Optional können Sie die App so konfigurieren, dass sie während des Tests nicht im Store auffindbar ist. Weitere Informationen finden Sie unter Hinweise für Tests.
  • Sie haben ein Abonnement-Add-On für die App im Partner Center erstellt.

Der Code in diesen Beispielen setzt folgendes voraus:

  • Die Codedatei enthält using-Anweisungen für die Namespaces Windows.Services.Store und System.Threading.Tasks .
  • Die App ist eine Einzelbenutzer-App, die nur im Kontext des Benutzers ausgeführt wird, der die App gestartet hat. Weitere Informationen finden Sie unter In-App-Käufe und Testversionen.

Hinweis

Wenn Sie über eine Desktopanwendung verfügen, die die Desktop-Brücke verwendet, müssen Sie möglicherweise zusätzlichen Code hinzufügen, der in diesen Beispielen nicht gezeigt wird, um das StoreContext-Objekt zu konfigurieren. Weitere Informationen finden Sie unter Verwenden der StoreContext-Klasse in einer Desktopanwendung, die die Desktop-Brücke verwendet.

Erwerben eines Abonnement-Add-Ons

In diesem Beispiel wird veranschaulicht, wie Sie den Kauf eines bekannten Abonnement-Add-Ons für Ihre App im Namen des aktuellen Kunden anfordern. Dieses Beispiel zeigt auch, wie Sie den Fall behandeln, in dem das Abonnement einen Testzeitraum hat.

  1. Der Code bestimmt zunächst, ob der Kunde bereits über eine aktive Lizenz für das Abonnement verfügt. Wenn der Kunde bereits über eine aktive Lizenz verfügt, sollte Ihr Code die Abonnementfeatures nach Bedarf entsperren (da dies für Ihre App proprietär ist, wird dies mit einem Kommentar im Beispiel identifiziert).
  2. Als Nächstes ruft der Code das StoreProduct-Objekt ab, das das Abonnement darstellt, das Sie im Namen des Kunden erwerben möchten. Im Code wird davon ausgegangen, dass Sie bereits die Store-ID des Abonnement-Add-Ons kennen, das Sie erwerben möchten, und dass Sie diesen Wert der abonnementStoreId-Variablen zugewiesen haben.
  3. Der Code bestimmt dann, ob eine Testversion für das Abonnement verfügbar ist. Optional kann Ihre App diese Informationen verwenden, um dem Kunden Details zur verfügbaren Testversion oder zum vollständigen Abonnement anzuzeigen.
  4. Schließlich ruft der Code die RequestPurchaseAsync-Methode auf, um den Kauf des Abonnements anzufordern. Wenn eine Testversion für das Abonnement verfügbar ist, wird die Testversion dem Kunden zum Kauf angeboten. Andernfalls wird das vollständige Abonnement zum Kauf angeboten.
private StoreContext context = null;
StoreProduct subscriptionStoreProduct;

// Assign this variable to the Store ID of your subscription add-on.
private string subscriptionStoreId = "";  

// This is the entry point method for the example.
public async Task SetupSubscriptionInfoAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    bool userOwnsSubscription = await CheckIfUserHasSubscriptionAsync();
    if (userOwnsSubscription)
    {
        // Unlock all the subscription add-on features here.
        return;
    }

    // Get the StoreProduct that represents the subscription add-on.
    subscriptionStoreProduct = await GetSubscriptionProductAsync();
    if (subscriptionStoreProduct == null)
    {
        return;
    }

    // Check if the first SKU is a trial and notify the customer that a trial is available.
    // If a trial is available, the Skus array will always have 2 purchasable SKUs and the
    // first one is the trial. Otherwise, this array will only have one SKU.
    StoreSku sku = subscriptionStoreProduct.Skus[0];
    if (sku.SubscriptionInfo.HasTrialPeriod)
    {
        // You can display the subscription trial info to the customer here. You can use 
        // sku.SubscriptionInfo.TrialPeriod and sku.SubscriptionInfo.TrialPeriodUnit 
        // to get the trial details.
    }
    else
    {
        // You can display the subscription purchase info to the customer here. You can use 
        // sku.SubscriptionInfo.BillingPeriod and sku.SubscriptionInfo.BillingPeriodUnit
        // to provide the renewal details.
    }

    // Prompt the customer to purchase the subscription.
    await PromptUserToPurchaseAsync();
}

private async Task<bool> CheckIfUserHasSubscriptionAsync()
{
    StoreAppLicense appLicense = await context.GetAppLicenseAsync();

    // Check if the customer has the rights to the subscription.
    foreach (var addOnLicense in appLicense.AddOnLicenses)
    {
        StoreLicense license = addOnLicense.Value;
        if (license.SkuStoreId.StartsWith(subscriptionStoreId))
        {
            if (license.IsActive)
            {
                // The expiration date is available in the license.ExpirationDate property.
                return true;
            }
        }
    }

    // The customer does not have a license to the subscription.
    return false;
}

private async Task<StoreProduct> GetSubscriptionProductAsync()
{
    // Load the sellable add-ons for this app and check if the trial is still 
    // available for this customer. If they previously acquired a trial they won't 
    // be able to get a trial again, and the StoreProduct.Skus property will 
    // only contain one SKU.
    StoreProductQueryResult result =
        await context.GetAssociatedStoreProductsAsync(new string[] { "Durable" });

    if (result.ExtendedError != null)
    {
        System.Diagnostics.Debug.WriteLine("Something went wrong while getting the add-ons. " +
            "ExtendedError:" + result.ExtendedError);
        return null;
    }

    // Look for the product that represents the subscription.
    foreach (var item in result.Products)
    {
        StoreProduct product = item.Value;
        if (product.StoreId == subscriptionStoreId)
        {
            return product;
        }
    }

    System.Diagnostics.Debug.WriteLine("The subscription was not found.");
    return null;
}

private async Task PromptUserToPurchaseAsync()
{
    // Request a purchase of the subscription product. If a trial is available it will be offered 
    // to the customer. Otherwise, the non-trial SKU will be offered.
    StorePurchaseResult result = await subscriptionStoreProduct.RequestPurchaseAsync();

    // Capture the error message for the operation, if any.
    string extendedError = string.Empty;
    if (result.ExtendedError != null)
    {
        extendedError = result.ExtendedError.Message;
    }

    switch (result.Status)
    {
        case StorePurchaseStatus.Succeeded:
            // Show a UI to acknowledge that the customer has purchased your subscription 
            // and unlock the features of the subscription. 
            break;

        case StorePurchaseStatus.NotPurchased:
            System.Diagnostics.Debug.WriteLine("The purchase did not complete. " +
                "The customer may have cancelled the purchase. ExtendedError: " + extendedError);
            break;

        case StorePurchaseStatus.ServerError:
        case StorePurchaseStatus.NetworkError:
            System.Diagnostics.Debug.WriteLine("The purchase was unsuccessful due to a server or network error. " +
                "ExtendedError: " + extendedError);
            break;

        case StorePurchaseStatus.AlreadyPurchased:
            System.Diagnostics.Debug.WriteLine("The customer already owns this subscription." +
                    "ExtendedError: " + extendedError);
            break;
    }
}

Abrufen von Informationen zu Abonnement-Add-Ons für die aktuelle App

In diesem Codebeispiel wird veranschaulicht, wie Sie Informationen zu allen Abonnement-Add-Ons abrufen, die in Ihrer App verfügbar sind. Verwenden Sie zum Abrufen dieser Informationen zunächst die GetAssociatedStoreProductsAsync-Methode , um die Auflistung der StoreProduct-Objekte abzurufen, die die einzelnen verfügbaren Add-Ons für die App darstellen. Rufen Sie dann die StoreSku für jedes Produkt ab, und verwenden Sie die Eigenschaften IsSubscription und SubscriptionInfo , um auf die Abonnementinformationen zuzugreifen.

private StoreContext context = null;

public async Task GetSubscriptionsInfo()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    // Subscription add-ons are Durable products.
    string[] productKinds = { "Durable" };
    List<String> filterList = new List<string>(productKinds);

    StoreProductQueryResult queryResult =
        await context.GetAssociatedStoreProductsAsync(productKinds);

    if (queryResult.ExtendedError != null)
    {
        // The user may be offline or there might be some other server failure.
        System.Diagnostics.Debug.WriteLine($"ExtendedError: {queryResult.ExtendedError.Message}");
        return;
    }

    foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
    {
        // Access the Store product info for the add-on.
        StoreProduct product = item.Value;

        // For each add-on, the subscription info is available in the SKU objects in the add-on. 
        foreach (StoreSku sku in product.Skus)
        {
            if (sku.IsSubscription)
            {
                // Use the sku.SubscriptionInfo property to get info about the subscription. 
                // For example, the following code gets the units and duration of the 
                // subscription billing period.
                StoreDurationUnit billingPeriodUnit = sku.SubscriptionInfo.BillingPeriodUnit;
                uint billingPeriod = sku.SubscriptionInfo.BillingPeriod;
            }
        }
    }
}

Verwalten von Abonnements über Ihre Dienste

Nachdem sich Ihre aktualisierte App im Store befindet und Kunden Ihr Abonnement-Add-On kaufen können, müssen Sie möglicherweise das Abonnement für einen Kunden verwalten. Wir stellen REST-APIs bereit, die Sie von Ihren Diensten aufrufen können, um die folgenden Abonnementverwaltungsaufgaben auszuführen:

Stornierungen

Kunden können die https://account.microsoft.com/services Seite für ihr Microsoft-Konto verwenden, um alle erworbenen Abonnements anzuzeigen, ein Abonnement zu kündigen und die Zahlungsmethode zu ändern, die ihrem Abonnement zugeordnet ist. Wenn ein Kunde ein Abonnement über diese Seite bricht, hat er für die Dauer des aktuellen Abrechnungszeitraums weiterhin Zugriff auf das Abonnement. Sie erhalten keine Rückerstattung für einen Teil des aktuellen Abrechnungszeitraums. Am Ende des aktuellen Abrechnungszeitraums wird ihr Abonnement deaktiviert.

Sie können ein Abonnement auch im Namen eines Benutzers kündigen, indem Sie unsere REST-API verwenden, um den Abrechnungsstatus eines Abonnements für einen bestimmten Benutzer zu ändern.

Abonnementverlängerungen und Karenzzeiten

Irgendwann während jedes Abrechnungszeitraums versuchen wir, das Guthaben des Kunden Karte für den nächsten Abrechnungszeitraum in Rechnung zu stellen. Wenn die Gebühr fehlschlägt, wird das Abonnement des Kunden in den Mahnzustand versetzt . Dies bedeutet, dass ihr Abonnement für den Rest des aktuellen Abrechnungszeitraums weiterhin aktiv ist, aber wir versuchen in regelmäßigen Abständen, ihr Guthaben Karte zu belasten, um das Abonnement automatisch zu verlängern. Dieser Zustand kann bis zu zwei Wochen dauern, bis zum Ende des aktuellen Abrechnungszeitraums und dem Verlängerungsdatum für den nächsten Abrechnungszeitraum.

Wir bieten keine Nachfristen für die Abonnementabrechnung an. Wenn wir bis zum Ende des aktuellen Abrechnungszeitraums nicht erfolgreich das Guthaben des Kunden Karte belasten können, wird das Abonnement gekündigt und der Kunde hat nach dem aktuellen Abrechnungszeitraum keinen Zugriff mehr auf das Abonnement.

Nicht unterstützte Szenarien

Die folgenden Szenarien werden derzeit nicht für Abonnement-Add-Ons unterstützt.

  • Der Verkauf von Abonnements an Kunden direkt über den Store wird derzeit nicht unterstützt. Abonnements sind nur für In-App-Käufe digitaler Produkte verfügbar.
  • Kunden können abonnementzeiträume nicht über die https://account.microsoft.com/services Seite für ihr Microsoft-Konto wechseln. Um zu einem anderen Abonnementzeitraum zu wechseln, müssen Kunden ihr aktuelles Abonnement kündigen und dann ein Abonnement mit einem anderen Abonnementzeitraum als Ihre App erwerben.
  • Der Tarifwechsel wird derzeit nicht für Abonnement-Add-Ons unterstützt (z. B. der Wechsel eines Kunden von einem Basisabonnement zu einem Premium-Abonnement mit mehr Features).
  • Verkaufs- und Werbecodes werden derzeit nicht für Abonnement-Add-Ons unterstützt.
  • Erneuern vorhandener Abonnements, nachdem Sie die Sichtbarkeit Ihres Abonnement-Add-Ons auf Erwerb beenden festgelegt haben. Weitere Informationen finden Sie unter Festlegen von Add-On-Preisen und Verfügbarkeit .