StoreProduct IsInUserCollection 始终为 false

StoreProduct IsInUserCollection is always false

我们在 Microsoft Store 中有一个 UWP 产品。该产品有许多订阅附加组件。用户在应用程序内购买订阅附加组件。 编辑 我们的代码是从微软文档中拼凑出来的 Enable subscription add-ons for your app

StorePurchaseResult result = await product.RequestPurchaseAsync();
if (result.Status == StorePurchaseStatus.Succeeded)

结果returnsStorePurchaseStatus.Succeeded。微软拿了用户的钱用于订阅附加组件。目前一切顺利。

我们得到了这样的产品列表

string[] productKinds = { "Durable" };
List<String> filterList = new List<string>(productKinds);

StoreProductQueryResult queryResult = await storeContext.GetAssociatedStoreProductsAsync(filterList);
productList = queryResult.Products.Values.ToList();

然后遍历

foreach (StoreProduct storeProduct in products)
{
    if (storeProduct.IsInUserCollection)
...
}

storeProduct.IsInUserCollection 总是 returns 错误。 Microsoft 已接受附加组件的付款,但未将其添加到用户的产品集合中,因此我们无法验证他们是否已为附加组件付款。

我们哪里错了?

编辑 2 根据@lukeja 的建议我运行 这个方法

async Task CheckSubsAsync()
{
    StoreContext context = context = StoreContext.GetDefault();
    StoreAppLicense appLicense = await context.GetAppLicenseAsync();

    foreach (var addOnLicense in appLicense.AddOnLicenses)
    {
        StoreLicense license = addOnLicense.Value;
        Debug.WriteLine($"license.SkuStoreId {license.SkuStoreId}");
    }
}

这只输出一个附加组件。免费的附加组件。我们有 16 个附加组件,其中只有一个是免费的。

为什么我们的付费附加订阅没有返回?

EDIT 3 appLicense.AddOnLicenses 仅包括当前用户的附加许可,而不是应用程序的所有附加许可。当 运行 在支付订阅的用户的上下文中时,@lukeja 提供的代码示例按预期工作。

我不确定您为什么要使用该方法。我目前在我的应用程序中执行此操作的方式以及 Microsoft 文档建议的方式是这样的...

private async Task<bool> CheckIfUserHasSubscriptionAsync()
{
    StoreAppLicense appLicense = await context.GetAppLicenseAsync();

    // Check if the customer has the rights to the subscription.
    foreach (var addOnLicense in appLicense.AddOnLicenses)
    {
        StoreLicense license = addOnLicense.Value;

        if (license.IsActive)
        {
            // The expiration date is available in the license.ExpirationDate property.
            return true;
        }
    }

    // The customer does not have a license to the subscription.
    return false;
}