Udostępnij za pośrednictwem


Włączanie dodatków subskrypcji dla aplikacji

Aplikacja platformy uniwersalnej systemu Windows (UWP) może oferować zakupy w aplikacji dodatków subskrypcyjnych dla klientów. Za pomocą subskrypcji można sprzedawać produkty cyfrowe w aplikacji (takie jak funkcje aplikacji lub zawartość cyfrowa) z automatycznymi okresami rozliczeniowymi cyklicznymi.

Notatka

Aby włączyć zakup dodatków subskrypcji w aplikacji, projekt musi używać interfejsów API w przestrzeni nazw Windows.Services.Store do zaimplementowania doświadczenia zakupu w aplikacji zamiast przestrzeni nazw Windows.ApplicationModel.Store i być przeznaczony dla rocznicowej wersji systemu Windows 10 (10.0; Kompilacja 14393) lub późniejszej wersji w programie Visual Studio (co odpowiada wersji 1607 systemu Windows 10). Aby uzyskać więcej informacji na temat różnic między tymi przestrzeniami nazw, zobacz Zakupy w aplikacji i wersje próbne.

Najważniejsze funkcje

Dodatki subskrypcji dla aplikacji platformy UWP obsługują następujące funkcje:

  • Możesz wybrać spośród okresów subskrypcji z 1 miesiąca, 3 miesięcy, 6 miesięcy, 1 roku lub 2 lat.
  • Możesz dodać do subskrypcji okresy bezpłatnej wersji próbnej z 1 tygodnia lub 1 miesiąca.
  • Zestaw Windows SDK udostępnia interfejsy API, których można użyć w aplikacji, aby uzyskać informacje o dostępnych w aplikacji dodatkach subskrypcyjnych oraz umożliwić zakup dodatku subskrypcyjnego. Udostępniamy również interfejsy API REST, które można wywoływać z Twoich usług, aby zarządzać subskrypcjami dla użytkownika.
  • Możesz wyświetlać raporty analityczne, które zapewniają liczbę przejęć subskrypcji, aktywnych subskrybentów i anulowanych subskrypcji w danym okresie.
  • Klienci mogą zarządzać subskrypcją na stronie https://account.microsoft.com/services dla swojego konta Microsoft. Klienci mogą użyć tej strony, aby wyświetlić wszystkie subskrypcje, które nabyły, anulować subskrypcję i zmienić formę płatności skojarzonej z subskrypcją.

Kroki włączania dodatku subskrypcji dla aplikacji

Aby włączyć zakup dodatków subskrypcji w aplikacji, wykonaj następujące kroki.

  1. Utwórz pozycję dodatku dla swojej subskrypcji w Centrum partnerskim i opublikuj pozycję. W trakcie procesu przesyłania dodatku zwróć szczególną uwagę na następujące właściwości:

    • typ produktu: upewnij się, że wybrano pozycję Subskrypcja.

    • okres subskrypcji: wybierz okres rozliczeniowy cykliczny dla subskrypcji. Nie można zmienić okresu subskrypcji po opublikowaniu dodatku.

      Każdy dodatek subskrypcji obsługuje jeden okres subskrypcji i okres próbny. Musisz utworzyć inny dodatek subskrypcji dla każdego typu subskrypcji, którą chcesz oferować w aplikacji. Jeśli na przykład chcesz zaoferować miesięczną subskrypcję bez wersji próbnej, miesięczną subskrypcję z jednomiesięczną wersją próbną, roczną subskrypcję bez wersji próbnej i roczną subskrypcję z jednomiesięczną wersją próbną, musisz utworzyć cztery dodatki subskrypcji.

    • okres próbny: rozważ wybranie okresu próbnego 1 tygodnia lub 1 miesiąca dla subskrypcji, aby umożliwić użytkownikom wypróbowanie zawartości subskrypcji przed jej zakupem. Nie można zmienić ani usunąć okresu próbnego po opublikowaniu dodatku subskrypcji.

      Aby uzyskać bezpłatną wersję próbną subskrypcji, użytkownik musi kupić subskrypcję w ramach standardowego procesu zakupu w aplikacji, w tym prawidłową formę płatności. Nie są one obciążane żadnymi pieniędzmi w okresie próbnym. Po zakończeniu okresu próbnego subskrypcja automatycznie konwertuje się na pełną subskrypcję, a instrument płatniczy użytkownika zostanie naliczony za pierwszy okres płatnej subskrypcji. Jeśli użytkownik zdecyduje się anulować subskrypcję w okresie próbnym, subskrypcja pozostanie aktywna do końca okresu próbnego. Niektóre okresy próbne nie są dostępne dla wszystkich okresów subskrypcji.

      Notatka

      Każdy klient może uzyskać bezpłatną wersję próbną dla dodatku subskrypcji tylko raz. Gdy klient uzyska bezpłatną wersję próbną dla subskrypcji, sklep uniemożliwia temu samemu klientowi ponowne uzyskanie tej samej subskrypcji bezpłatnej wersji próbnej.

    • widoczność: jeśli tworzysz dodatek testowy, który będzie używany tylko do testowania środowiska zakupu w aplikacji dla subskrypcji, zalecamy wybranie jednej z opcji Ukryte w sklepie. W przeciwnym razie możesz wybrać najlepszą opcję widoczności dla danego scenariusza.

    • Ceny: W tej sekcji wybierz cenę swojej subskrypcji. Nie można podnieść ceny subskrypcji po opublikowaniu dodatku. Można jednak obniżyć cenę później.

      Ważny

      Domyślnie podczas tworzenia dowolnego dodatku cena jest początkowo ustawiona na Bezpłatne. Ponieważ po zakończeniu przesyłania dodatku nie można podnieść jego ceny, upewnij się, że wybierasz cenę subskrypcji tutaj.

  2. W aplikacji użyj interfejsów API w przestrzeni nazw Windows.Services.Store, aby określić, czy bieżący użytkownik nabył już dodatek subskrypcji, a następnie zaoferuj go do sprzedaży użytkownikowi jako zakup w aplikacji. Aby uzyskać więcej informacji, zobacz przykłady kodu w tym artykule.

  3. Przetestuj implementację zakupu subskrypcji w swojej aplikacji. Aby móc korzystać z licencji do testowania, musisz pobrać aplikację raz ze Sklepu na urządzenie programistyczne. Aby uzyskać więcej informacji, zobacz nasze wskazówki testowe dotyczące zakupów w aplikacji.

  4. Utwórz i opublikuj zgłoszenie aplikacji, które zawiera zaktualizowany pakiet aplikacji, w tym przetestowany kod. Aby uzyskać więcej informacji, zobacz Przesyłanie aplikacji.

Przykłady kodu

Przykłady kodu w tej sekcji pokazują, jak używać interfejsów API w przestrzeni nazw Windows.Services.Store, aby uzyskać informacje o dodatku subskrypcji dla bieżącej aplikacji i zażądać zakupu dodatku subskrypcji w imieniu bieżącego użytkownika.

Te przykłady mają następujące wymagania wstępne:

  • Projekt programu Visual Studio dla aplikacji platformy uniwersalnej systemu Windows (UWP), która jest przeznaczona dla systemu Windows 10 Anniversary Edition (10.0; Kompilacja 14393) lub nowsza wersja.
  • Utworzono zgłoszenie aplikacji w Centrum partnerskim, a ta aplikacja została opublikowana w Sklepie. Opcjonalnie możesz skonfigurować aplikację, aby nie można było jej odnaleźć w Sklepie podczas testowania. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące testowania .
  • Utworzono dodatek subskrypcji dla aplikacji w Centrum partnerskim.

W poniższych przykładach przyjęto założenie, że kod:

  • Plik kodu używa instrukcji dla przestrzeni nazw Windows.Services.Store i System.Threading. Tasks.
  • Aplikacja to aplikacja pojedynczego użytkownika, która działa tylko w kontekście użytkownika, który uruchomił aplikację. Aby uzyskać więcej informacji, zobacz Zakupy w aplikacji i wersje próbne.

Notatka

Jeśli masz aplikację klasyczną korzystającą z Desktop Bridge, może być konieczne dodanie dodatkowego kodu, który nie jest pokazany w tych przykładach, aby skonfigurować obiekt StoreContext. Aby uzyskać więcej informacji, zobacz Używanie klasy StoreContext w aplikacji desktopowej, która korzysta z Desktop Bridge.

Kupowanie dodatku subskrypcji

W tym przykładzie pokazano, jak zażądać zakupu znanego dodatku subskrypcji dla aplikacji w imieniu bieżącego klienta. W tym przykładzie pokazano również, jak obsłużyć przypadek, w którym subskrypcja ma okres próbny.

  1. Najpierw kod określa, czy klient ma już aktywną licencję dla subskrypcji. Jeśli klient ma już aktywną licencję, kod powinien odblokować funkcje subskrypcji zgodnie z potrzebami (ponieważ jest to specyficzne dla twojej aplikacji, jest to wskazywane komentarzem w przykładzie).
  2. Następnie kod pobiera obiekt StoreProduct reprezentujący subskrypcję, którą chcesz kupić w imieniu klienta. W kodzie przyjęto założenie, że znasz już identyfikatora sklepu dodatku do subskrypcji, który chcesz kupić, oraz że przypisano tę wartość do zmiennej subscriptionStoreId.
  3. Następnie kod określa, czy wersja próbna jest dostępna dla subskrypcji. Opcjonalnie aplikacja może użyć tych informacji, aby wyświetlić szczegółowe informacje o dostępnej wersji próbnej lub pełnej subskrypcji dla klienta.
  4. Na koniec kod wywołuje metodę RequestPurchaseAsync, aby zażądać zakupu subskrypcji. Jeśli wersja próbna jest dostępna dla subskrypcji, wersja próbna będzie oferowana klientowi do zakupu. W przeciwnym razie pełna subskrypcja będzie oferowana do zakupu.
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;
    }
}

Uzyskiwanie informacji na temat dodatków subskrypcji dla bieżącej aplikacji

W tym przykładzie kodu pokazano, jak uzyskać informacje dotyczące wszystkich dodatków subskrypcji dostępnych w aplikacji. Aby uzyskać te informacje, najpierw użyj metody GetAssociatedStoreProductsAsync, aby pobrać kolekcję obiektów StoreProduct reprezentujących każdy z dostępnych dodatków dla aplikacji. Następnie pobierz dla każdego produktu StoreSku i użyj właściwości IsSubscription oraz SubscriptionInfo dla uzyskania dostępu do informacji o subskrypcji.

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

Zarządzanie subskrypcjami z usług

Gdy zaktualizowana aplikacja znajduje się w Sklepie, a klienci mogą kupić dodatek subskrypcji, mogą istnieć scenariusze, w których musisz zarządzać subskrypcją dla klienta. Udostępniamy interfejsy API REST, które można wywołać z Twoich usług, aby wykonać następujące zadania zarządzania subskrypcjami:

Anulowanie

Klienci mogą użyć strony https://account.microsoft.com/services dla swojego konta Microsoft, aby wyświetlić wszystkie subskrypcje, które nabyły, anulować subskrypcję i zmienić formę płatności skojarzonej z subskrypcją. Gdy klient anuluje subskrypcję przy użyciu tej strony, nadal ma dostęp do subskrypcji przez okres bieżącego okresu rozliczeniowego. Nie otrzymują zwrotu kosztów w żadnej części bieżącego okresu rozliczeniowego. Na koniec bieżącego okresu rozliczeniowego ich subskrypcja jest dezaktywowana.

Możesz również anulować subskrypcję w imieniu użytkownika przy użyciu naszego interfejsu API REST, aby zmienić stan rozliczeniowy subskrypcji dla danego użytkownika.

Odnawianie subskrypcji i okresy prolongaty

W pewnym momencie w każdym okresie rozliczeniowym podejmiemy próbę naliczania opłat za kartę kredytową klienta w następnym okresie rozliczeniowym. Jeśli opłata zakończy się niepowodzeniem, subskrypcja klienta wprowadzi stan ponownego uruchamiania. Oznacza to, że ich subskrypcja jest nadal aktywna w pozostałej części bieżącego okresu rozliczeniowego, ale okresowo będziemy próbować obciążać swoją kartę kredytową, aby automatycznie odnowić subskrypcję. Ten stan może trwać do dwóch tygodni, aż do końca bieżącego okresu rozliczeniowego i daty odnowienia na następny okres rozliczeniowy.

Nie oferujemy okresów prolongaty dla rozliczeń subskrypcji. Jeśli nie możemy pomyślnie obciążać karty kredytowej klienta do końca bieżącego okresu rozliczeniowego, subskrypcja zostanie anulowana, a klient nie będzie miał już dostępu do subskrypcji po bieżącym okresie rozliczeniowym.

Nieobsługiwane scenariusze

Następujące scenariusze nie są obecnie obsługiwane w przypadku dodatków subskrypcji.

  • Sprzedaż subskrypcji klientom bezpośrednio za pośrednictwem Sklepu nie jest obecnie obsługiwana. Subskrypcje są dostępne tylko w przypadku zakupów produktów cyfrowych w aplikacji.
  • Klienci nie mogą przełączać okresów subskrypcji przy użyciu strony https://account.microsoft.com/services dla konta Microsoft. Aby przełączyć się na inny okres subskrypcji, klienci muszą anulować bieżącą subskrypcję, a następnie zakupić subskrypcję z innym okresem subskrypcji z poziomu aplikacji.
  • Przełączanie poziomów nie jest obecnie obsługiwane w przypadku dodatków subskrypcyjnych (na przykład przełączanie klienta z subskrypcji podstawowej na subskrypcję premium z większą liczbą funkcji).
  • Kody sprzedaży i promocyjne nie są obecnie obsługiwane dla dodatkowych opcji subskrypcji.
  • Odnawianie istniejących subskrypcji po ustawieniu widoczności dodatku subskrypcji na Zatrzymaj pozyskiwanie. Aby uzyskać więcej informacji, zobacz Ustawianie cennika i dostępności dodatków.