微信公众号开发中使用ASP.NET获取openid和用户信息的C#代码

微信公众号开发中使用ASP.NET获取openid和用户信息的C#代码,本文来自于逆世风灵编写的文档

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);
            }
        }
    }

Guess you like

Origin blog.csdn.net/shan1774965666/article/details/106016865