如何判断Windows商店应用的附加订阅是试用期还是付费期
How to determine whether add-on subscription of Windows Store app is in trial period or in paid period
我正在使用 Windows.Services.Store API 为我在 Windows 商店中发布的桌面桥应用程序添加附加订阅。
我创建了一个试用期为 3 个月、试用期为 1 周的测试插件。我可以得到一个 StoreAppLicence instance by StoreContext.GetAppLicenseAsync
method calling from my app and then from its AddOnLicenses
property, find a StoreLicense 实例,它的 SkuStoreId
一开始就与测试插件的 StoreId 相匹配。但是不知道这个订阅是试用期还是付费(全)期,因为它没有像 StoreAppLicence 那样的 IsTrial
属性.
所以我想知道如何确定订阅是处于试用期还是付费期,以便向我的用户显示我的应用程序中的订阅状态。
更新
我不是很清楚,但我想问的是当前用户有"purchased"附加订阅作为免费试用后的情况。我想知道如何确定试用期尚未结束或试用期已过且订阅已转为付费(完整)期。
可能我可以通过在本地存储用户 "purchased" 订阅的数据并将其与当前日期进行比较来实现它,但这似乎并不理想,因为可能与数据不一致由 Windows 存储服务器管理。
C# 示例:
subscriptionStoreProduct = await GetSubscriptionProductAsync();
if (subscriptionStoreProduct == null)
{
return;
}
// Check if the first SKU is a trial and notify the customer that a trial is available.
// If a trial is available, the Skus array will always have 2 purchasable SKUs and the
// first one is the trial. Otherwise, this array will only have one SKU.
StoreSku sku = subscriptionStoreProduct.Skus[0];
if (sku.SubscriptionInfo.HasTrialPeriod)
{
// You can display the subscription trial info to the customer here. You can use
// sku.SubscriptionInfo.TrialPeriod and sku.SubscriptionInfo.TrialPeriodUnit
// to get the trial details.
}
else
{
// You can display the subscription purchase info to the customer here. You can use
// sku.SubscriptionInfo.BillingPeriod and sku.SubscriptionInfo.BillingPeriodUnit
// to provide the renewal details.
}
从样本中得出 Purchase a subscription add-on and Class StoreSku Class
更新
如果用户可以使用订阅,只有两种可能,一种是试用期,一种是已经购买。
代码中的方法(GetSubscriptionProductAsync)获取用户可以使用的订阅,具体可以看示例(Purchase a cubscription add-on). The property HasTrialPeriod获取一个值表示订阅是否包含试用期。
可能我找到了解决办法。
通过StoreContext.GetUserCollectionAsync
方法获得的IsTrial
属性 of StoreCollectionData提供了我需要的信息。此外,StoreCollectionData 还包括 AcquiredDate
属性 指示订阅附加组件的购买日期,可用于自行计算到期日期。根据我的经验,通过StoreContext.GetAppLicenseAsync
方法获得的StoreLicense ExpirationDate
属性似乎不准确(比实际到期日期晚3天)。
示例代码如下。
public enum LicenseStatus
{
Unknown = 0,
Trial,
Full
}
private static StoreContext _context;
public static async Task<(string storeId, LicenseStatus status, DateTimeOffset acquiredDate)[]> GetSubscriptionAddonStatusesAsync()
{
if (_context is null)
_context = StoreContext.GetDefault();
StoreProductQueryResult queryResult = await _context.GetUserCollectionAsync(new[] { "Durable" });
if (queryResult.ExtendedError != null)
throw queryResult.ExtendedError;
IEnumerable<(string, LicenseStatus, DateTimeOffset)> Enumerate()
{
foreach (KeyValuePair<string, StoreProduct> pair in queryResult.Products)
{
StoreSku sku = pair.Value.Skus.FirstOrDefault();
StoreCollectionData data = sku?.CollectionData;
if (data != null)
{
LicenseStatus status = data.IsTrial ? LicenseStatus.Trial : LicenseStatus.Full;
yield return (pair.Key, status, data.AcquiredDate);
}
}
}
return Enumerate().ToArray();
}
另一方面,StoreContext.GetUserCollectionAsync
方法仍然存在一个奇怪的事情。它只提供最新插件的信息,而从它的解释来看,它应该提供所有插件的信息。因此,如果你想检查多个附加组件,这种方法是不够的。
我正在使用 Windows.Services.Store API 为我在 Windows 商店中发布的桌面桥应用程序添加附加订阅。
我创建了一个试用期为 3 个月、试用期为 1 周的测试插件。我可以得到一个 StoreAppLicence instance by StoreContext.GetAppLicenseAsync
method calling from my app and then from its AddOnLicenses
property, find a StoreLicense 实例,它的 SkuStoreId
一开始就与测试插件的 StoreId 相匹配。但是不知道这个订阅是试用期还是付费(全)期,因为它没有像 StoreAppLicence 那样的 IsTrial
属性.
所以我想知道如何确定订阅是处于试用期还是付费期,以便向我的用户显示我的应用程序中的订阅状态。
更新
我不是很清楚,但我想问的是当前用户有"purchased"附加订阅作为免费试用后的情况。我想知道如何确定试用期尚未结束或试用期已过且订阅已转为付费(完整)期。
可能我可以通过在本地存储用户 "purchased" 订阅的数据并将其与当前日期进行比较来实现它,但这似乎并不理想,因为可能与数据不一致由 Windows 存储服务器管理。
C# 示例:
subscriptionStoreProduct = await GetSubscriptionProductAsync();
if (subscriptionStoreProduct == null)
{
return;
}
// Check if the first SKU is a trial and notify the customer that a trial is available.
// If a trial is available, the Skus array will always have 2 purchasable SKUs and the
// first one is the trial. Otherwise, this array will only have one SKU.
StoreSku sku = subscriptionStoreProduct.Skus[0];
if (sku.SubscriptionInfo.HasTrialPeriod)
{
// You can display the subscription trial info to the customer here. You can use
// sku.SubscriptionInfo.TrialPeriod and sku.SubscriptionInfo.TrialPeriodUnit
// to get the trial details.
}
else
{
// You can display the subscription purchase info to the customer here. You can use
// sku.SubscriptionInfo.BillingPeriod and sku.SubscriptionInfo.BillingPeriodUnit
// to provide the renewal details.
}
从样本中得出 Purchase a subscription add-on and Class StoreSku Class
更新
如果用户可以使用订阅,只有两种可能,一种是试用期,一种是已经购买。 代码中的方法(GetSubscriptionProductAsync)获取用户可以使用的订阅,具体可以看示例(Purchase a cubscription add-on). The property HasTrialPeriod获取一个值表示订阅是否包含试用期。
可能我找到了解决办法。
通过StoreContext.GetUserCollectionAsync
方法获得的IsTrial
属性 of StoreCollectionData提供了我需要的信息。此外,StoreCollectionData 还包括 AcquiredDate
属性 指示订阅附加组件的购买日期,可用于自行计算到期日期。根据我的经验,通过StoreContext.GetAppLicenseAsync
方法获得的StoreLicense ExpirationDate
属性似乎不准确(比实际到期日期晚3天)。
示例代码如下。
public enum LicenseStatus
{
Unknown = 0,
Trial,
Full
}
private static StoreContext _context;
public static async Task<(string storeId, LicenseStatus status, DateTimeOffset acquiredDate)[]> GetSubscriptionAddonStatusesAsync()
{
if (_context is null)
_context = StoreContext.GetDefault();
StoreProductQueryResult queryResult = await _context.GetUserCollectionAsync(new[] { "Durable" });
if (queryResult.ExtendedError != null)
throw queryResult.ExtendedError;
IEnumerable<(string, LicenseStatus, DateTimeOffset)> Enumerate()
{
foreach (KeyValuePair<string, StoreProduct> pair in queryResult.Products)
{
StoreSku sku = pair.Value.Skus.FirstOrDefault();
StoreCollectionData data = sku?.CollectionData;
if (data != null)
{
LicenseStatus status = data.IsTrial ? LicenseStatus.Trial : LicenseStatus.Full;
yield return (pair.Key, status, data.AcquiredDate);
}
}
}
return Enumerate().ToArray();
}
另一方面,StoreContext.GetUserCollectionAsync
方法仍然存在一个奇怪的事情。它只提供最新插件的信息,而从它的解释来看,它应该提供所有插件的信息。因此,如果你想检查多个附加组件,这种方法是不够的。