欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET微信公众号获取OpenID和用户信息

程序员文章站 2023-11-18 16:32:16
本文实例为大家分享了微信公众平台实现获取用户openid的方法,供大家参考,具体内容如下 index.aspx.cs代码: public partial cl...

本文实例为大家分享了微信公众平台实现获取用户openid的方法,供大家参考,具体内容如下

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("//www.jb51.net");
  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);
   }
  }
 }

结果如图:

.NET微信公众号获取OpenID和用户信息

本文已被整理到了《asp.net微信开发教程汇总》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。