天天看點

(三)C# winform C/S WebBrowser 微網誌第三方授權登入

前言

第三方授權登入,共有三篇:

(一)C# winform C/S WebBrowser 微信第三方登入

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

(三)C# winform C/S WebBrowser 微網誌第三方授權登入

這裡面有很多通用的類和方法,思想和程式設計過程基本上一緻,是以在閱讀這篇之前,建議先看看前兩篇。

正文

一、參考資料

1 微網誌開放平台——文檔——微網誌登入——授權機制說明和微網誌的API

2 C# WebBrowser控件 Navigated、DocumentCompleted事件

二、總體步驟

1 申請app_id和app_secret,注意回調位址,即授權成功跳轉的位址

2 擷取code。這裡的code可以在WebBrowser的Navigated事件跳轉網址中得到。

3 根據code擷取Access token和uid。注意,之前qq和微信都是GET方法,這裡用的是Post方法,這個必須注意!

4 根據Access_token 和uid擷取微網誌使用者資訊。

三、編碼過程

1 建立窗體,拉一個WebBrowser控件,設定 屬性-Url 為

https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI

同樣,回調位址注意進行URLEncode。這樣運作,可以進入到微網誌授權登入的界面。

2 擷取code,用一個ArrayList記錄Navigated跳轉的網址,找到含有 code的那個網址,把code後面的位址取出來

<span style="font-size:14px;">        ArrayList addressListNavigated = new ArrayList();

        //Step1:擷取Authorization Code
        protected string Get_AuthorizationCode()
        {
            //擷取weibo跳轉含有code的網址
            string tempCode = "";
            foreach (string url in addressListNavigated)
            {
                if (url.Contains("?code"))
                {
                    tempCode = url;
                    break;
                }
            }
            if (string.IsNullOrEmpty(tempCode))
                return null;
            //qq最終獲得的code
            string code = "";
            int iStart = tempCode.IndexOf("=");
            int iEnd = tempCode.Length;
            if (iStart < iEnd)
            {
                int codeLength = iEnd - iStart - 1;
                code = tempCode.Substring(iStart + 1, codeLength);
            }
            return code;
        }</span>
           

3 Post方法擷取含有Accesstoken和Uid的字元串,這是個Json字元串,将其轉換為WeiboAccessToken類的格式。

(1)Post擷取含有Accesstoken和Uid的字元串 string AccessToken

<span style="font-size:14px;">        //微網誌擷取AccessToken應該用Post方法,之前qq微信都是get
        protected string PostAccessToken(string code)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.weibo.com/oauth2/access_token");
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded;";
            //request.Headers.Add(string.Format("Authorization: key={0}", code));

            string postData = "client_id=88580607";
            postData += ("&client_secret=638268e6a371170585621a078105859c");
            postData += ("&grant_type=authorization_code");
            postData += ("&redirect_uri=http%3a%2f%2fsview.sv3d.cn");
            postData += ("&code=");
            postData += code;

            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            request.ContentLength = byteArray.Length;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            //發出Request
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            string responseStr = reader.ReadToEnd();
            reader.Close();
            responseStream.Close();
            response.Close();
            return responseStr;
        }</span>
           

(2)Json字元串,将其轉換為WeiboAccessToken類的格式

<span style="font-size:14px;">    /// <summary>
    /// 微網誌AccessToken類
    /// </summary>
    public class WeiboAccessToken
    {
        public string access_token { get; set; }
        public string remind_in { get; set; }
        public int expires_in { get; set; }
        public string uid { get; set; }
    }</span>
           
<span style="font-size:14px;">        //Step2:通過Authorization Code擷取Access Token
        protected WeiboAccessToken Get_token(string strAccessToken)
        {
            WeiboAccessToken oauthToken = JsonHelper.ParseFromJson<WeiboAccessToken>(strAccessToken);
            return oauthToken;
        }</span>
           

4 根據Access_token 和uid擷取微網誌使用者資訊

<span style="font-size:14px;">    /// <summary>
    /// 微網誌使用者資訊類
    /// </summary>
    public class WeiboUser
    {
        public Int64 id { get; set; }
        public string idstr { get; set; }
        public string screen_name { get; set; }
        public string name { get; set; }
        public string province { get; set; }
        public string city { get; set; }
        public string location { get; set; }
        public string description { get; set; }
        public string url { get; set; }
        public string profile_image_url { get; set; }
        public string profile_url { get; set; }
        public string gender { get; set; }
    }</span>
           
<span style="font-size:14px;">        //Step3: 調用Access_token擷取使用者資訊
        protected WeiboUser Get_WeiboUserInfo(string Access_token,string uid)
        {
            string s = "https://api.weibo.com/2/users/show.json?access_token=" + Access_token + "&uid=" + uid;
            string Str = JsonHelper.GetJson(s);
            WeiboUser weiUser = JsonHelper.ParseFromJson<WeiboUser>(Str);            
            return weiUser;
        }</span>
           

最後,在WebBrowser的DocumentCompleted事件中,調用上述所有的代碼。

</pre><pre name="code" class="csharp"><span style="font-size:14px;">        private void webBrowser_weibo_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // 擷取code
            string code = Get_AuthorizationCode();
            if(string.IsNullOrEmpty(code))
                return;
            // Post擷取Accesstoken 類
            string AccessToken = PostAccessToken(code);
            WeiboAccessToken oauthToken = Get_token(AccessToken);
            // 微網誌使用者資訊類
            WeiboUser weiUser = new WeiboUser();
            // 擷取微網誌使用者資訊
            weiUser = Get_WeiboUserInfo(oauthToken.access_token, oauthToken.uid);</span>
           

附上,上面可能用到的類。

/// <summary>
    /// 将Json格式資料轉化成對象
    /// </summary>
    public class JsonHelper
    {
        /// <summary>  
        /// 生成Json格式  
        /// </summary>  
        /// <typeparam name="T"></typeparam>  
        /// <param name="obj"></param>  
        /// <returns></returns>  
        public static string GetJson<T>(T obj)
        {
            DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
            using (MemoryStream stream = new MemoryStream())
            {
                json.WriteObject(stream, obj);
                string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;
            }
        }
        /// <summary>  
        /// 擷取Json的Model  
        /// </summary>  
        /// <typeparam name="T"></typeparam>  
        /// <param name="szJson"></param>  
        /// <returns></returns>  
        public static T ParseFromJson<T>(string szJson)
        {
            T obj = Activator.CreateInstance<T>();
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                return (T)serializer.ReadObject(ms);
            }
        }
        //通路url并傳回資訊
        public static string GetJson(string url)
        {
            WebClient wc = new WebClient();
            wc.Credentials = CredentialCache.DefaultCredentials;
            wc.Encoding = Encoding.UTF8;
            
            string returnText = wc.DownloadString(url);

            if (returnText.Contains("errcode"))
            {
                //可能發生錯誤
            }
            return returnText;
        }
    }
           

至此,微信、QQ、微網誌的第三方授權登入都介紹完了,基本上過程都是一樣的,中間有細小的差别,一個走通了其他的都會很容易。

同樣,跟上兩篇一樣,歡迎各位批評指正,謝謝!