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