亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

微信開放平臺之網站授權微信登錄功能

2020-01-24 01:27:21
字體:
來源:轉載
供稿:網友

1 微信開放平臺: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頁面顯示

4. 通過官方提供的文檔,我們可以看出一共分4個步驟

第一步:請求CODE

第二步:通過code獲取access_token

第三步:通過access_token調用接口

第4步:獲取用戶個人信息(UnionID機制)

api:核心代碼

public class weixin_helper {  public weixin_helper()  {  }  /// <summary>  /// 根據AppID和AppSecret獲得access token(默認過期時間為2小時)  /// </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 + "";   //發送并接受返回值   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>  /// 取得臨時的Access Token(默認過期時間為2小時)  /// </summary>  /// <param name="code">臨時Authorization Code</param>  /// <param name="state">防止CSRF攻擊,成功授權后回調時會原樣帶回</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";   //發送并接受返回值   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>  /// 根據access_token判斷access_token是否過期  /// </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;   //發送并接受返回值   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已過期則根據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;   //發送并接受返回值   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">臨時的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);   //發送并接受返回值    string send_url = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+open_id;   //發送并接受返回值   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("出錯了,您尚未配置微信相關的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";   //開始發送   return Redirect(send_url); //跳轉到微信自己 指定的關聯登陸頁面  }  /// <summary>  /// 微信登錄返回action  /// </summary>  public ActionResult WeChatReturnUrl(string state, string code)  {   //取得返回參數   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))//若返回參數中未包含code或者state沒有通過驗證則提示出錯   {    return Content("出錯啦,state未初始化!");   }   //第一步:通過code來獲取Access Token以及openid   Dictionary<string, object> dic1 = weixin_helper.get_access_token(code, state);   if (dic1 == null || !dic1.ContainsKey("access_token"))   {    return Content("錯誤代碼:,無法獲取Access Token,請檢查App Key是否正確!");   }   if (dic1 == null || !dic1.ContainsKey("openid"))   {    if (dic1.ContainsKey("errmsg"))    {     return Content("errcode:" + dic1["errcode"] + ",errmsg:" + dic1["errmsg"]);    }    else    {     return Content("出錯啦,無法獲取用戶授權Openid!");    }   }   access_token = dic1["access_token"].ToString();//獲取access_token   expires_in = dic1["expires_in"].ToString();//獲取過期時間   refresh_token = dic1["refresh_token"].ToString();//獲取用于重新刷新access_token的憑證   openid = dic1["openid"].ToString();//用戶唯一標示openid   //儲存獲取數據用到的信息   Session["oauth_name"] = "webchat";   Session["oauth_access_token"] = access_token;   Session["oauth_openid"] = openid;   Session["oauth_refresh_token"] = refresh_token;   #region todo 將獲取到的用戶信息保存到數據庫中   #endregion   //第二步:通過Access Token以及openid來獲取用戶的基本信息   //Dictionary<string, object> dic2 = weixin_helper.get_user_info(access_token,openid);   //第三步:跳轉到指定頁面   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/":/"出錯啦,Access Token已過期或不存在!/"}";   }   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)) //調用access_token前需判斷是否過期   {    Dictionary<string, object> dic1 = weixin_helper.get_refresh_token(oauth_refresh_token);//如果已過期則重新換取新的access_token    if (dic1 == null || !dic1.ContainsKey("access_token"))    {     return "{/"openid/":/"0/", /"msg/":/"出錯啦,無法獲取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/":/"出錯啦,無法獲取授權用戶信息!/"}";   }   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/":/"出錯啦,無法獲取授權用戶信息!/"}";   }  }  #endregion
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品极品美女粉嫩高清在线| 亚洲wwwav| 日韩av黄色在线观看| 高清亚洲成在人网站天堂| 成人黄色免费看| 亚洲欧美视频在线| 久久91精品国产91久久久| 国产欧美日韩最新| 欧美成人黑人xx视频免费观看| 久久色免费在线视频| 91国产视频在线| 日韩女在线观看| 日韩人在线观看| 日韩久久精品电影| 国产欧美一区二区| 国产美女直播视频一区| 91精品国产综合久久久久久久久| 国产精品视频一区二区高潮| 26uuu国产精品视频| 在线丨暗呦小u女国产精品| 亚洲一区二区三区四区在线播放| 欧美日韩加勒比精品一区| 精品久久久久久久久久国产| 中文字幕av一区中文字幕天堂| 欧美国产日韩xxxxx| 91精品国产99久久久久久| 97视频免费在线观看| 久久久免费av| 午夜精品久久久久久久99黑人| 成人妇女淫片aaaa视频| 亚洲电影免费观看| 亚洲香蕉成人av网站在线观看| 国产黑人绿帽在线第一区| 成人亲热视频网站| 亚洲视频在线观看| 欧美在线视频免费播放| 国产精品久久色| 亚洲精品乱码久久久久久按摩观| 亚洲精品国产精品国产自| 久久综合亚洲社区| 4438全国亚洲精品在线观看视频| 久久成人这里只有精品| 97久久超碰福利国产精品…| 庆余年2免费日韩剧观看大牛| 国产精品狼人色视频一区| 日本高清视频一区| 黑人极品videos精品欧美裸| 色综合久综合久久综合久鬼88| 亚洲国产小视频在线观看| www.久久久久久.com| 66m—66摸成人免费视频| 欧美午夜精品伦理| 日韩美女写真福利在线观看| 欧美第一页在线| 国产91色在线| 亚洲福利视频专区| 国产成人精品在线| 日韩av网站导航| 91免费精品国偷自产在线| 国产精品免费久久久久影院| 亚洲成人三级在线| 日本精品视频在线观看| 中文字幕一精品亚洲无线一区| 午夜精品蜜臀一区二区三区免费| 韩日精品中文字幕| 69**夜色精品国产69乱| 日韩免费视频在线观看| 亚洲男人天堂2024| 韩曰欧美视频免费观看| 成人国产精品免费视频| 国产亚洲精品美女久久久久| 国产精品久久精品| 清纯唯美亚洲综合| 亚洲成人av在线| 亚洲欧美在线一区二区| 欧美大胆在线视频| 欧美一区二区三区图| 久久av在线看| 国产精品久久91| 91国产高清在线| 国产精品狠色婷| 91日本视频在线| 久久综合色88| 色综久久综合桃花网| 亚洲精品自在久久| 久久99精品久久久久久噜噜| 国产亚洲欧洲高清| 欧美成人精品不卡视频在线观看| 欧美大秀在线观看| 久久久久久久久久亚洲| 日韩电影中文字幕在线| 亚洲人成在线一二| 欧美wwwxxxx| 亚洲一区中文字幕在线观看| 97视频色精品| 国内偷自视频区视频综合| 日韩大片在线观看视频| 性欧美激情精品| 久久久久久久97| 国产精品xxxxx| 黄色一区二区三区| 亚洲一区制服诱惑| 日韩欧美成人区| 中文字幕久久亚洲| 国产精品久久久久影院日本| 欧美资源在线观看| 欧美亚洲一区在线| 日韩av在线一区二区| 国产成人拍精品视频午夜网站| 国模私拍一区二区三区| 欧美激情伊人电影| 欧美日韩中文字幕在线| 亚洲国产精品美女| 国产精品稀缺呦系列在线| 高清欧美性猛交xxxx| 日韩网站在线观看| 91夜夜未满十八勿入爽爽影院| 国产成人免费91av在线| 综合136福利视频在线| 国产精品爱久久久久久久| 日韩一区二区av| 精品色蜜蜜精品视频在线观看| 亚洲国产另类久久精品| 欧美黄网免费在线观看| 精品久久久久久久久中文字幕| 精品av在线播放| 亚洲一区二区三区久久| 姬川优奈aav一区二区| 欧美日韩激情视频| 国产主播在线一区| 欧美刺激性大交免费视频| 久久精品男人天堂| 亚洲高清色综合| 136fldh精品导航福利| 日本不卡视频在线播放| 96sao精品视频在线观看| 另类少妇人与禽zozz0性伦| 中文字幕亚洲二区| 日韩av日韩在线观看| 91久久久久久久久| 久久久久在线观看| 91国内揄拍国内精品对白| 久久综合九色九九| 亚洲精品456在线播放狼人| 日韩欧美在线第一页| 91在线色戒在线| 超在线视频97| 久久久久久国产精品久久| 日本国产精品视频| 国产成人久久久精品一区| 色多多国产成人永久免费网站| 欧美日韩国产一区中文午夜| 欧美激情一区二区三区成人| 国产成人精品久久二区二区| 91a在线视频| 欧美性高潮床叫视频| 欧美性猛交丰臀xxxxx网站| 欧美成年人视频网站| 欧洲成人性视频| 国产精品视频yy9099| 欧美亚洲第一页| 亚洲精品久久久一区二区三区| 国产乱人伦真实精品视频| 国产91ⅴ在线精品免费观看|