1. 程式人生 > >(二)C# winform C/S WebBrowser qq第三方授權登入

(二)C# winform C/S WebBrowser qq第三方授權登入

緊接上一篇,qq的授權登入,跟微信相似,不同的地方是:

1 申請appid與appkey的時候,注意填寫回調地址。

2 這裡可以在WebBrowser的是Navigated事件中直接得到Access Token,一般情況是通過Authorization Code獲取Access Token。

3 獲取使用者資訊,需要先根據Access Token獲取使用者的OpenID。

最後,在WebBrowser的DocumentCompleted事件中,完成所有的呼叫。

總結一下,分以下幾步:

1 根據appid與appkey獲取Authorization Code(這裡忽略此步,直接到步驟2)。

2 根據code獲取Access Token,這裡可在WebBrowser的Navigated事件中,直接在網址中獲取Access Token。

3 使用Access Token來獲取使用者的OpenID

4 根據Access Token和OpenID  呼叫OpenAPI獲取各種資訊,這裡qq提供了具體的API文件。

需要的資料,都在qq互聯-文件資料,非常的詳細。

具體的過程如下:

1 在新的form中,拉一個WebBrowser控制元件,在屬性-url,設定為

https://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=你的appid&redirect_uri=你的回撥地址&scope=get_user_info

同樣,回撥地址注意進行URLEncode。這樣執行,可以進入到qq授權登入的介面。

2 在Navigated事件中,用list記錄跳轉的網址

ArrayList addressList2 = new ArrayList();

        private void webBrowser_QQ_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            string url = e.Url.ToString();
            addressList2.Add(url); 
        }
3 遍歷addressList2,找到含有access_token的網址,取出access_token
        //Step2:一般情況是通過Authorization Code獲取Access Token,這裡直接從網址獲取Access Token
        protected string Get_AccessToken()
        {
            string strTempToken = "";
            // 獲取含有Access_token的網址
            foreach (string url in addressList2)
            {
                if (url.Contains("access_token"))
                {
                    strTempToken = url;
                    break;
                }
            }            
            if (string.IsNullOrEmpty(strTempToken))
                return null;
            //qq最終獲得的Access_token
            string AccessToken = "";
            int iStart = strTempToken.IndexOf("=");
            int iEnd = strTempToken.LastIndexOf('&');
            if (iStart < iEnd)
            {
                int codeLength = iEnd - iStart - 1;
                AccessToken = strTempToken.Substring(iStart + 1, codeLength);
            }
           return AccessToken; 
        }
        //Step3:使用Access Token來獲取使用者的OpenID
        protected string Get_OpenID(string Access_token)
        {
            string callback = JsonHelper.GetJson("https://graph.qq.com/oauth2.0/me?access_token=" + Access_token);
            int ibegin = callback.IndexOf("{");
            int iEnd = callback.IndexOf("}");
            int ilength = 0;
            if(ibegin<iEnd)
            {
                ilength = iEnd - ibegin;
            }
            string strOpenId = callback.Substring(ibegin, ilength + 1);
            QQCallBack qqOpenId = JsonHelper.ParseFromJson<QQCallBack>(strOpenId);
            string openId = qqOpenId.openid;
            return openId;
        }
    /// <summary>
    /// QQ回撥類,獲取Openid
    /// </summary>
    public class QQCallBack
    {
        public string client_id { get; set; }
        public string openid { get; set; }
    }

4 先定義QQUser使用者資訊類,根據Access_token和openId獲取使用者資訊
    /// <summary>
    /// qq登入回撥結果實體類
    /// </summary>
    public class QQUser
    {
        /// <summary>
        /// 回撥結果碼(0成功,其他失敗)
        /// </summary>
        public int ret { get; set; }
        public string msg { get; set; }
        public string is_lost { get; set; }
        /// <summary>
        /// 使用者暱稱
        /// </summary>
        public string nickname { get; set; }
        /// <summary>
        /// 性別
        /// </summary>
        public string gender { get; set; }

        public string province { get; set; }

        public string city { get; set; }

        public string year { get; set; }
       /// <summary>
        /// 使用者頭像
        /// </summary>
        public string figureurl { get; set; }

        public string figureurl_2 { get; set; }

        public string figureurl_qq_2 { get; set; }       
    }

        //Step4: 呼叫OpenAPI獲取各種資訊
        protected QQUser Get_qqUserInfo(string Access_token, string openId)
        {
            string userInfostr = JsonHelper.GetJson("https://graph.qq.com/user/get_user_info?access_token=" + Access_token + "&oauth_consumer_key=" + app_id + "&openid=" + openId);
            QQUser qqUser = JsonHelper.ParseFromJson<QQUser>(userInfostr);
            return qqUser;
        }
最後,在WebBrowser的DocumentCompleted事件中,呼叫上述的函式。
        private void webBrowser_QQ_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            string access_token = Get_AccessToken();
            if (string.IsNullOrEmpty(access_token))
                return;
            string openid = Get_OpenID(access_token);
            if (string.IsNullOrEmpty(openid))
            {
                return;
            }
            QQUser qqUser = Get_qqUserInfo(access_token, openid);

中間沒有提到的相關的函式,在上篇微信中,都有提到,這裡不再贅述。

同樣,本人初學者,歡迎批評指正,謝謝!