支持应用内购买应用和加载项
本文介绍了如何使用 Windows.Services.Store 命名空间中的成员,请求为用户购买当前应用或其加载项之一。 例如,如果用户当前有应用的试用版,可以使用此过程为用户购买完整版。 或者,你可以使用此过程购买加载项,如用户的新游戏关卡。
若要请求购买应用或加载项,Windows.Services.Store 命名空间提供了几个不同方法:
- 如果你知道应用或加载项的应用商店 ID,可以使用 StoreContext 类的 RequestPurchaseAsync 方法。
- 如果你已有表示应用或加载项的 StoreProduct、StoreSku 或 StoreAvailability 对象,可以使用这些对象的 RequestPurchaseAsync 方法。 有关可用于在你的代码中检索StoreProduct 的不同方法的示例,请参阅获取应用和加载项的产品信息。
每个方法都为用户提供标准购买 UI,随后在交易完成后异步完成这些方法。 该方法返回一个指示该交易是否已成功的对象。
注意
Windows.Services.Store 命名空间在 Windows 10 版本 1607 中引入,它仅可用于面向 Windows 10 周年纪念版(10.0;版本 14393)或 Visual Studio 更高版本的项目中。 如果你的应用面向 Windows 10 的较早版本,则必须使用 Windows.ApplicationModel.Store 命名空间来替代 Windows.Services.Store 命名空间。 有关详细信息,请参阅此文章。
先决条件
本示例有以下先决条件:
- 适用于面向 Windows 10 周年纪念版(10.0;版本 14393)或更高版本的通用 Windows 平台 (UWP) 应用的 Visual Studio 项目。
- 你已在合作伙伴中心中创建应用提交,并且此应用已在应用商店中发布。 在测试应用期间,你可以选择将应用配置为在 Microsoft Store 中隐藏。 有关详细信息,请参阅我们的测试指南。
- 如果你想要对应用的某个加载项启用应用内购买,还必须在合作伙伴中心中创建加载项。
此示例中的代码假设:
- 代码在含有 ProgressRing(名为 )和 TextBlock(名为
textBlock
)的workingProgressRing
页面的上下文中运行。 这些对象分别用于指示是否正在进行异步操作和显示输出消息。 - 代码文件有一个适用于 Windows.Services.Store 命名空间的 using 语句。
- 该应用是单用户应用,仅在启动该应用的用户上下文中运行。 有关详细信息,请参阅应用内购买和试用。
注意
如果你有使用桌面桥的桌面应用程序,可能需要添加不在此示例中显示的额外代码来配置 StoreContext 对象。 有关更多信息,请参阅在使用桌面桥的桌面应用程序中使用 StoreContext 类。
代码示例
此示例演示如何使用 StoreContext 类的 RequestPurchaseAsync 方法,购置具有已知应用商店 ID 的应用或加载项。 有关完整的应用程序示例,请参阅 Microsoft Store 示例。
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;
}
}