如何通过 API 创建 Microsoft Store Subscription Add-On?
结论
目前,Microsoft Store submission API 没有提供为 UWP 产品创建 Subscription 类型 Add-On 的公开接口。
Create an add-on API 只支持以下两种类型:
DurableConsumable
因此,订阅型 Add-On 需要先在 Microsoft Partner Center 中手动创建并完成配置。创建后,可以通过相关 API 查询用户订阅、修改订阅的计费状态,也可以在应用内获取和销售订阅,但无法通过 API 自动创建新的订阅商品定义。
原因
这里涉及两类不同的操作:
-
创建 Store 产品
在 Partner Center 中为应用新增 Add-On,并配置商品 ID、订阅周期、价格、市场和提交信息。
-
管理用户已有的订阅权益
例如查询某位用户拥有的订阅,或者变更该订阅的计费状态。
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。
自动化上的替代方案
如果需要为多个环境或多个应用批量部署同一组订阅,目前较稳妥的做法是:
- 手动创建每个订阅 Add-On;
- 为不同环境维护 Store ID 映射;
- 使用 Store submission API 自动完成后续受支持的更新和提交步骤;
- 在发布流水线中检查所需订阅 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接口明确列出的受支持类型为准。
备注:内容仅供参考。
