前言
第三方授权登录,共有三篇:
(一)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、微博的第三方授权登录都介绍完了,基本上过程都是一样的,中间有细小的差别,一个走通了其他的都会很容易。
同样,跟上两篇一样,欢迎各位批评指正,谢谢!