ASP.Net 微信H5 OAuth2 认证 (前后端不分离)


在19年出开始接触微信的开发,OAuth认证是我遇到的第一个难题。边学习边记录

首先在微信公众平台配置网页授权域名

 

 

 

需要用到的DLL

Senparc.Weixin.dll

Senparc.Weixin.MP.dll

Senparc.Weixin.WxOpen.dll

 

首先创建一个身份认证的特性 放在所有Controller里面

 

OAuth2AuthorizeAttribute.cs  代码如下

public class OAuth2AuthorizeAttribute : AuthorizeAttribute
    {
        /// <summary>
        /// 验证是否已存用户的wxopenid
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnAuthorization(AuthorizationContext filterContext)
        {

            try
            {
                var request = filterContext.HttpContext.Request;//获取http请求
                
                var req = filterContext.HttpContext.Request.RawUrl.ToString();//拿到完整url

var d = HttpContext.Current.Request.Url.ToString();//这个也是拿到完整的url 只不过这个可以拿到路由里面的参数 上面则不可以 Common.Logs._StrUrl = d;//存到一个常量里面 //判断cookie里面有没有存这个用户的wxopenid if (string.IsNullOrWhiteSpace(TUser.GetUserOpenId())) { //如果cookie里面没有用户的wxopenid则重定向 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "OAuth2", action = "index", strurl = Common.Logs._StrUrl, })); } } catch (Exception ex) { } } }

 

TUser.cs 

 public static class TUser
    {
        #region 变量区域

        #region Cookie Keys
        /// <summary>
        /// UserPwd Cookie Key
        /// </summary>
        public static string UserOpenIdKey = "577355724964";

        /// <summary>
        /// ValueExt
        /// </summary>
        public static string ValueExt = "_isoks";


        /// <summary>
        /// CookieName
        /// </summary>
        public static string CookieName = "596f727a696b752e576562";


        #endregion

        #endregion

        #region+GetUserOpenId 获取UserOpenId

        public static string GetUserOpenId()
        {
            try
            {
                var cookie = GetCookie();
                if (cookie == null) return string.Empty;
                var userOpenId = cookie.Values[UserOpenIdKey];
                return userOpenId;
            }
            catch
            {
                return string.Empty;
            }
            return string.Empty;
        }

        #endregion

        #region +SetCookie 设置登录的cookie
        /// <summary>
        /// 设置登录的cookie
        /// </summary>
        /// <param name="id">id</param>
        /// <param name="name">用户名</param>
        public static void SetUserOpenId(string userOpenId)
        {
            var cookie = new HttpCookie(CookieName) { HttpOnly = true };
            cookie.Values.Add(UserOpenIdKey, userOpenId);
            //cookie.Expires = DateTime.Now.AddDays(30);
            HttpContext.Current.Response.SetCookie(cookie);
        }
        #endregion

        #region +GetCookie 获取Cookie实例 
        /// <summary>
        /// 获取Cookie实例
        /// </summary>
        /// <returns></returns>
        public static HttpCookie GetCookie()
        {
            try
            {
                var key = CookieName;
                var cookie = HttpContext.Current.Request.Cookies[key];
                return cookie;
            }
            catch
            {
                return null;
            }
        }
        #endregion

    }

 

 

OAuth2Controller 代码 

 /// <summary>
    /// 调用微信API换取WXOpenid
    /// </summary>
    public class OAuth2Controller : BaseController
    {
        /// <summary>
        /// 定义一个常量用来存储需要请求的路径
        /// </summary>
        public static string PrevUrl = string.Empty;
        public ActionResult Index(string strurl = "")
        {
            //给常量赋值
            PrevUrl = strurl;
            //调用微信API接口 BAPPID=公众号的APPID  BREDIRECTURL=接收微信返回结果的路由 例:http://localhost/OAuth2/RedirectUrl
            var uri = OAuthApi.GetAuthorizeUrl(BAPPID, BREDIRECTURL, "0", OAuthScope.snsapi_userinfo);
            //重定向访问微信授权地址
            return Redirect(uri);
        }

        /// <summary>
        /// 微信OAuthApi回调
        /// </summary>
        /// <param name="code">状态码</param>
        /// <param name="state"></param>
        /// <returns></returns>
        public ActionResult RedirectUrl(string code, string state)
        {
            try
            {
                //判断状态码是否为空
                if (string.IsNullOrEmpty(code))
                {
                    return Json(new { State = false, Msg = "哎呀,出错了!" });
                }
              
                //定义一个接收Tokoen的result
                OAuthAccessTokenResult result = null;
                try
                {
                    result = OAuthApi.GetAccessToken(BAPPID, BSECRET, code);
                }
                catch (Exception ex)
                {
                    return Json(new { State = false, Msg = "哎呀,出错了!" });
                }
                if (result.errcode != ReturnCode.请求成功)
                {
                    return Json(new { State = false, Msg = "哎呀,出错了!" });
                }


                //拿到token以后调用微信接口 用token和openid换去用户信息
                var userinfo = OAuthApi.GetUserInfo(result.access_token, result.openid);
                //拿到用户信息后创建或修改自己项目中的用户表
                if (userinfo != null)
                {
                    var user = UserRepository.GetUserByWxOpenId(result.openid);
                    if (user != null)
                    {
                        user.NickName = userinfo.nickname;
                        user.HeadImg = userinfo.headimgurl;
                        user.UserSex = (UserSex)Enum.Parse(typeof(UserSex), userinfo.sex.ToString());
                        UserRepository.SaveOrUpdate(user);
                    }
                    else
                    {
                        //create user
                        User guser = new User();
                        guser.WxOpenId = result.openid;
                        guser.HeadImg = userinfo.headimgurl;
                        guser.NickName = userinfo.nickname;
                        guser.State = true;
                        guser.UserSex = (UserSex)Enum.Parse(typeof(UserSex), userinfo.sex.ToString());
                        guser.AddTime = DateTime.Now;
                        guser.UserType = UserType.游客;
                        guser.GuId = Guid.NewGuid().ToString();
                        UserRepository.SaveOrUpdate(guser);
                    }
                }
                //将用户的openid存起来
                TUser.SetUserOpenId(result.openid);
                //跳转程序原来要跳转的路由
                if (IsoksIsNullOrWhiteSpace(PrevUrl))
                {
                    return Redirect(PrevUrl);
                }
                return Redirect("~/home/index");
            }
            catch (Exception ex)
            {
                log(ex.Message, "出错啦");
            }
            return Error500cshtml();
        }
    }

 

 

总体思路:客户端发来请求,通过过滤器拿到要请求的路径,判断cookie里面有没有存当前用户的wxopenid,如果存了直接跳转正常要请求的路径,如果wxopenid为空 则重定向到OAuth2Controll 根据配置的APPID和BREDIRECTURL=重定向url跟微信API进行交互获取用户的微信信息进行创建或更新用户并在cookie里面存储用户信息

 

文章来源:https://www.cnblogs.com/kangsir7/p/15741437.html

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:(原创)WinForm中莫名其妙的小BUG——RichTextBox自动选择字词问题
下一篇:.net 简单实现在H5中将word、jpg、png转成PDF给PDF添加水印并且控制样式和可视化编辑
评论列表

发表评论

评论内容
昵称:
关联文章

ASP.Net H5 OAuth2 认证前后分离
Asp.net H5唤起支付和支付回调
有限在线用户的场景中,前后分离是多此一举
支付:签名计算.net4.5
asp.net core 支持多种身份认证方式
2.客户与服务连接
支付宝:H5 JSAPI支付开发手册
授权连接URL生成类库
H5页面开发禁用webview内嵌的h5缩放啊?
支付提示 No_Auth 受理关系存在
.net 简单实现在H5中将word、jpg、png转成PDF给PDF添加水印并且控制样式和可视化编辑
.NET Core中的鉴权授权正确方式(.NET5)
支付:C#计算签名
支付:JSAPI支付 开发手册
【已解决】.NET 支付API V3中JSAPI支付发起wx.chooseWXPay时,提示 支付验证签名失败
支付,当面付,开发手册
(五)React Ant Design Pro + .Net5 WebApi:后环境搭建-Autofac注入+ 泛型仓储
ASP.NET MVC快速入门(一)
支付:header中的mchid与post payload中的mchid匹配
支付:JSAPI支付失败 报错:登录失败, redirect_uri域名与后台配置一致,错误码:10003

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码