【微信公衆號入“坑”③:用戶授權】

在微信公衆號開發中,我們往往需要知道一些用戶的基本信息,比如:暱稱、頭像、性別、城市(我們也只能知道這麼多)
那麼,這就需要了解一下微信公衆號網頁授權的一些基本了,給大家說說微信公衆號裏面一些基本的東西吧
每個微信用戶,我們在開發過程中,是用一個叫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的原因,導致授權部分繞了很多路,這裏就不貼繞路的了,這只是公司邏輯,並不適合所有人
整個授權部分基本搞定。如果有不能實現的或者有問題的歡迎留言討論

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