启用应用内产品购买

无论应用是否免费,都可以从应用内直接销售内容、其他应用或新应用功能(例如解锁游戏的下一级别)。 下面介绍如何在应用中启用这些产品。

重要

本文演示如何使用 Windows.ApplicationModel.Store 命名空间的成员来启用应用内产品购买。 此命名空间不再使用新功能进行更新,建议改用 Windows.Services.Store 命名空间。 Windows.Services.Store 命名空间支持最新的加载项类型,例如应用商店管理的易耗型加载项和订阅,旨在与合作伙伴中心和应用商店支持的未来产品和功能类型兼容。 Windows.Services.Store 命名空间是在 Windows 10 版本 1607 中引入的,并且只能在面向 Windows 10 周年版(10.0; 版本 14393) 或更高版本的项目中使用,需在 Visual Studio 中构建。 有关使用 Windows.Services.Store 命名空间来启用内购功能的更多信息,请参阅 本文

注释

无法从应用的试用版提供应用内产品。 使用应用试用版的客户只有在购买应用的完整版本时才能购买应用内产品。

先决条件

  • 一个 Windows 应用,用于添加客户购买的功能。
  • 首次编码和测试新的应用内产品时,必须使用 CurrentAppSimulator 对象,而不是 CurrentApp 对象。 这样,就可以使用对许可证服务器的模拟调用来验证许可证逻辑,而不是调用实时服务器。 为此,需要在 %userprofile%\AppData\local\packages\<包名称>\LocalState\Microsoft\Windows 应用商店\ApiData 中自定义名为 WindowsStoreProxy.xml 的文件。 Microsoft Visual Studio 模拟器首次运行应用时创建此文件,也可以在运行时加载自定义文件。 有关详细信息,请参阅 将 WindowsStoreProxy.xml 文件与 CurrentAppSimulator一起使用。
  • 本主题还引用 Store 示例中提供的代码示例。 此示例是获取针对通用 Windows 平台(UWP)应用提供的不同货币化选项的实践体验的好方法。

步骤 1:初始化应用的许可证信息

在应用初始化时,首先通过初始化 CurrentAppCurrentAppSimulator 获取应用的 LicenseInformation 对象,以启用应用内产品的购买。

void InitializeApp()
{
    // Some app initialization code...

    // Initialize the license info for use in the app that is uploaded to the Store.
    // Uncomment the following line in the release version of your app.
    //   licenseInformation = CurrentApp.LicenseInformation;

    // Initialize the license info for testing.
    // Comment the following line in the release version of your app.
    licenseInformation = CurrentAppSimulator.LicenseInformation;

    // Other app initialization code...
}

步骤 2:将应用内优惠添加到应用中

对于想要通过应用内产品提供的每个功能,请创建产品/服务并将其添加到应用。

重要

在将应用提交到应用商店之前,必须先将所有希望向客户展示的应用内产品添加到你的应用中。 如果以后想要添加新的应用内产品,则必须更新应用并重新提交新版本。

  1. 创建应用内优惠令牌

    可以通过令牌标识应用中的每个应用内产品。 此令牌是在应用和应用商店中定义和使用以标识特定应用内产品的字符串。 为它提供唯一(对你的应用)和有意义的名称,以便你可以在编码时快速识别它所代表的正确功能。 下面是名称的一些示例:

    • “SpaceMissionLevel4”
    • “ContosoCloudSave”
    • “RainbowThemePack”

注释

在代码中使用的应用内优惠令牌必须与您在合作伙伴中心为应用定义相应加载项 时指定的 产品 ID 值相匹配。

  1. 对条件块中的功能进行编码

    必须将与应用内产品关联的每个功能的代码放在条件块中,以测试客户是否具有使用该功能的许可证。

    下面是一个示例,展示如何在特定于许可证的条件块中为名为 featureName 的产品功能实现代码。 字符串,featureName,是在应用中唯一标识此产品的令牌,也用于在商店中标识它。

    if (licenseInformation.ProductLicenses["featureName"].IsActive)
    {
        // the customer can access this feature
    }
    else
    {
        // the customer can' t access this feature
    }
    
  2. 为此功能添加购买 UI

    你的应用还必须为客户提供一种方法来购买应用内产品提供的产品或功能。 他们无法以购买完整应用的方式通过应用商店购买它们。

    下面介绍如何测试你的客户是否已经拥有应用内产品,如果他们没有,则显示购买对话框,以便他们可以购买它。 将注释“显示购买对话框”替换为购买对话框的自定义代码(例如一个页面,其中带有一个友好的“购买此应用!”按钮)。

    async void BuyFeature()
    {
        if (!licenseInformation.ProductLicenses["featureName"].IsActive)
        {
            try
            {
                // The customer doesn't own this feature, so
                // show the purchase dialog.
                await CurrentAppSimulator.RequestProductPurchaseAsync("featureName", false);
    
                //Check the license state to determine if the in-app purchase was successful.
            }
            catch (Exception)
            {
                // The in-app purchase was not completed because
                // an error occurred.
            }
        }
        else
        {
            // The customer already owns this feature.
        }
    }
    

步骤 3:将测试代码更改为最终调用

在应用的代码中,将每个对 CurrentAppSimulator 的引用替换为 CurrentApp。 不再需要提供 WindowsStoreProxy.xml 文件,因此请将其从应用的路径中删除(尽管你可能希望在下一步中配置应用内产品/服务时将其保存以供参考)。

步骤 4:在应用商店中配置应用内产品优惠

在合作伙伴中心,导航到应用并 创建与应用内产品/服务匹配的加载项。 定义加载项的产品 ID、类型、价格和其他属性。 请确保将其配置为与测试时在 WindowsStoreProxy.xml 中设置的配置完全相同。

注释

在代码中使用的应用内优惠令牌必须与在微软合作伙伴中心为相应加载项指定的 产品 ID 值进行匹配。

注解

如果你有兴趣向客户提供消耗型应用内产品选项(可以被购买、用尽,然后根据需要再次购买的项目),请转到 启用消耗型应用内产品购买 主题。

如果需要使用收据来验证用户是否已进行应用内购买,请务必查看 使用收据验证产品购买