public async Task <IActionResult> Callback([FromRoute] string appID, [FromServices] IWechatMPApi mp, [FromServices] IMemoryCache cache, [FromServices] OptionsManager <WechatJWTOption> options, [FromRoute] string authScheme, [FromServices] IWechatJWTAuthenticateService loginService = null, [FromQuery] string code = "", [FromQuery] string state = "") { Debugger.Break(); if (code == "" || state == "") { return(Content("无效code")); } if (!cache.TryGetValue(state, out var stateData)) { return(Content($"state无效:{state}")); } var json = JObject.Parse(stateData.ToStringEx()); var redirectUrl = json.GetString("redirectUrl"); var oauthType = (SnsapiType)json.GetInt("oauthType"); //var scheme = json.GetString("scheme"); var ret1 = await mp.OAuth.GetAccessToken(appID, code); if (!ret1.IsSuccess) { return(Content($"accesstoken无效:code={ret1.ReturnCode};message={ret1.Message}")); } LoggerManager.Default.Debug($"accesstoken:{JsonConvert.SerializeObject(ret1.ReturnData)}"); WxUserInfo_Result wxUserInfo = null; if (oauthType == SnsapiType.UserInfo) { wxUserInfo = (await mp.OAuth.GetUserInfo(appID, ret1.ReturnData.OpenId, ret1.ReturnData.AccessToken)).ReturnData; LoggerManager.Default.Debug($"userInfo:{JsonConvert.SerializeObject(wxUserInfo)}"); } var option = options.Get(authScheme); if (loginService == null) { throw new ArgumentNullException("loginService为空,请使用services.RegisterMPJWTLoginService注册登录服务"); } await loginService?.OnOAuthCompleted(this.HttpContext, appID, ret1.ReturnData.OpenId, ret1.ReturnData.RefreshToken, ret1.ReturnData.AccessToken, wxUserInfo, mp ); ResultReturn <string> ret; try { ret = await loginService.Login(this.HttpContext, appID, ret1.ReturnData.OpenId, ret1.ReturnData.Type, mp); } catch (Exception e) { LoggerManager.Default.Error("登录接口抛错", e); throw; } if (ret.IsSuccess) { var tokenHandler = new JwtSecurityTokenHandler(); var authTime = DateTime.UtcNow; var expiresAt = authTime.Add(option.ExpireTimeSpan); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new Claim[] { new Claim("aud", option.Audience), new Claim("iss", option.Issuer), //new Claim("k",pw.DesEncrypt(option.TokenEncKey.Left(8))), new Claim("OpenID", ret1.ReturnData.OpenId), new Claim("AppID", appID), new Claim("OAuthType", ((int)oauthType).ToStringEx()), new Claim(ClaimTypes.NameIdentifier, ret.ReturnData) }), Expires = expiresAt, SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(option.ActualEncKey), SecurityAlgorithms.HmacSha256Signature), EncryptingCredentials = new EncryptingCredentials(new SymmetricSecurityKey(option.ActualEncKey), JwtConstants.DirectKeyUseAlg, SecurityAlgorithms.Aes256CbcHmacSha512) }; var token = tokenHandler.CreateToken(tokenDescriptor); var tokenString = tokenHandler.WriteToken(token); if (option.Cookie.Expiration == null) { option.Cookie.Expiration = option.ExpireTimeSpan; } Response.Cookies.Append(string.IsNullOrEmpty(option.Cookie.Name) ? $"jwt.{authScheme}" : option.Cookie.Name, tokenString, option.Cookie.Build(HttpContext)); return(Redirect(redirectUrl)); } else { return(Content(ret.Message)); } }
public async Task <IActionResult> ServicePost([FromServices] IWechatGateway gateway, [FromQuery] string signature, [FromQuery] string timestamp, [FromQuery] string nonce, [FromQuery] string echostr, [FromRoute] string appID = "", [FromServices] ILoggerFactory logger = null, [FromServices] IWechatMPApi mpApi = null, [FromServices] MessageQueue msgHandler = null, [FromServices] IMPMessageExecutor messageExecutor = null ) { //return Content(""); if (gateway == null) { return(Content("请先注册微信公众号服务")); } logger?.CreateLogger("weixin")?.Log(LogLevel.Trace, $"微信调用:signature={signature},timestamp={timestamp},nonce={nonce},echostr={echostr}"); if (string.IsNullOrWhiteSpace(appID)) { return(Content("AppID不能为空")); } var config = gateway.Get(appID) as MPConfiguration; if (config == null) { return(Content("该AppID非公众号配置或AppID不存在")); } if (CheckSignature.Check(signature, timestamp, nonce, config.Token)) { return(Content("校验无效,请检查token")); } if (messageExecutor == null) { return(Content("success")); } Request.EnableBuffering(); //自定义MessageHandler,对微信请求的详细判断操作都在这里面。 var inputStream = Request.Body; inputStream.Position = 0; var xml = inputStream.ReadToEnd(); var msg = mpApi.Message.DecodeMPRequestMsg(xml); if (msg.IsSuccess) { if (await msgHandler.AddMessage(msg.ReturnData)) { var response = await messageExecutor.Execute(msg.ReturnData); if (response == null) { return(Content("success")); } //if (!string.IsNullOrWhiteSpace(config.EncryptAESKey)) //{ // return Content(mpApi.Message.EncryptMessage(appID, response.ToXml())); //} return(Content(response.ToXml())); } else { return(Content("success")); } } else { if (msg.ReturnCode == 1000) { return(Content("success")); } return(Content("error")); } }