1. 程式人生 > >微信公眾號【獲取openid和使用者資訊(Webform)】

微信公眾號【獲取openid和使用者資訊(Webform)】

#夢想是一場華美的旅途,每個人在找到它之前,都只是孤獨的少年。

#Index.aspx.cs程式碼:

 public partial class Index : System.Web.UI.Page
    {

        //使用者id
        public string openid = "";
      
        //公眾號資訊部分
        public string appid = ConfigurationManager.AppSettings["AppId"];
        public string appsecret = ConfigurationManager.AppSettings["AppSecret"];
        public string redirect_uri =HttpUtility.UrlEncode("http://www.china101.net/wxtest/Index.aspx");
        public string scope = "【刪除這個並填入請求型別,例如:snsapi_userinfo】";

        #region 顯示頁面
        public string accesstoken;
        public string nickname;
        public string sex;
        public string headimgurl;
        public string province;
        public string country;
        public string language;
        public string city;
            
        public string privilege = "";
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {

            /*
           *微信認證獲取openid部分:
           *臨時認證code
           */
            //微信認證部分:第二步 獲得code
            string code = Request["code"];
            if (string.IsNullOrEmpty(code))
            {
                //如果code沒獲取成功,重新拉取一遍
                OpenAccess();
            }
            //微信認證部分:第三步    獲得openid
            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 result = HttpClientHelper.GetResponse(url);
            LogHelper.WriteFile(result);
            JObject outputObj = JObject.Parse(result);

            //微信認證部分:第四步   獲得更多資訊
            accesstoken = outputObj["access_token"].ToString();
            openid = outputObj["openid"].ToString();
            url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN",accesstoken,openid);
            string result1 = HttpClientHelper.GetResponse(url);
            LogHelper.WriteFile(result1);
            JObject outputObj1 = JObject.Parse(result1);//將json轉為陣列
            //以下是第四步獲得的資訊:       
             nickname = outputObj1["nickname"].ToString(); //暱稱
             sex = outputObj1["sex"].ToString(); //性別什麼的
             headimgurl = outputObj1["headimgurl"].ToString(); //頭像url
             province = outputObj1["province"].ToString(); ;
             country = outputObj1["country"].ToString(); ;
             language = outputObj1["language"].ToString(); ;
             city = outputObj1["city"].ToString(); ;
            //將獲得的使用者資訊填入到session中
            Session["openid"] = outputObj1["openid"];
            //轉向回入口
            //OpenAccess();
        }

        /*
         * 接入入口
         * 開放到微信選單中呼叫
         * @param $dir_url 來源url
         * @since 1.0
         * @return void
         */
        public void OpenAccess()
        {
            //判斷session不存在
            if (Session["openid"] == null)
            {
                //認證第一步:重定向跳轉至認證網址
                string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&&response_type=code&scope=snsapi_userinfo&m=oauth2#wechat_redirect", appid, redirect_uri);
                Response.Redirect(url);
            }
            //判斷session存在
            else
            {
                //跳轉到前端頁面.aspx
                Response.Redirect(Request.Url.ToString());
            }
        }

    }

#Index.aspx內容:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="TEST.Index" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
        td
        {
            word-wrap: break-word;
        }
    </style>
    <script type="text/javascript">
     
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div id="wu" runat="server">
        <table style="width: 100%;">
            <tr>
                <td style="width: 150px;">
                    <p>
                        openid:<%=openid%></p>
                </td>
                <td>
                    <p>
                        nickname:<%=nickname%></p>
                </td>
                <td>
                    <p>
                        sex:<%=sex%></p>
                </td>
            </tr>
            <tr>
                <td>
                    <p>
                        language:<%=language%></p>
                </td>
                <td>
                    <p>
                        city:<%=city%></p>
                </td>
                <td>
                    <p>
                        country:<%=country%></p>
                </td>
            </tr>
            <tr>
                <td>
                    <p>
                        headimgurl:<img width="50px;" src="<%=headimgurl %>" alt=""></p>
                </td>
                <td>
                    <p>
                        privilege:<%=privilege%></p>
                </td>
                <td>
                </td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>

#HttpClientHelper.cs程式碼:

public class HttpClientHelper
    {
        /// <summary>
        ///     get請求
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string GetResponse(string url)
        {
            if (url.StartsWith("https"))
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
            }

            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json"));
           
            HttpResponseMessage response = httpClient.GetAsync(url).Result;

            if (response.IsSuccessStatusCode)
            {
                string result = response.Content.ReadAsStringAsync().Result;
                return result;
            }
            return null;
        }

        public static T GetResponse<T>(string url)
            where T : class, new()
        {
            if (url.StartsWith("https"))
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage response = httpClient.GetAsync(url).Result;

            T result = default(T);

            if (response.IsSuccessStatusCode)
            {
                Task<string> t = response.Content.ReadAsStringAsync();
                string s = t.Result;

                result = JsonConvert.DeserializeObject<T>(s);
            }
            return result;
        }

        /// <summary>
        ///     post請求
        /// </summary>
        /// <param name="url"></param>
        /// <param name="postData">post資料</param>
        /// <returns></returns>
        public static string PostResponse(string url, string postData)
        {
            if (url.StartsWith("https"))
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

            HttpContent httpContent = new StringContent(postData);
            httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            var httpClient = new HttpClient();

            HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;

            if (response.IsSuccessStatusCode)
            {
                string result = response.Content.ReadAsStringAsync().Result;
                return result;
            }
            return null;
        }

        /// <summary>
        ///     發起post請求
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="url">url</param>
        /// <param name="postData">post資料</param>
        /// <returns></returns>
        public static T PostResponse<T>(string url, string postData)
            where T : class, new()
        {
            if (url.StartsWith("https"))
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

            HttpContent httpContent = new StringContent(postData);
            httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            var httpClient = new HttpClient();

            T result = default(T);

            HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;

            if (response.IsSuccessStatusCode)
            {
                Task<string> t = response.Content.ReadAsStringAsync();
                string s = t.Result;

                result = JsonConvert.DeserializeObject<T>(s);
            }
            return result;
        }

        /// <summary>
        ///     V3介面全部為Xml形式,故有此方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="url"></param>
        /// <param name="xmlString"></param>
        /// <returns></returns>
        public static T PostXmlResponse<T>(string url, string xmlString)
            where T : class, new()
        {
            if (url.StartsWith("https"))
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

            HttpContent httpContent = new StringContent(xmlString);
            httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            var httpClient = new HttpClient();

            T result = default(T);

            HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;

            if (response.IsSuccessStatusCode)
            {
                Task<string> t = response.Content.ReadAsStringAsync();
                string s = t.Result;

                result = XmlDeserialize<T>(s);
            }
            return result;
        }

        /// <summary>
        ///     反序列化Xml
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="xmlString"></param>
        /// <returns></returns>
        public static T XmlDeserialize<T>(string xmlString)
            where T : class, new()
        {
            try
            {
                var ser = new XmlSerializer(typeof (T));
                using (var reader = new StringReader(xmlString))
                {
                    return (T) ser.Deserialize(reader);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("XmlDeserialize發生異常:xmlString:" + xmlString + "異常資訊:" + ex.Message);
            }
        }
    }

#結果如圖:
這裡寫圖片描述