如何确定Windows Store应用程序的附加订阅是处于试用期还是处于付费期

时间:2019-02-23 01:34:51

标签: c# windows-store-apps subscription add-on

我正在使用Windows.Services.Store API向Windows商店中发布的Desktop Bridge应用程序添加附加订阅。

我创建了一个为期3个月的订阅测试附件,并提供了1周的试用期。我可以通过从我的应用中调用StoreContext.GetAppLicenseAsync方法来获得一个StoreAppLicence实例,然后从其AddOnLicenses属性中找到一个SkuStoreId与{首先是测试插件。但是,由于此订阅不具有StoreAppLicence之类的IsTrial属性,因此无法确定此订阅是处于试用期还是处于付费(完整)期。

因此,我想确定如何确定订阅是处于试用期还是处于付费期,以便向用户显示我的应用程序中的订阅状态。

更新

我还不太清楚,但是我想问的是当前用户已经“购买”了免费订阅的附加订阅之后的情况。我想知道如何确定试用期是否尚未结束或试用期是否已过,并且订阅已移至付费(完整)期。

可能可以通过以下方式来实现:在用户“本地”购买“订购”时存储数据,并将其与当前日期进行比较,但这似乎并不理想,因为可能与Windows Store管理的数据不一致服务器。

2 个答案:

答案 0 :(得分:0)

C#示例:

val pair: Pair<TypeA, TypeB> = ...

object.run/*apply*/ {
    val (first, second) = this
    ...
} // longer
object.let/*also*/ { (first, second) -> ... } // shorter

从示例Purchase a subscription add-on和类StoreSku Class派生

更新

如果用户可以使用订阅,则只有两种可能性,一种是试用期,另一种是他们已经购买。 代码中的方法( GetSubscriptionProductAsync )获取用户可以使用的订阅,您可以在示例( Purchase a cubscription add-on )中查看详细信息。属性HasTrialPeriod获取一个值,该值指示预订是否包含试用期。

答案 1 :(得分:0)

可能我找到了解决方法。

通过IsTrial方法获得的StoreCollectionData

StoreContext.GetUserCollectionAsync属性提供了我所需要的信息。此外,StoreCollectionData还包括AcquiredDate属性,该属性指示订阅附件的购买日期,可用于自行计算到期日期。以我的经验,通过ExpirationDate方法获得的StoreLicense的StoreContext.GetAppLicenseAsync属性似乎不准确(比实际失效日期晚三天)。

示例代码如下。

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方法上仍然存在一个奇怪的问题。它仅提供有关最新加载项的信息,而从其解释中,应提供有关所有加载项的信息。因此,如果您要检查多个加载项,此方法将是不够的。