如何判断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 方法仍然存在一个奇怪的事情。它只提供最新插件的信息,而从它的解释来看,它应该提供所有插件的信息。因此,如果你想检查多个附加组件,这种方法是不够的。