C# winform C/S WebBrowser 微信第三方登录
網(wǎng)上很多的資料都是B/S結(jié)構(gòu)的,這里是基于C# C/S 結(jié)構(gòu)的微信第三方授權(quán)登錄
一、準(zhǔn)備知識(shí)
1 http Get和Post方法。做第三方授權(quán)登錄,獲取信息基本上都是用get和post方法,做之前需要進(jìn)行基本的了解,基本上網(wǎng)頁(yè)都是get。
2 微信開(kāi)發(fā)文檔。這里參考的是: 微信開(kāi)發(fā)平臺(tái)——資源中心——網(wǎng)址應(yīng)用——微信登錄功能 。
3 熟悉WebBrowser控件。這里熟悉的主要是webBrowser的事件Navigating和Navigated。這里可以獲取跳轉(zhuǎn)的網(wǎng)頁(yè)地址,這個(gè)很重要!!!
基礎(chǔ)的OAuth2.0協(xié)議標(biāo)準(zhǔn)、C#編程基礎(chǔ)知識(shí) 都需要有一定的了解。
二、 開(kāi)發(fā)過(guò)程。
1 注冊(cè)。到微信開(kāi)發(fā)平臺(tái)注冊(cè)需要授權(quán)登錄的應(yīng)用程序,獲取的appid和appsecret。
2 拖控件WebBrowser到一個(gè)winform中。設(shè)置屬性-url,為?
https://open.weixin.qq.com/connect/qrconnect?appid=你申請(qǐng)的appid&redirect_uri=你的跳轉(zhuǎn)的網(wǎng)址&response_type=code&scope=snsapi_login&state=123456#wechat_redirect
注意:這里你跳轉(zhuǎn)的網(wǎng)址,要進(jìn)行UrlEncode編碼。
運(yùn)行程序,就可以到下面的界面:
3 獲取code
這里獲取code 就要利用 WebBrowser的Navigating或者Navigated事件。經(jīng)本人測(cè)試,微信的授權(quán)登錄,這兩個(gè)事件都可以得到帶有code的網(wǎng)址。
即,在跳轉(zhuǎn)到這個(gè)事件的時(shí)候,記錄網(wǎng)址到一個(gè)list中。
?
// 微信跳轉(zhuǎn)的網(wǎng)址列表ArrayList addressList = new ArrayList();private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e){string url = e.Url.ToString();//微信每次跳轉(zhuǎn)的頁(yè)面放到list中,第一個(gè)是包含code的網(wǎng)址 addressList.Add(url); }?
4 獲取?微信Access_token
?先定義一個(gè)?微信Access_token類
?
/// <summary>/// 微信Access_token類/// </summary>public class OAuth_Token{public OAuth_Token(){////TODO: 在此處添加構(gòu)造函數(shù)邏輯// }//access_token 網(wǎng)頁(yè)授權(quán)接口調(diào)用憑證,注意:此access_token與基礎(chǔ)支持的access_token不同//expires_in access_token接口調(diào)用憑證超時(shí)時(shí)間,單位(秒)//refresh_token 用戶刷新access_token//openid 用戶唯一標(biāo)識(shí),請(qǐng)注意,在未關(guān)注公眾號(hào)時(shí),用戶訪問(wèn)公眾號(hào)的網(wǎng)頁(yè),也會(huì)產(chǎn)生一個(gè)用戶和公眾號(hào)唯一的OpenID//scope 用戶授權(quán)的作用域,使用逗號(hào)(,)分隔public string _access_token;public string _expires_in;public string _refresh_token;public string _openid;public string _scope;public string access_token{set { _access_token = value; }get { return _access_token; }}public string expires_in{set { _expires_in = value; }get { return _expires_in; }}public string refresh_token{set { _refresh_token = value; }get { return _refresh_token; }}public string openid{set { _openid = value; }get { return _openid; }}public string scope{set { _scope = value; }get { return _scope; }}}?
//訪問(wèn)微信url并返回微信信息protected 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")){//可能發(fā)生錯(cuò)誤 }return returnText;//根據(jù)appid,secret,code獲取微信openid、access token信息protected OAuth_Token Get_token(string Code){//獲取微信回傳的openid、access tokenstring Str = GetJson("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + Code + "&grant_type=authorization_code");//微信回傳的數(shù)據(jù)為Json格式,將Json格式轉(zhuǎn)化成對(duì)象OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);return Oauth_Token_Model;}/// <summary>/// 將Json格式數(shù)據(jù)轉(zhuǎn)化成對(duì)象/// </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);}}}?
?
5?根據(jù)openid,access token獲得用戶信息
先定義微信用戶信息類
/// <summary>/// 微信用戶信息類/// </summary>public class OAuthUser{public OAuthUser(){ }#region 數(shù)據(jù)庫(kù)字段private string _openID;private string _searchText;private string _nickname;private string _sex;private string _province;private string _city;private string _country;private string _headimgUrl;private string _privilege;private string _unionid;#endregion#region 字段屬性/// <summary>/// 用戶的唯一標(biāo)識(shí)/// </summary>public string openid{set { _openID = value; }get { return _openID; }}/// <summary>////// </summary>public string SearchText{set { _searchText = value; }get { return _searchText; }}/// <summary>/// 用戶昵稱/// </summary>public string nickname{set { _nickname = value; }get { return _nickname; }}/// <summary>/// 用戶的性別,值為1時(shí)是男性,值為2時(shí)是女性,值為0時(shí)是未知/// </summary>public string sex{set { _sex = value; }get { return _sex; }}/// <summary>/// 用戶個(gè)人資料填寫的省份/// </summary>public string province{set { _province = value; }get { return _province; }}/// <summary>/// 普通用戶個(gè)人資料填寫的城市/// </summary>public string city{set { _city = value; }get { return _city; }}/// <summary>/// 國(guó)家,如中國(guó)為CN/// </summary>public string country{set { _country = value; }get { return _country; }}/// <summary>/// 用戶頭像,最后一個(gè)數(shù)值代表正方形頭像大小(有0、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒(méi)有頭像時(shí)該項(xiàng)為空/// </summary>public string headimgurl{set { _headimgUrl = value; }get { return _headimgUrl; }}/// <summary>/// 用戶特權(quán)信息,json 數(shù)組,如微信沃卡用戶為(chinaunicom)其實(shí)這個(gè)格式稱不上JSON,只是個(gè)單純數(shù)組/// </summary>public string privilege{set { _privilege = value; }get { return _privilege; }}public string unionid{set { _unionid = value; }get { return _unionid; }}#endregion}?
?
再?根據(jù)openid,access token獲得用戶信息
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e){ //獲取微信跳轉(zhuǎn)的第一個(gè)頁(yè)面的網(wǎng)址string tempCode = addressList[0].ToString();//微信最終獲得的codestring code = "";if (tempCode.Contains("code")){int iStart = tempCode.IndexOf("=");int iEnd = tempCode.IndexOf('&', iStart);if (iEnd < 0){iEnd = tempCode.Length - iStart;}else{iEnd -= iStart;}code = tempCode.Substring(iStart + 1, iEnd - 1); }else{return; } if (string.IsNullOrEmpty(code))return;OAuth_Token Model = Get_token(code); //獲取access_tokenOAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid);//獲取用戶信息?
這個(gè)時(shí)候,界面會(huì)顯示授權(quán)登錄成功。
注意:這里用的都是GET方法,所以在做的過(guò)程中的Json信息,都可以將url地址復(fù)制到瀏覽器,看看得到的數(shù)據(jù)是否正確,這樣可以提前驗(yàn)證一下。
路漫漫其修遠(yuǎn)兮,其中具體的細(xì)節(jié),對(duì)于編程小白來(lái)說(shuō),還是需要慢慢的琢磨一下。這里提供的是我認(rèn)為是比較笨的辦法,如果有高手有更好的實(shí)現(xiàn)辦法,歡迎提出,我會(huì)及時(shí)改正。
?
轉(zhuǎn)載于:https://www.cnblogs.com/hnsongbiao/p/7837127.html
總結(jié)
以上是生活随笔為你收集整理的C# winform C/S WebBrowser 微信第三方登录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: Linux 下安装配置redis
- 下一篇: Cadence Allegro PCB
