PAYATHON 2026

如何通过 API 创建 Microsoft Store Subscription Add-On?

数据阿明

结论

目前,Microsoft Store submission API 没有提供为 UWP 产品创建 Subscription 类型 Add-On 的公开接口。

Create an add-on API 只支持以下两种类型:

  • Durable
  • Consumable

因此,订阅型 Add-On 需要先在 Microsoft Partner Center 中手动创建并完成配置。创建后,可以通过相关 API 查询用户订阅、修改订阅的计费状态,也可以在应用内获取和销售订阅,但无法通过 API 自动创建新的订阅商品定义。

原因

这里涉及两类不同的操作:

  1. 创建 Store 产品

    在 Partner Center 中为应用新增 Add-On,并配置商品 ID、订阅周期、价格、市场和提交信息。

  2. 管理用户已有的订阅权益

    例如查询某位用户拥有的订阅,或者变更该订阅的计费状态。

Get subscriptions for a user 和 Change the billing state of a subscription for a user 属于第二类。它们只能操作已经存在于 Microsoft Store 中,并且已经关联到用户的订阅,不能创建新的 Add-On 商品。

Store submission API 虽然提供了 Create an add-on 操作,但支持的产品类型不包括 Subscription。把类型字符串改成 Subscription、伪造请求字段,或者先创建 Durable 再修改类型,都无法绕过这一限制。

可行的处理方式

1. 在 Partner Center 中创建订阅

进入目标应用的产品页面,新增 Add-On 并选择订阅类型,然后配置:

  • Store product ID
  • 订阅周期
  • 定价和可用市场
  • 显示名称与说明
  • 发布和提交信息

Partner Center 的界面可能调整,具体入口名称也可能随之变化,但订阅商品的首次创建仍需在后台完成。

2. 记录稳定的商品标识

创建订阅后,保存其 Store ID,或者应用用来识别商品的 ID。应用代码和服务端逻辑应通过这个标识引用订阅,不要依赖后台显示名称。

例如,可以在应用配置中维护订阅映射:

{
  "subscriptions": {
    "monthly": "your-monthly-subscription-store-id",
    "yearly": "your-yearly-subscription-store-id"
  }
}

这些值只是占位符,必须替换为 Partner Center 中实际生成或配置的标识。

3. 在应用中获取订阅商品

订阅发布并对目标测试账号或市场可见后,可以通过 Windows Store SDK 查询指定商品:

using System.Collections.Generic;
using Windows.Services.Store;

StoreContext context = StoreContext.GetDefault();

string[] storeIds =
{
    "your-monthly-subscription-store-id",
    "your-yearly-subscription-store-id"
};

StoreProductQueryResult result =
    await context.GetStoreProductsAsync(
        new[] { "Durable" },
        storeIds);

if (result.ExtendedError != null)
{
    // 记录或处理查询失败
    return;
}

foreach (KeyValuePair<string, StoreProduct> item in result.Products)
{
    StoreProduct product = item.Value;

    string title = product.Title;
    string price = product.Price.FormattedPrice;
}

Store SDK 查询订阅商品时使用的分类,与 Partner Center 中的 Add-On 类型名称不一定完全相同。上面的 "Durable" 是 StoreContext API 查询 Add-On 时使用的产品种类,并不表示可以先用 submission API 创建一个 Durable,再将其转换为订阅。实际可用值应以当前 Windows Store SDK 文档和目标应用的商品配置为准。

4. 发起购买

取得对应的 StoreProduct 后,可以请求购买:

StorePurchaseResult purchaseResult =
    await product.RequestPurchaseAsync();

switch (purchaseResult.Status)
{
    case StorePurchaseStatus.Succeeded:
        // 购买成功;仍建议从权益查询结果确认最终授权状态
        break;

    case StorePurchaseStatus.AlreadyPurchased:
        // 当前账户已经拥有相应权益
        break;

    case StorePurchaseStatus.NotPurchased:
        // 用户取消,或交易未完成
        break;

    case StorePurchaseStatus.NetworkError:
    case StorePurchaseStatus.ServerError:
        // 根据业务策略提示用户稍后重试
        break;
}

5. 使用服务端 API 管理已有订阅

只有当订阅商品已经存在,并且用户已经购买或获得对应权益后,才使用服务端 API:

  • 查询用户拥有的订阅;
  • 检查订阅状态和有效期;
  • 在受支持的业务场景中变更计费状态;
  • 根据 Store 返回的权益结果控制服务访问。

这些接口使用的订阅标识必须对应已经创建的 Store 商品,不能用来即时生成新的订阅 SKU。

自动化上的替代方案

如果需要为多个环境或多个应用批量部署同一组订阅,目前较稳妥的做法是:

  1. 手动创建每个订阅 Add-On;
  2. 为不同环境维护 Store ID 映射;
  3. 使用 Store submission API 自动完成后续受支持的更新和提交步骤;
  4. 在发布流水线中检查所需订阅 ID 是否已经配置。如果缺失,立即终止部署并提示人工处理。

例如:

var subscriptionIds = configuration
    .GetSection("Store:Subscriptions")
    .Get<string[]>();

if (subscriptionIds == null || subscriptionIds.Length == 0)
{
    throw new InvalidOperationException(
        "未配置 Microsoft Store Subscription Add-On ID。请先在 Partner Center 中创建订阅。");
}

注意事项

  • “创建订阅商品”和”为用户管理订阅”是两类不同的操作。
  • Add-On 的产品类型通常不能在创建后随意转换,不要把 Durable 或 Consumable 当作订阅占位符。
  • 在 Partner Center 中创建订阅后,它不一定会立即对所有账号和市场可见。提交状态、市场、定价、测试账号和缓存都可能影响查询结果。
  • 客户端返回购买成功后,如果涉及服务器资源或长期权益,仍应通过可信的 Store 权益数据进行验证。
  • Store API 和 Partner Center 的能力可能调整。如果微软以后扩展 submission API,应以届时官方文档中 Create an add-on 接口明确列出的受支持类型为准。

备注:内容仅供参考。