Поддержка покупок приложений и надстроек из приложенияEnable in-app purchases of apps and add-ons

В этой статье показано, как использовать члены из пространства имен Windows.Services.Store для запроса приобретения для пользователя текущего приложения или одной из его надстроек.This article demonstrates how to use members in the Windows.Services.Store namespace to request the purchase the current app or one of its add-ons for the user. Например, если пользователь в данный момент имеет пробную версию приложения, можно использовать этот процесс, чтобы приобрести для пользователя полную лицензию.For example, if the user currently has a trial version of the app, you can use this process to purchase a full license for the user. Кроме того, этот процесс можно использовать для покупки для пользователя надстройки, например нового уровня игры.Alternatively, you can use this process to purchase an add-on, such as a new game level for the user.

Для запроса приобретения приложения или надстройки в пространстве имен Windows.Services.Store предусмотрено несколько различных методов.To request the purchase of an app or add-on, the Windows.Services.Store namespace provides several different methods:

Каждый метод предоставляет стандартный интерфейс покупки для пользователя, затем завершается асинхронно после завершения транзакции.Each method presents a standard purchase UI to the user and then completes asynchronously after the transaction is complete. Метод возвращает объект, который указывает, была ли транзакция выполнена успешно.The method returns an object that indicates whether the transaction was successful.

Примечание

Пространство имен Windows.Services.Store впервые появилось в Windows 10 версии 1607 и может использоваться только в проектах, предназначенных для Windows 10 Anniversary Edition (10.0; сборка 14393) или более поздней версии в Visual Studio.The Windows.Services.Store namespace was introduced in Windows 10, version 1607, and it can only be used in projects that target Windows 10 Anniversary Edition (10.0; Build 14393) or a later release in Visual Studio. Если приложение предназначено для предыдущих версий Windows 10, необходимо использовать пространство имен Windows.ApplicationModel.Store, а не пространство имен Windows.Services.Store.If your app targets an earlier version of Windows 10, you must use the Windows.ApplicationModel.Store namespace instead of the Windows.Services.Store namespace. Дополнительные сведения см. в этой статье.For more information, see this article.

Предварительные требованияPrerequisites

Для этого примера необходимо выполнение следующих предварительных условий:This example has the following prerequisites:

  • Создан проект Visual Studio для приложения универсальной платформы Windows (UWP), предназначенный для Windows 10 Anniversary Edition (10.0; сборка 14393) и более поздних выпусков.A Visual Studio project for a Universal Windows Platform (UWP) app that targets Windows 10 Anniversary Edition (10.0; Build 14393) or a later release.
  • Вы создали отправку приложения в центре партнеров, и это приложение публикуется в магазине.You have created an app submission in Partner Center and this app is published in the Store. При необходимости можно настроить приложение, чтобы его нельзя было найти в Магазине, пока вы его тестируете.You can optionally configure the app so it is not discoverable in the Store while you test it. Подробнее см. в нашем руководстве по тестированию.For more information, see our testing guidance.
  • Если вы хотите включить покупки в приложении для надстройки приложения, необходимо также создать надстройку в центре партнеров.If you want to enable in-app purchases for an add-on for the app, you must also create the add-on in Partner Center.

В коде из этого примера предполагается следующее:The code in this example assumes:

  • Код выполняется в контексте страницы Page, которая содержит ProgressRing с именем workingProgressRing и TextBlock с именем textBlock.The code runs in the context of a Page that contains a ProgressRing named workingProgressRing and a TextBlock named textBlock. Эти объекты используются для индикации выполнения асинхронной операции и отображения выводимых сообщений, соответственно.These objects are used to indicate that an asynchronous operation is occurring and to display output messages, respectively.
  • Файл кода содержит оператор using для пространства имен Windows.Services.Store.The code file has a using statement for the Windows.Services.Store namespace.
  • Приложение — однопользовательское и выполняется только в контексте пользователя, запустившего его.The app is a single-user app that runs only in the context of the user that launched the app. Подробнее см. в разделе Покупки из приложения и пробные версии.For more information, see In-app purchases and trials.

Примечание

Если у вас есть классическое приложение, которое использует мост для классических приложений, вам может потребоваться добавить дополнительный код, не показанный в этом примере, для настройки объекта StoreContext.If you have a desktop application that uses the Desktop Bridge, you may need to add additional code not shown in this example to configure the StoreContext object. Дополнительные сведения см. в разделе Использование класса StoreContext в классическом приложении, в котором применяется мост для классических приложений.For more information, see Using the StoreContext class in a desktop application that uses the Desktop Bridge.

Пример кодаCode example

В этом примере показано, как использовать метод RequestPurchaseAsync класса StoreContext для приобретения приложения или надстройки с известным кодом продукта в Магазине.This example demonstrates how to use the RequestPurchaseAsync method of the StoreContext class to purchase an app or add-on with a known Store ID. Полный пример приложения см. в разделе Пример для Магазина.For a complete sample application, see the Store sample.

private StoreContext context = null;

public async void PurchaseAddOn(string storeId)
{
    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.
    }

    workingProgressRing.IsActive = true;
    StorePurchaseResult result = await context.RequestPurchaseAsync(storeId);
    workingProgressRing.IsActive = false;

    // 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.AlreadyPurchased:
            textBlock.Text = "The user has already purchased the product.";
            break;

        case StorePurchaseStatus.Succeeded:
            textBlock.Text = "The purchase was successful.";
            break;

        case StorePurchaseStatus.NotPurchased:
            textBlock.Text = "The purchase did not complete. " +
                "The user may have cancelled the purchase. ExtendedError: " + extendedError;
            break;

        case StorePurchaseStatus.NetworkError:
            textBlock.Text = "The purchase was unsuccessful due to a network error. " +
                "ExtendedError: " + extendedError;
            break;

        case StorePurchaseStatus.ServerError:
            textBlock.Text = "The purchase was unsuccessful due to a server error. " +
                "ExtendedError: " + extendedError;
            break;

        default:
            textBlock.Text = "The purchase was unsuccessful due to an unknown error. " +
                "ExtendedError: " + extendedError;
            break;
    }
}

ВидеоVideo

Посмотрите видеоролик, чтобы ознакомиться с общими сведениями о том, как реализовать покупки из приложения в вашем приложении.Watch the following video for an overview of how to implement in-app purchases in your app.