一、獲取Code
假設我們需要網頁授權的頁面的地址為redirect_uri
需要獲取Code的話我們第一步是跳轉到授權地址,我們第一步便是獲取拼接授權地址 --采用snsapi_base方式
public partial class WebAuth : System.Web.UI.Page { string Appid = "XXXXXXXXXXXXXXXXXX"; string redirect_uri = "http://www.xxxxx.com/wx/GetUserInfor.aspx"; protected void Page_Load(object sender, EventArgs e) { string url = GetCodeUrl(Appid, redirect_uri); Response.Redirect(url); } /// <summary> /// 對頁面是否要用授權 用snsapi_base方式 獲取Code Appid是微信應用id /// </summary> /// <returns></returns> public string GetCodeUrl(string Appid, string redirect_uri) { return string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect", Appid, redirect_uri); } }
當在微信中打開如下地址的時候如果授權成功,會自動跳轉到頁面redirect_uri?code=CODE&state=STATE,這樣我們就可以獲取到Code了
二、用Code換取Openid、再用Openid獲取用戶的基本信息
用get方法獲取到json格式的數據,
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
public partial class GetUserInfor : System.Web.UI.Page { string Appid = "wxceefad22b094e8a9"; string Appsecret = "935c3d938aa26fa4f627b4926afd4b16"; protected void Page_Load(object sender, EventArgs e) { string code = Request["code"]; string openid = CodeGetOpenid(code); Dictionary<string, object> userInfor = GetUserInfo(openid); Response.Write(userInfor["nickname"]); } /// <summary> /// 用Code換取Openid /// </summary> /// <param name="Code"></param> /// <returns></returns> public string CodeGetOpenid(string Code) { string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", Appid, Appsecret, Code); string ReText = WebRequestHelper.WebRequestPostOrGet(url, "");//post/get方法獲取信息 JavaScriptSerializer Jss = new JavaScriptSerializer(); Dictionary<string, object> DicText = (Dictionary<string, object>)Jss.DeserializeObject(ReText); if (!DicText.ContainsKey("openid")) return ""; return DicText["openid"].ToString(); } /// <summary> /// 用openid換取用戶信息 /// </summary> /// <param name="openid">微信標識id</param> /// <returns></returns> public Dictionary<string, object> GetUserInfo(string openid) { JavaScriptSerializer Jss = new JavaScriptSerializer(); string access_token = AccessToken.GetAccessToken();//獲取access_token string url = string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN", access_token, openid); Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(WebRequestHelper.WebRequestPostOrGet(url, "")); return respDic; //{"subscribe":1,"openid":"oOPoPs_d7K8mVLX6--WPMSbaNl5o","nickname":"SKY","sex":1,"language":"zh_CN","city":"武漢","province":"湖北","country":"中國","headimgurl":"http:\/\/wx.qlogo.cn\/mmopen\/icayX4JkqCu1d3esVCQ8rSfXlgibQLKaD3z73qhbPln3ZhMh5oNw5243vpoVZFXDKMhTqxQ76OzY934nlm3iaulq60058VmEV5v\/0","subscribe_time":1495188935,"remark":"","groupid":0,"tagid_list":[]} } }
WebRequestHelper.WebRequestPostOrGet 方法如下:
public class WebRequestHelper { public static string WebRequestPostOrGet(string posturl, string postData) { Stream outstream = null; Stream instream = null; StreamReader sr = null; HttpWebResponse response = null; HttpWebRequest request = null; Encoding encoding = Encoding.UTF8; byte[] data = encoding.GetBytes(postData); // 准備請求... try { // 設置參數 request = WebRequest.Create(posturl) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length); outstream.Close(); //發送請求並獲取相應回應數據 response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才開始向目標網頁發送Post請求 instream = response.GetResponseStream(); sr = new StreamReader(instream, encoding); //返回結果網頁(html)代碼 string content = sr.ReadToEnd(); return content; } catch (Exception ex) { string err = ex.Message; return string.Format("{\"errcode\":-2,\"errmsg\":\"{0}\"}", err); } } }
說明:以上代碼本人也是在網上搜索根本別人的代碼綜合參考改寫而來。
如需要獲取“未關注公眾號的用戶信息”,這個本人項目中還沒有遇到,僅提供參考鏈接:http://www.cnblogs.com/net-xiejun/p/4632711.html
