前言
第三方授權登入,共有三篇:
(一)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、微網誌的第三方授權登入都介紹完了,基本上過程都是一樣的,中間有細小的差别,一個走通了其他的都會很容易。
同樣,跟上兩篇一樣,歡迎各位批評指正,謝謝!