【微信公众号入“坑”③:用户授权】

在微信公众号开发中,我们往往需要知道一些用户的基本信息,比如:暱称、头像、性别、城市(我们也只能知道这么多)
那么,这就需要了解一下微信公众号网页授权的一些基本了,给大家说说微信公众号里面一些基本的东西吧
每个微信用户,我们在开发过程中,是用一个叫OpenId来进行区分用户的,同一微信用户对于每个公众号、小程序的OpenId都不一样。但在我们公司实际的业务中,我们有两个公众号,两个公众号都要能正确识别是同一用户,显然这种情况下OpenId不能满足我们的需求,针对这种情况微信提供了一个叫UnionID的机制,需要将不同公众号绑定到同一开发者账号下,当然开发者账号需要认证(300元),但我强烈建议大家把开发者账号一起申请了,并进行绑定,哪怕只有一个公众号,因为你说不清楚哪天你们公司会有这种需求,这种情况下会崩溃!!!
在获取微信用户基本信息的时候,需要使用Token,(注意:这里的Token和验证时的Token不是同一个东西),大家可以理解下官方文档
请注意官方文档中的这段
关于网页授权的两种scope的区别说明
1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

第一种情况虽然用户无感知,但我们也只能拿到OpenId和UnionId,无法抓取到用户暱称这些基本信息,除非用户关注了公众号
第二种就比较好了,虽然会弹提示框,但因为用户确认了,所以我们能直接拿到用户的基本信息(我用的这种,业务需求如此)
废话太多,只想说点心得,下面是代码

		/// <summary>
        /// 微信授权
        /// </summary>
        /// <param name="url"></param>
        public void WeChatUserAuthorization(string url)
        {
            try
            {
                var code = Request["code"];
                var state = Request["state"];
                if (code == null)
                {
                    UserAuthorization(appInfo.DomainName + url, true);
                }
                else
                {
                    var token = default(Sys_AccessToken);
                    var userInfo = UserInfo(token);
                }
            }
            catch (Exception ex)
            {
                //var wechatErr = Newtonsoft.Json.JsonConvert.DeserializeObject<Sys_Errcode>(ex.Message);
                //if (wechatErr != null)
                //    if (wechatErr.errcode > 40000)
                //        UserAuthorization(appInfo.DomainName + url, true);
            }

        }
		/// <summary>
        /// 跳转授权
        /// </summary>
        /// <param name="redirectUrl">授权回调地址</param> 
        /// <param name="isInfo">true:获取用户基础信息 false:只获取openid</param>
        public void UserAuthorization(string redirectUrl, bool isInfo)
        {
            Response.Redirect(string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}#wechat_redirect", appInfo.Sys_AppId, redirectUrl, isInfo ? "snsapi_userinfo" : "snsapi_base"));
        }
		/// <summary>
        /// 返回授权用户Token
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public Sys_AccessToken UserToken(string code)
        {
            try
            {

                var token = HttpClinetHelper.Get<Sys_AccessToken>(string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appInfo.Sys_AppId, appInfo.Sys_AppSecret, code));
                return token;
            }
            catch (Exception e)
            {

                throw;
            }
        }
		/// <summary>
        /// 获取用户基础信息
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public Sys_WechatUser UserInfo(Sys_AccessToken token)
        {
            try
            {
                return HttpClinetHelper.Get<Sys_WechatUser>(string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN", token.Access_token, token.OpenId));
            }
            catch (Exception)
            {

                throw;
            }
        }

本来整个过程及这么多点东西,但因为前期没有UnionId的原因,导致授权部分绕了很多路,这里就不贴绕路的了,这只是公司逻辑,并不适合所有人
整个授权部分基本搞定。如果有不能实现的或者有问题的欢迎留言讨论

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章