Включение покупок в приложении приложений и надстроек
В этой статье показано, как использовать участников в пространстве имен Windows.Services.Store , чтобы запросить покупку текущего приложения или одной из его надстроек для пользователя. Например, если у пользователя в настоящее время есть пробная версия приложения, вы можете использовать этот процесс для приобретения полной лицензии для пользователя. Кроме того, вы можете использовать этот процесс для приобретения надстройки, например нового уровня игры для пользователя.
Чтобы запросить покупку приложения или надстройки, пространство имен Windows.Services.Store предоставляет несколько различных методов:
- Если вы знаете идентификатор Магазина приложения или надстройки, можно использовать метод RequestPurchaseAsync класса StoreContext.
- Если у вас уже есть объект StoreProduct, StoreSku или StoreAvailability, представляющий приложение или надстройку, можно использовать методы RequestPurchaseAsync этих объектов. Примеры различных способов получения StoreProduct в коде см. в статье "Получение сведений о продукте для приложений и надстроек".
Каждый метод представляет стандартный пользовательский интерфейс покупки пользователю, а затем выполняется асинхронно после завершения транзакции. Метод возвращает объект, указывающий, выполнена ли транзакция успешно.
Примечание.
Пространство имен Windows.Services.Store было введено в Windows 10 версии 1607, и его можно использовать только в проектах, предназначенных для Windows 10 Anniversary Edition (10.0; Сборка 14393) или более поздняя версия в Visual Studio. Если приложение предназначено для более ранней версии Windows 10, необходимо использовать пространство имен Windows.ApplicationModel.Store вместо пространства имен Windows.Services.Store . Дополнительные сведения см. в этой статье.
Необходимые компоненты
В этом примере имеются следующие предварительные требования:
- Проект Visual Studio для приложения универсальная платформа Windows (UWP), предназначенного для Windows 10 Anniversary Edition (10.0; Сборка 14393) или более поздней версии.
- Вы создали отправку приложений в Центре партнеров, и это приложение опубликовано в Магазине. При необходимости можно настроить приложение, чтобы оно не было обнаружено в Магазине во время его тестирования. Дополнительные сведения см. в руководстве по тестированию.
- Если вы хотите включить покупки в приложении для надстройки для приложения, необходимо также создать надстройку в Центре партнеров.
В этом примере предполагается, что код:
- Код выполняется в контексте страницы, содержащей ProgressRing с именем
workingProgressRing
и textBlock.textBlock
Эти объекты используются для указания, что выполняется асинхронная операция и для отображения выходных сообщений соответственно. - Файл кода содержит инструкцию using для пространства имен Windows.Services.Store .
- Приложение — это однопользовательское приложение, которое запускается только в контексте пользователя, запускающего приложение. Дополнительные сведения см. в разделе "Покупки в приложении" и пробные версии.
Примечание.
Если у вас есть классическое приложение, использующее мост для классических приложений, может потребоваться добавить дополнительный код, не показанный в этом примере, чтобы настроить объект StoreContext. Дополнительные сведения см. в разделе "Использование класса StoreContext" в классическом приложении, использующего мост для классических приложений.
Пример кода
В этом примере показано, как использовать метод RequestPurchaseAsync класса StoreContext для приобретения приложения или надстройки с известным идентификатором Магазина. Полный пример приложения см. в примере Магазина.
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;
}
}