You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C# Avalonia MSIX应用GetCustomerPurchaseIdAsync返回空值/401未授权求助

排查方向与解决方案

针对你遇到的Windows.Services.Store.GetCustomerPurchaseIdAsync返回空字符串、Windows.ApplicationModel.Store.CurrentApp.GetCustomerPurchaseIdAsync抛出401的问题,结合流程突然失效的情况,可从以下几个方向排查:

1. 访问令牌有效性核验

  • 用JWT解析工具解析服务端获取的令牌,重点确认:
    • aud声明是否严格等于https://onestore.microsoft.com/b2b/keys/create/purchase
    • exp声明是否未过期
    • 令牌包含的权限(scproles字段)是否匹配服务管理权益要求
  • 确认服务端请求令牌时的scopes参数为https://onestore.microsoft.com/b2b/keys/create/purchase/.default,客户端凭证流必须使用.default后缀,需验证令牌实际包含的权限是否匹配

2. 合作伙伴中心配置检查

  • 确认应用注册的ClientID仍存在于合作伙伴中心的服务管理权益列表中,未被误删除或修改
  • 检查服务端使用的TenantIdClientIdClientSecret是否与Azure AD应用注册及合作伙伴中心配置完全一致,尤其注意ClientSecret是否已过期(Azure AD应用密钥默认有效期为1年)

3. StoreContext初始化与命名空间适配

  • 针对Windows.Services.Store命名空间:
    • 确保StoreContext初始化正确,桌面应用需使用StoreContext.GetDefault(),且代码运行在MSIX打包后的环境中(调试时需选择打包后的启动项,而非直接启动Avalonia项目)
    • 调用GetCustomerPurchaseIdAsync后,检查StorePurchaseResult.ExtendedError是否包含更详细的错误信息,而非仅关注返回的空字符串
  • 针对Windows.ApplicationModel.Store旧命名空间:
    • 该命名空间主要针对传统UWP应用,在Avalonia桌面应用中兼容性有限,建议优先使用Windows.Services.Store,避免混用

4. PublisherUserId参数验证

  • 确认传入的publisherUserId是你服务内对应用户的唯一标识,格式符合要求(无特殊字符、长度合规),且与之前正常工作时的格式完全一致,该参数错误可能导致令牌验证失败或返回空结果

5. 服务端令牌获取流程排查

  • 检查服务端代码中AcquireTokenForClient是否捕获到异常,确认authResult是否成功返回有效令牌(而非空或格式错误的字符串)
  • 确认TenantId使用的是组织租户ID,而非个人Microsoft账号的租户ID,客户端凭证流要求使用组织租户

6. 微软服务状态排查

  • 若以上配置均无变化,可能是Microsoft Store服务临时故障,可查看官方服务状态页面确认相关服务是否正常

调试建议:在客户端添加详细日志,记录令牌内容(脱敏后)、StoreContext初始化状态、API调用后的所有返回参数,便于定位问题。

内容的提问来源于stack exchange,提问作者renrutsirhc

火山引擎 最新活动