0

SessionId无效

微信开发 · gdlcf88 · 查看 641 次 · 于 146天前

Senparc.Weixin.WxOpen.WxOpenException: SessionId无效

  at Senparc.Weixin.WxOpen.Helpers.EncryptHelper.DecodeEncryptedDataBySessionId(String sessionId, String encryptedData, String iv)


大佬你好,使用.net core(abp vnext 0.18.1)按照https://www.cnblogs.com/szw/p/9265828.html的简易配置方案出现以上问题,请问有什么办法找到问题的原因吗?感激不尽。
您尚未登陆,请:网站登录 or 微信登陆
共收到 11 条回复
0

bigcan 95天前

我也是这个问题,搞了一个下午,1是不认真看文档引起的,2、是sdk的例子写的实在有问题,

首先:这个出错是senparc SDK返回的,不是微信。
为什么有这个错呢,原因是:
DecodeEncryptedDataBySessionId,里填的sessionid,重点【【【并不是用code跟微信换回来的Session_key】】】,而是senparc保存Session_key的容器SessionBag的【key】(既然Session_key,这么重要,谁会用Session_key作为SessionBag的key呢),你这里填上Session_key,函数里找的SessionBag,当然是这个SessionId无效,实际上是找不到SessionBag
解决办法:
1、传真正的SessionBag的key
2、使用EncryptHelper.DecodeEncryptedData,而不是DecodeEncryptedDataBySessionId

0

gdlcf88 141天前

不是的,是我自己解码的用法有问题,现在依然还在被困扰,研究中

0

Senparc 143天前

你是说这个方法有问题吗?

0

gdlcf88 143天前

已解决,是堆栈显示的问题导致我把矛头指向了JsCode2JsonAsync……

0

gdlcf88 143天前

大佬你好,这个方法封装在盛派内部的SDK,我实在是没有找到办法拿到,请问还有什么办法吗?谢谢。
另外我手动拿code去取session_key是成功的,感觉是缓存的问题

0

Senparc 145天前 编辑于 2019年7月16日 09:32

是传入这个方法的参数:
Senparc.Weixin.WxOpen.Helpers.EncryptHelper.DecodeEncryptedDataBySessionId(String sessionId, String encryptedData, String iv)

另外出问题的时候看一下缓存里面对应的SessionId是否真的不存在

0

gdlcf88 145天前 编辑于 2019年7月17日 02:13

AppId:
AppSecret:

如果需要新鲜的Code我白天再提供,不懂见谅哈!感谢大佬

0

gdlcf88 145天前 编辑于 2019年7月15日 15:10

miniProgram.AppId = "wx3660000000000000"; // 18位
miniProgram.AppSecret = "35000000000000000000000000000000"; // 32位
input.Code = "021XFTD71c7syL1BsYF718zZD71XFTDm";


var result = await SnsApi.JsCode2JsonAsync(miniProgram.AppId, miniProgram.AppSecret, input.Code);

请问需要真实的AppId和AppSecret吗?

0

Senparc 146天前

传入参数的值,不是代码

0

gdlcf88 146天前

应用服务的代码:
using System;
using System.Linq;
using System.Threading.Tasks;
using MyProject.Users;
using MyProject.Weixin.Dtos;
using IdentityServer4.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Configuration;
using Senparc.Weixin;
using Volo.Abp.Application.Services;
using Volo.Abp.Identity;
using Senparc.Weixin.WxOpen.AdvancedAPIs.Sns;
using Senparc.Weixin.WxOpen.Entities;
using Senparc.Weixin.WxOpen.Helpers;
using Volo.Abp;
using Volo.Abp.Configuration;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.IdentityModel;
using Volo.Abp.Linq;

namespace MyProject.Weixin
{
   public class WeixinMiniProgramAppService : ApplicationService, IWeixinMiniProgramAppService
   {
       public const string LoginProvider = "WeixinOpen";

       private readonly IAsyncQueryableExecuter _asyncQueryableExecuter;
       private readonly IIdentityUserRepository _identityUserRepository;
       private readonly IdentityUserManager _identityUserManager;
       private readonly IWeixinMiniProgramManager _weixinMiniProgramManager;
       private readonly IRepository<WeixinMiniProgram, Guid> _weixinMiniProgramRepository;
       private readonly IRepository<AppUser, Guid> _appUserRepository;
       private readonly IConfiguration _configuration;
       private readonly IIdentityModelAuthenticationService _authenticator;

       public WeixinMiniProgramAppService(
           IAsyncQueryableExecuter asyncQueryableExecuter,
           IIdentityUserRepository identityUserRepository,
           IdentityUserManager identityUserManager,
           IWeixinMiniProgramManager weixinMiniProgramManager,
           IRepository<WeixinMiniProgram, Guid> weixinMiniProgramRepository,
           IRepository<AppUser, Guid> appUserRepository,
           IConfigurationAccessor configurationAccessor,
           IIdentityModelAuthenticationService authenticator)
       {
           _asyncQueryableExecuter = asyncQueryableExecuter;
           _identityUserRepository = identityUserRepository;
           _identityUserManager = identityUserManager;
           _weixinMiniProgramManager = weixinMiniProgramManager;
           _weixinMiniProgramRepository = weixinMiniProgramRepository;
           _appUserRepository = appUserRepository;
           _configuration = configurationAccessor.Configuration;
           _authenticator = authenticator;
       }

       public async Task<WeixinMiniProgramLoginOutputDto> OnLogin(WeixinMiniProgramLoginInputDto input)
       {
           var user = await LoginGetIdentityUserAsync(input);

           var newPassword = await ResetUserPasswordAsync(user);

           var token = await GenerateBearerTokenAsync(user, newPassword);

           return new WeixinMiniProgramLoginOutputDto()
           {
               Token = token
           };
       }

       protected async Task<IdentityUser> LoginGetIdentityUserAsync(WeixinMiniProgramLoginInputDto input)
       {
           var miniProgram = await _asyncQueryableExecuter.FirstOrDefaultAsync(_weixinMiniProgramRepository.Where(w =>
               w.TenantId == input.TenantId && w.Type == input.WeixinMiniProgramType));

           if (miniProgram == null)
           {
               throw new ApplicationException("Nonexistent mini program.");
           }

           var result = await SnsApi.JsCode2JsonAsync(miniProgram.AppId, miniProgram.AppSecret, input.Code);

           if (result.errcode != ReturnCode.请求成功)
           {
               throw new UserFriendlyException(result.errmsg, result.errcode.ToString("d"));
           }

           var userInfo = EncryptHelper.DecodeEncryptedDataToEntity<DecodedUserInfo>(
               result.session_key, input.EncryptedData, input.Iv);

           if (userInfo.unionId == null)
           {
               throw new ApplicationException("Got null unionId from decoding encrypted data.");
           }

           var user = await _identityUserRepository.FindByLoginAsync(LoginProvider, userInfo.unionId);
           AppUser appUser;

           if (user == null)
           {
               user = await _identityUserRepository.InsertAsync(
                   new IdentityUser(Guid.Empty, Guid.NewGuid().ToString(), null, input.TenantId), true);

               user.AddLogin(new UserLoginInfo(LoginProvider, userInfo.unionId, userInfo.nickName));

               await _weixinMiniProgramManager.SetOpenIdAsync(miniProgram, user.Id, userInfo.openId);

               appUser = await _appUserRepository.GetAsync(user.Id);
               appUser.Gender = (Gender)userInfo.gender;
           }
           else
           {
               appUser = await _appUserRepository.GetAsync(user.Id);
           }

           appUser.WeixinInfo = new AppUserWeixinInfo(
               Guid.Empty, appUser.Id, userInfo.nickName, (Gender)userInfo.gender, userInfo.city,
               userInfo.province, userInfo.country, userInfo.avatarUrl);

           return user;
       }

       protected async Task<string> ResetUserPasswordAsync(IdentityUser user)
       {
           // 给用户设置一个新的密码,因为ids4不相信我,非要验证密码……
           var newPassword = Guid.NewGuid().ToString();
           await _identityUserManager.RemovePasswordAsync(user);
           await _identityUserManager.AddPasswordAsync(user, newPassword);

           return newPassword;
       }

       protected async Task<string> GenerateBearerTokenAsync(IdentityUser user, string password)
       {
           var config = new IdentityClientConfiguration
           {
               Authority = _configuration["AuthServer:Authority"],
               ClientId = _configuration["AuthServer:ClientId"],
               ClientSecret = _configuration["AuthServer:ClientSecret"],
               GrantType = GrantType.ResourceOwnerPassword,
               UserName = user.UserName,
               UserPassword = password,
               Scope = "MyProject"
           };

           return await _authenticator.GetAccessTokenAsync(config);
       }
   }
}


Startup.cs(属于MyProjectHttpApiHost项目)的代码:
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Senparc.CO2NET;
using Senparc.CO2NET.Cache;
using Senparc.CO2NET.RegisterServices;
using Senparc.CO2NET.Utilities;
using Senparc.Weixin;
using Senparc.Weixin.Entities;
using Senparc.Weixin.MP;
using Senparc.Weixin.WxOpen;
using Volo.Abp;

namespace MyProject
{
   public class Startup
   {
       public IServiceProvider ConfigureServices(IServiceCollection services)
       {
           services.AddApplication<MyProjectHttpApiHostModule>(options =>
           {
               options.UseAutofac();
           });

           return services.BuildServiceProviderFromFactory();
       }

       public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IOptions<SenparcSetting> senparcSetting, IOptions<SenparcWeixinSetting> senparcWeixinSetting)
       {
           app.InitializeApplication();

           var register = RegisterService.Start(env, senparcSetting.Value).UseSenparcGlobal();// 启动 CO2NET 全局注册,必须!

           register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value);//微信全局注册,必须!


           //如果需要自动扫描自定义扩展缓存,可以这样使用:
           register.UseSenparcGlobal(true);
           //如果需要指定自定义扩展缓存,可以这样用:
           //register.UseSenparcGlobal(false, GetExCacheStrategies(senparcSetting.Value));

           #region CO2NET 全局配置

           #region 全局缓存配置(按需)

           //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须)
           register.ChangeDefaultCacheNamespace("CO2NETCache.netcore");

           #endregion
           #endregion
       }
   }
}



MyProjectHttpApiHostModule的代码:
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using MyProject.EntityFrameworkCore;
using MyProject.MultiTenancy;
using Senparc.CO2NET;
using Senparc.CO2NET.RegisterServices;
using Senparc.Weixin.RegisterServices;
using StackExchange.Redis;
using Swashbuckle.AspNetCore.Swagger;
using Volo.Abp;
using Volo.Abp.AspNetCore.MultiTenancy;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Autofac;
using Volo.Abp.Http.Client.IdentityModel;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;

namespace MyProject
{
   [DependsOn(
       typeof(MyProjectHttpApiModule),
       typeof(AbpAutofacModule),
       typeof(AbpAspNetCoreMultiTenancyModule),
       typeof(AbpHttpClientIdentityModelModule),
       typeof(MyProjectApplicationModule),
       typeof(MyProjectEntityFrameworkCoreDbMigrationsModule)
       )]
   public class MyProjectHttpApiHostModule : AbpModule
   {
       public override void ConfigureServices(ServiceConfigurationContext context)
       {
           var configuration = context.Services.GetConfiguration();
           var hostingEnvironment = context.Services.GetHostingEnvironment();

           ConfigureConventionalControllers();
           ConfigureAuthentication(context, configuration);
           ConfigureSwagger(context, configuration);
           ConfigureLocalization();
           ConfigureVirtualFileSystem(context);
           ConfigureCache(context);
           ConfigureSenparc(context, configuration);
       }

       private void ConfigureCache(ServiceConfigurationContext context)
       {
           context.Services.AddMemoryCache();
       }

       private void ConfigureVirtualFileSystem(ServiceConfigurationContext context)
       {
           var hostingEnvironment = context.Services.GetHostingEnvironment();

           if (hostingEnvironment.IsDevelopment())
           {
               Configure<VirtualFileSystemOptions>(options =>
               {
                   options.FileSets.ReplaceEmbeddedByPhysical<MyProjectDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}MyProject.Domain.Shared", Path.DirectorySeparatorChar)));
                   options.FileSets.ReplaceEmbeddedByPhysical<MyProjectDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}MyProject.Domain", Path.DirectorySeparatorChar)));
                   options.FileSets.ReplaceEmbeddedByPhysical<MyProjectApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}MyProject.Application.Contracts", Path.DirectorySeparatorChar)));
                   options.FileSets.ReplaceEmbeddedByPhysical<MyProjectApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}MyProject.Application", Path.DirectorySeparatorChar)));
               });
           }
       }

       private void ConfigureConventionalControllers()
       {
           Configure<AbpAspNetCoreMvcOptions>(options =>
           {
               options.ConventionalControllers.Create(typeof(MyProjectApplicationModule).Assembly);
           });
       }

       private void ConfigureAuthentication(ServiceConfigurationContext context, IConfigurationRoot configuration)
       {
           context.Services.AddAuthentication("Bearer")
               .AddIdentityServerAuthentication(options =>
               {
                   options.Authority = configuration["AuthServer:Authority"];
                   options.RequireHttpsMetadata = true;
                   options.ApiName = "MyProject";
               });
       }

       private static void ConfigureSwagger(ServiceConfigurationContext context, IConfigurationRoot configuration)
       {
           context.Services.AddSwaggerGen(
               options =>
               {
                   options.SwaggerDoc("v1", new Info {Title = "MyProject API", Version = "v1"});
                   options.DocInclusionPredicate((docName, description) => true);
                   var security = new Dictionary<string, IEnumerable<string>> { { "Bearer", new string[] { } }, };
                   options.AddSecurityRequirement(security);//添加一个必须的全局安全信息,和AddSecurityDefinition方法指定的方案名称要一致,这里是Bearer。
                   options.AddSecurityDefinition("Bearer", new ApiKeyScheme
                   {
                       Description = "JWT授权(数据将在请求头中进行传输) 参数结构: \"Authorization: Bearer {token}\"",
                       Name = "Authorization",//jwt默认的参数名称
                       In = "header",//jwt默认存放Authorization信息的位置(请求头中)
                       Type = "apiKey"
                   });
                   /*options.AddSecurityDefinition("oauth2", new OAuth2Scheme
                   {
                       Type = "oauth2",
                       Flow = "implicit",
                       AuthorizationUrl = configuration["AuthServer:Authority"],
                       Scopes = new Dictionary<string, string>
                       {
                           { "readAccess", "Access read operations" },
                           { "writeAccess", "Access write operations" }
                       }
                   });*/
               });
       }

       private void ConfigureLocalization()
       {
           Configure<AbpLocalizationOptions>(options =>
           {
               options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
               options.Languages.Add(new LanguageInfo("en", "en", "English"));
               options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
               options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
               options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
           });
       }

       private static void ConfigureSenparc(ServiceConfigurationContext context, IConfigurationRoot configuration)
       {
           context.Services.AddSenparcGlobalServices(configuration)//Senparc.CO2NET 全局注册
               .AddSenparcWeixinServices(configuration);//Senparc.Weixin 注册(如果使用Senparc.Weixin SDK则添加)
       }

       public override void OnApplicationInitialization(ApplicationInitializationContext context)
       {
           var app = context.GetApplicationBuilder();

           app.UseVirtualFiles();
           app.UseAuthentication();
           if (MultiTenancyConsts.IsEnabled)
           {
               app.UseMultiTenancy();
           }
           app.UseAbpRequestLocalization();
           app.UseSwagger();
           app.UseSession();
           app.UseSwaggerUI(options =>
           {
               options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProject API");
           });
           app.UseAuditing();
           app.UseMvcWithDefaultRouteAndArea();
       }
   }
}

0

Senparc 146天前

需要把整套传入参数发上来,然后才能做测试,应该就是提供的参数不正确。


热门话题 更多 >>

当前扩展缓存策略没有进行注册

gis008 29 个回复 • 查看 732 次 • 156天前

cpu满载

blezt 23 个回复 • 查看 720 次 • 39天前

GetWxaCodeUnlimit 生成1KB文件

a124754649 22 个回复 • 查看 1332 次 • 62天前

SessionId无效

gdlcf88 11 个回复 • 查看 641 次 • 95天前

关注和取消关注报错的

blqw 9 个回复 • 查看 410 次 • 74天前

程序故CPU占满100%,怀疑是SDK造成的。

fengshi_1988 9 个回复 • 查看 272 次 • 39天前

core 3.0对接微信公众号后消息响应报错。

jianweie 7 个回复 • 查看 376 次 • 61天前

MessageHandler问题

dengguolun 7 个回复 • 查看 264 次 • 42天前

通过扫描临时二维码关注公众号

诀别十年 7 个回复 • 查看 233 次 • 145天前

Messagehandler问题

Jenny_Wu 7 个回复 • 查看 446 次 • 160天前

core环境下退款方法tenpayv3.refund方法失败

ericsy 6 个回复 • 查看 478 次 • 142天前

是否有拦截器

qq1170971516 6 个回复 • 查看 252 次 • 73天前

Value cannot be null. Parameter name: services

abcd631664138 6 个回复 • 查看 372 次 • 22天前

QQ群
  • 1群:300313885 (2000人群 已满)
  • 2群:293958349 (1000人群 已满)
  • 3群:342319110 (2000人群 已满)
  • 4群:372212092 (500人群 已满)
  • 5群:377815480 (1000人群 已满)
  • 6群:425898825 (1000人群 已满)
  • 7群:482942254 (500人群 已满)
  • 8群:106230270 (500人群 已满)
  • 9群:539061281 (500人群 已满)
  • 10群(分布式缓存):246860933 Senparc.Weixin.Cache SDK 10群
  • 11群:553198593 (500人群 已满)
  • 12群(微信小程序):108830388 Senparc微信小程序 12群
  • 13群(开放平台):183424136 (500人群 已满)
  • 14群(视频学员):588231256 Senparc.Weixin SDK 14群
  • 15群(公众号/综合):289181996 Senparc.Weixin SDK 15群
  • 16群(开放平台):860626938 (500人群 已满)
  • 17群(开放平台):770615466 [17群 开放平台]SenparcSDK
  • NeuChar 技术交流群:618605800 NeuChar 开发交流群
  • SCF 技术交流群:147054579 SCF 开发交流群
微信开发宝典:《微信开发深度解析》

由 Senparc.Weixin SDK 作者耗时两年完成的微信开发图书《微信开发深度解析:公众号、小程序高效开发秘籍》已经出版!

历经2年精心雕琢,难得的“理论 + 实战案例 + 趟坑经验”总结,
从需求分析、策划,到账号申请、验证,再到全面的 API 及开发工具,
覆盖所有开发微信公众号(含订阅号、服务号和小程序)所需关键技能!

视频教程:《微信公众号+小程序快速开发》

由盛派课堂(盛派旗下独立教育品牌)制作,《微信开发深度解析》作者苏震巍先生主讲的《微信公众号+小程序快速开发》视频课程开课啦!

课程采用“理论+实战”的教学形式,结合部分《微信开发深度解析》内容,独立于书本,包含了更多的操作演示和案例展示,帮助大家从多个维度学习微信开发以及.NET开发过程中的诸多技巧。
课程包含两大部分:
1. 微信开发基础技能
2. 公众号及小程序案例实战
共计60课时,配有番外篇,目前视频已在网易云课堂上线。