微信開(kāi)放平臺(tái)之網(wǎng)站授權(quán)微信登錄功能
1 微信開(kāi)放平臺(tái):https://open.weixin.qq.com/
2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN
3.pc頁(yè)面顯示
4. 通過(guò)官方提供的文檔,我們可以看出一共分4個(gè)步驟
第一步:請(qǐng)求CODE
第二步:通過(guò)code獲取access_token
第三步:通過(guò)access_token調(diào)用接口
第4步:獲取用戶個(gè)人信息(UnionID機(jī)制)
api:核心代碼
public class weixin_helper { public weixin_helper() { } /// <summary> /// 根據(jù)AppID和AppSecret獲得access token(默認(rèn)過(guò)期時(shí)間為2小時(shí)) /// </summary> /// <returns>Dictionary</returns> public static Dictionary<string, object> get_access_token() { //獲得配置信息 oauth_config config = oauth_helper.get_config(2); string send_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + config.oauth_app_id + "&secret=" + config.oauth_app_key + ""; //發(fā)送并接受返回值 string result = Utils.HttpGet(send_url); if (result.Contains("errmsg")) { return null; } try { Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result); return dic; } catch { return null; } } /// <summary> /// 取得臨時(shí)的Access Token(默認(rèn)過(guò)期時(shí)間為2小時(shí)) /// </summary> /// <param name="code">臨時(shí)Authorization Code</param> /// <param name="state">防止CSRF攻擊,成功授權(quán)后回調(diào)時(shí)會(huì)原樣帶回</param> /// <returns>Dictionary</returns> public static Dictionary<string, object> get_access_token(string code, string state) { //獲得配置信息 oauth_config config = oauth_helper.get_config(2); string send_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + config.oauth_app_id + "&secret=" + config.oauth_app_key + "&code="+code+"&grant_type=authorization_code"; //發(fā)送并接受返回值 string result = Utils.HttpGet(send_url); if (result.Contains("errmsg")) { return null; } try { Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result); return dic; } catch { return null; } } /// <summary> /// 根據(jù)access_token判斷access_token是否過(guò)期 /// </summary> /// <param name="access_token"></param> /// <returns>true表示未失效</returns> public static bool check_access_token(string access_token) { //獲得配置信息 oauth_config config = oauth_helper.get_config(2); string send_url = "https://api.weixin.qq.com/sns/auth?access_token=" + access_token + "&openid=" + config.oauth_app_id; //發(fā)送并接受返回值 string result = Utils.HttpGet(send_url); try { Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result); if (dic.ContainsKey("errmsg")) { if (dic["errmsg"].ToString()=="ok") { return true; } else { return false; } } return false; } catch { return false; } } /// <summary> /// 若fresh_token已過(guò)期則根據(jù)refresh_token取得新的refresh_token /// </summary> /// <param name="refresh_token">refresh_token</param> /// <returns>Dictionary</returns> public static Dictionary<string, object> get_refresh_token(string refresh_token) { //獲得配置信息 oauth_config config = oauth_helper.get_config(2); string send_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + config.oauth_app_id + "&grant_type=refresh_token&refresh_token=" + refresh_token; //發(fā)送并接受返回值 string result = Utils.HttpGet(send_url); if (result.Contains("errmsg")) { return null; } try { Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result); return dic; } catch { return null; } } /// <summary> /// 獲取登錄用戶自己的基本資料 /// </summary> /// <param name="access_token">臨時(shí)的Access Token</param> /// <param name="open_id">用戶openid</param> /// <returns>Dictionary</returns> public static Dictionary<string, object> get_user_info(string access_token, string open_id) { //獲得配置信息 oauth_config config = oauth_helper.get_config(2); //發(fā)送并接受返回值 string send_url = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+open_id; //發(fā)送并接受返回值 string result = Utils.HttpGet(send_url); if (result.Contains("errmsg")) { return null; } //反序列化JSON Dictionary<string, object> dic = JsonHelper.DataRowFromJSON(result); return dic; } }
控制器的核心代碼:
#region 微信登錄 /// <summary> /// 微信登錄 /// </summary> public ActionResult WeChat() { //獲得配置信息 oauth_config config = oauth_helper.get_config(2); //主鍵id if (config == null) { return Content("出錯(cuò)了,您尚未配置微信相關(guān)的API信息!"); } string state = Guid.NewGuid().ToString().Replace("-", ""); Session["oauth_state"] = state; string send_url = "https://open.weixin.qq.com/connect/qrconnect?appid=" + config.oauth_app_id + "&redirect_uri=" + Utils.UrlEncode(config.return_uri.ToLower()) + "&response_type=code&scope=snsapi_login&state=" + state + "#wechat_redirect"; //開(kāi)始發(fā)送 return Redirect(send_url); //跳轉(zhuǎn)到微信自己 指定的關(guān)聯(lián)登陸頁(yè)面 } /// <summary> /// 微信登錄返回action /// </summary> public ActionResult WeChatReturnUrl(string state, string code) { //取得返回參數(shù) string access_token = string.Empty; string expires_in = string.Empty; string client_id = string.Empty; string openid = string.Empty; string refresh_token = string.Empty; if (Session["oauth_state"] == null || Session["oauth_state"].ToString() == "" || state != Session["oauth_state"].ToString() || string.IsNullOrEmpty(code))//若返回參數(shù)中未包含code或者state沒(méi)有通過(guò)驗(yàn)證則提示出錯(cuò) { return Content("出錯(cuò)啦,state未初始化!"); } //第一步:通過(guò)code來(lái)獲取Access Token以及openid Dictionary<string, object> dic1 = weixin_helper.get_access_token(code, state); if (dic1 == null || !dic1.ContainsKey("access_token")) { return Content("錯(cuò)誤代碼:,無(wú)法獲取Access Token,請(qǐng)檢查App Key是否正確!"); } if (dic1 == null || !dic1.ContainsKey("openid")) { if (dic1.ContainsKey("errmsg")) { return Content("errcode:" + dic1["errcode"] + ",errmsg:" + dic1["errmsg"]); } else { return Content("出錯(cuò)啦,無(wú)法獲取用戶授權(quán)Openid!"); } } access_token = dic1["access_token"].ToString();//獲取access_token expires_in = dic1["expires_in"].ToString();//獲取過(guò)期時(shí)間 refresh_token = dic1["refresh_token"].ToString();//獲取用于重新刷新access_token的憑證 openid = dic1["openid"].ToString();//用戶唯一標(biāo)示openid //儲(chǔ)存獲取數(shù)據(jù)用到的信息 Session["oauth_name"] = "webchat"; Session["oauth_access_token"] = access_token; Session["oauth_openid"] = openid; Session["oauth_refresh_token"] = refresh_token; #region todo 將獲取到的用戶信息保存到數(shù)據(jù)庫(kù)中 #endregion //第二步:通過(guò)Access Token以及openid來(lái)獲取用戶的基本信息 //Dictionary<string, object> dic2 = weixin_helper.get_user_info(access_token,openid); //第三步:跳轉(zhuǎn)到指定頁(yè)面 return Content(WeChatResultJson()); } /// <summary> /// 微信登錄返回action, 處理用戶信息 /// </summary> public string WeChatResultJson() { string oauth_access_token = string.Empty; string oauth_openid = string.Empty; string oauth_name = string.Empty; string oauth_refresh_token = string.Empty; if (Session["oauth_name"] == null || Session["oauth_access_token"] == null || Session["oauth_openid"] == null) { return "{\"ret\":\"1\", \"msg\":\"出錯(cuò)啦,Access Token已過(guò)期或不存在!\"}"; } oauth_name = Session["oauth_name"].ToString(); oauth_access_token = Session["oauth_access_token"].ToString(); oauth_openid = Session["oauth_openid"].ToString(); oauth_refresh_token = Session["oauth_refresh_token"].ToString(); if (!weixin_helper.check_access_token(oauth_access_token)) //調(diào)用access_token前需判斷是否過(guò)期 { Dictionary<string, object> dic1 = weixin_helper.get_refresh_token(oauth_refresh_token);//如果已過(guò)期則重新?lián)Q取新的access_token if (dic1 == null || !dic1.ContainsKey("access_token")) { return "{\"openid\":\"0\", \"msg\":\"出錯(cuò)啦,無(wú)法獲取access_token!\"}"; } oauth_access_token = dic1["access_token"].ToString(); } Dictionary<string, object> dic = weixin_helper.get_user_info(oauth_access_token, oauth_openid); if (dic == null) { return "{\"openid\":\"0\", \"msg\":\"出錯(cuò)啦,無(wú)法獲取授權(quán)用戶信息!\"}"; } try { StringBuilder str = new StringBuilder(); str.Append("{"); str.Append("\"openid\": \"" + dic["openid"].ToString() + "\", "); str.Append("\"nickname\": \"" + dic["nickname"].ToString() + "\", "); str.Append("\"sex\": \"" + dic["sex"].ToString() + "\", "); str.Append("\"province\": \"" + dic["province"].ToString() + "\", "); str.Append("\"city\": \"" + dic["city"].ToString() + "\", "); str.Append("\"country\": \"" + dic["country"].ToString() + "\", "); str.Append("\"headimgurl\": \"" + dic["headimgurl"].ToString() + "\", "); str.Append("\"privilege\": \"" + dic["privilege"].ToString() + "\", "); str.Append("\"unionid\": \"" + dic["unionid"].ToString() + "\""); str.Append("\"oauth_name\": \"" + oauth_name + "\""); str.Append("\"oauth_access_token\": \"" + oauth_access_token + "\""); str.Append("\"oauth_openid\": \"" + oauth_openid + "\""); str.Append("}"); return str.ToString(); } catch { return "{\"ret\":\"0\", \"msg\":\"出錯(cuò)啦,無(wú)法獲取授權(quán)用戶信息!\"}"; } } #endregion
上一篇:winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法
欄 目:C#教程
本文標(biāo)題:微信開(kāi)放平臺(tái)之網(wǎng)站授權(quán)微信登錄功能
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6954.html
您可能感興趣的文章
- 01-10C#微信開(kāi)發(fā)(服務(wù)器配置)
- 01-10C#微信公眾平臺(tái)開(kāi)發(fā)之高級(jí)群發(fā)接口
- 01-10C#微信公眾平臺(tái)開(kāi)發(fā)之a(chǎn)ccess
- 01-10C#微信開(kāi)發(fā)之微信公眾號(hào)標(biāo)簽管理功能
- 01-10C#微信公眾號(hào)與訂閱號(hào)接口開(kāi)發(fā)示例代碼
- 01-10C#微信開(kāi)發(fā)第一章
- 01-10C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝示例
- 01-10WPF微信聊天和通訊錄按鈕樣式代碼分享
- 01-10使用TypeScript開(kāi)發(fā)微信小程序的方法
- 01-10c#版在pc端發(fā)起微信掃碼支付的實(shí)例


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)