asp.net微信开发(已关注用户管理)

前端技术 2023/09/07 .NET

公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成。一次拉取调用最多拉取10000个关注者的OpenID,可以通过多次拉取的方式来满足需求。

接口调用请求说明

http请求方式: GET(请使用https协议)

返回说明

正确时返回JSON数据包:

错误时返回JSON数据包(示例为无效AppID错误):

{\"errcode\":40013,\"errmsg\":\"invalid appid\"}
附:关注者数量超过10000时

当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求。

具体而言,就是在调用接口时,将上一次调用得到的返回中的next_openid值,作为下一次调用中的next_openid值。

示例如下:

公众账号A拥有23000个关注的人,想通过拉取关注接口获取所有关注的人,那么分别请求url如下:
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN
返回结果:

{
 \"total\":23000,
 \"count\":10000,
 \"data\":{\"
  openid\":[
  \"OPENID1\",
  \"OPENID2\",
  ...,
  \"OPENID10000\"
  ]
 },
 \"next_openid\":\"OPENID10000\"
}

https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID1
返回结果:

{
 \"total\":23000,
 \"count\":10000,
 \"data\":{
  \"openid\":[
  \"OPENID10001\",
  \"OPENID10002\",
  ...,
  \"OPENID20000\"
  ]
 },
 \"next_openid\":\"OPENID20000\"
}

https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID2
返回结果(关注者列表已返回完时,返回next_openid为空):

{
  \"total\":23000,
  \"count\":3000,
  \"data\":{\"
    \"openid\":[
     \"OPENID20001\",
     \"OPENID20002\",
     ...,
     \"OPENID23000\"
    ]
  },
  \"next_openid\":\"OPENID23000\"
}

微信官方网站后台的接口权限表里(以服务号为例)每天调用的获取用户列表能获取500次,获取用户基本信息可以获取500000次,所以说接下来,我在获取用户列表的时候,会用到缓存,别看500次不少了,
可是真正的用起来快得不得了,先上效果图如下:

先来看看用户列表,官网说获取用户的列表返回的是一组组openID,针对这个特性,我是这么做的,
创建一个用于存储openId的类

public class WxOpenIdInfo
  {
    public string WxopenId { get; set; }//用户存放微信用户的openId
  }

然后再创建用户信息的基本类

 /// <summary>
  /// 微信用户基本信息类
  /// </summary>
  public class WxUserInfo
  {
    public int subscribe { get; set; }//关注状态

    public string openid { get; set; }//OpenID

    public string nickname { get; set; }//昵称

    public string sex { get; set; }//性别

    public string city { get; set; }//城市

    public string province { get; set; }//省份

    public string headimgurl { get; set; }//头像图片地址

    public string subscribe_time { get; set; }//关注时间

    public string remark { get; set; }//备注

    public string groupid { get; set; }//分组ID

  }

 用户列表前台代码

<%@ Page Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"WeiXinUserList.aspx.cs\" Inherits=\"DQWebSite.Administrator.WeiXinUserList\" %>

<!DOCTYPE html>

<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head runat=\"server\">
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>
  <title></title>
  <link href=\"css/style.css\" rel=\"Stylesheet\" type=\"text/css\" />
  <style type=\"text/css\">
    #title {width:100%; height:40px;margin-top:10px; text-indent:5px; line-height:40px;}
    .checkstyle { float:left;}
    #DDlAddgroups { text-align:center; width:161px; border:1px solid #d9d9d9; border-radius:5px; height:35px; line-height:35px; font-weight:bold; text-align:center; float:left; margin:auto 5px auto 5px;}
    .DDlAddgroups{ text-align:center; width:161px; border:1px solid #d9d9d9; border-radius:5px; height:35px; line-height:35px; font-weight:bold; text-align:center; float:left; margin:auto 5px auto 5px;}
    #DDLgroups { text-align:center; width:111px; border:1px solid #d9d9d9; border-radius:5px; height:35px; line-height:35px; font-weight:bold; text-align:center; float:left; margin:auto 5px auto 5px;}
    .newGroups { margin:auto 5px auto 5px;}
    .inputstyle { height:35px; line-height:35px; text-indent:5px; width:280px;background-image:url(\'images/inputbg.gif\'); background-repeat:repeat-x;border-top:solid 1px #a7b5bc; border-left:solid 1px #a7b5bc; border-right:solid 1px #ced9df; border-bottom:solid 1px #ced9df; float:left; margin:auto 5px auto 5px;
    }
    .wxusertab { border:1px solid #d9d9d9; width:100%; text-align:left; text-indent:5px;
    } 
    
    th { height:35px;background-image:url(\'images/th.gif\'); background-repeat:repeat-x;
    }
    td {
      border-bottom:1px solid #d9d9d9;
    }
    .trcolor { background-color:#ecd9df;
    }
    tr:hover { cursor:pointer; 
    }
     #FenPage { width:1124px; height:25px; line-height:25px; text-align:center; margin:20px auto 20px auto;
    }
    .linka { color:#0094ff; cursor:pointer;
    }
    .fenyebtn {width:60px; height:25px; border:1px solid #ced9df; border-radius:5px; text-align:center; line-height:25px; float:right;
    }
    .fenyebtn2 { width:60px; height:25px; border:1px solid #ced9df; border-radius:5px; text-align:center; line-height:25px;margin-left:10px;float:right;
    }
    .toPageIndex { width:60px;height:25px; background-image:url(\'images/inputbg.gif\'); margin-left:10px; background-repeat:repeat-x;border-top:solid 1px #a7b5bc; border-left:solid 1px #a7b5bc; border-right:solid 1px #ced9df; border-bottom:solid 1px #ced9df; text-align:center; float:right;
    }
    .gotoPagebtn { width:60px; height:25px; border:1px solid #ced9df; border-radius:5px; text-align:center; line-height:25px;margin-left:10px;float:right; background-color:#ced9df;
    }
    .deletebtn {float:left;width:100px; color:#000; height:25px; background-color:#ced9df; border:1px solid #ced9df; border-radius:5px; text-align:center;
    }
    a { color:#08a5e0;
    }
    .droplist { background-image:url(\'images/inputbg.gif\'); background-repeat:repeat-x; width:120px; height:25px; border:1px solid #ced9df;
    }
    .checkstyle { float:left;
    }
    .imgheadstyle { width:50px; height:50px; margin-top:10px;
    }
    .lbsubscribeCount { font-size:26px;
    }

    #shownewgroup { width:300px; height:200px; background-color:white;z-index:9999; border:2px solid #DDD; top:40%; left:40%; background-color:#fff; position:fixed;margin:-100px auto auto -100px; display:none;
    }
    #shownewgroupzhezhaoceng { height:200%; width:200%; left:0px; top:0px;position:fixed; z-index:9998; background:rgb(50,50,50);background:rgba(0,0,0,0.5); display:none;
    }
    .closeLogin { height:30px; border-bottom:2px solid #31bb34; text-align:right; line-height:30px; font-size:14px; font-weight:bold;
    }
    a:hover { cursor:pointer;
    }


    #updateremark { width:300px; height:200px; background-color:white;z-index:9999; border:2px solid #DDD; top:40%; left:40%; background-color:#fff; position:fixed;margin:-100px auto auto -100px; display:none;
    }
    #updateremark_zhezhaoceng { height:100%; width:100%; left:0px; top:0px;position:fixed; z-index:9998; background:rgb(50,50,50);background:rgba(0,0,0,0.5); display:none;
    }

  </style>

   <script src=\"../js/jquery-1.7.1.min.js\" type=\"text/javascript\"></script>
  <script type=\"text/javascript\">
    $(document).ready(function () {

      $(\".newGroups\").click(function () {
        $(\"#shownewgroupzhezhaoceng\").show();
        $(\"#shownewgroup\").show();
      }),
     $(\'.closeloginpage\').click(function () {
       $(\"#shownewgroupzhezhaoceng\").hide();
       $(\"#shownewgroup\").hide();
     })
    })
  </script>
</head>
<body>
  <form id=\"form1\" runat=\"server\">
  <div class=\"place\">
        <span>位置:</span>
        <ul class=\"placeul\">
          <li><a href=\"WelCome.aspx\" target=\"rightFrame\">首页</a></li>
          <li>微信管理</li>
          <li>德桥员工服务中心--关注者列表管理</li>
        </ul>
   </div>
      <asp:ScriptManager ID=\"ScriptManager1\" runat=\"server\"></asp:ScriptManager>
      <asp:UpdatePanel ID=\"UpdatePanel1\" runat=\"server\">
        <ContentTemplate>
          <div id=\"shownewgroup\">
          <div class=\"closeLogin\"><a class=\"closeloginpage\"><span style=\"float:left; color:#08a5e0; font-size:18px; text-indent:5px;\">新建分组</span>关闭</a>  </div>
       <div style=\"font-size:12px; height:40px; color:red; line-height:40px;\">  30字符以内</div>
       <input type=\"text\" id=\"txtgroupsName\" name=\"txtgroupsName\" class=\"inputstyle\" maxlength=\"30\" runat=\"server\" value=\"分组名称\" onfocus=\"if(value==defaultValue){value=\'\';this.style.color=\'#000\'}\" onblur=\"if(!value){value=defaultValue;this.style.color=\'#999\'}\" style=\"color:#999\"/>
      <asp:LinkButton ID=\"LinkBtnCreateGroup\" runat=\"server\" OnClick=\"LinkBtnCreateGroup_Click\"><div style=\"background-image:url(\'images/buttonbg.png\'); width:111px; height:35px; line-height:35px; font-weight:bold;float:left; margin-top:20px; margin-left:5px; text-align:center;color:#fff;\"> 确定创建</div></asp:LinkButton>
         </div>
         <div id=\"shownewgroupzhezhaoceng\"></div>
      <div style=\" border-bottom:2px solid #31bb34; height:30px; margin-top:10px; text-indent:10px; font-size:22px; line-height:30px; width:100%;\"><span style=\"float:left; font-size:16px;\">已关注人数</span><span style=\"color:red;\"><asp:Label ID=\"lbsubscribeCount\" CssClass=\"lbsubscribeCount\" runat=\"server\" Text=\"Label\"></asp:Label> </span></div>
      <div id=\"title\">
      <asp:CheckBox ID=\"CheckAll\" runat=\"server\" CssClass=\"checkstyle\" OnCheckedChanged=\"CheckAll_CheckedChanged\" /><span style=\"float:left;\">全选 </span>
      
      <asp:DropDownList ID=\"DDlAddgroups\" CssClass=\"DDlAddgroups\" runat=\"server\" OnSelectedIndexChanged=\"DDlAddgroups_SelectedIndexChanged\">
      </asp:DropDownList>
       <asp:DropDownList ID=\"DDLgroups\" runat=\"server\">
      </asp:DropDownList>
      <a class=\"newGroups\"><div style=\"background-image:url(\'images/buttonbg.png\'); width:111px; height:35px; line-height:35px; margin:auto 20px auto 10px; font-weight:bold;float:left; text-align:center;color:#fff;\"> + 新建分组</div></a>
       <a href=\"WxGroupManageList.aspx\"><div style=\"background-image:url(\'images/buttonbg.png\'); width:111px; height:35px; line-height:35px; margin:auto 20px auto 10px; font-weight:bold;float:left; text-align:center;color:#fff;\">分组管理</div></a>
        <a href=\"WeiXinUserList.aspx\"><div style=\"background-image:url(\'images/buttonbg.png\'); width:111px; height:35px; line-height:35px; margin:auto 20px auto 10px; font-weight:bold;float:left; text-align:center;color:#fff;\">刷  新</div></a>

<%--      <input type=\"text\" id=\"txtName\" name=\"txtName\" class=\"inputstyle\" runat=\"server\" value=\"用户昵称\" onfocus=\"if(value==defaultValue){value=\'\';this.style.color=\'#000\'}\" onblur=\"if(!value){value=defaultValue;this.style.color=\'#999\'}\" style=\"color:#999\"/>

       <asp:LinkButton ID=\"LinkButton1\" runat=\"server\"><div style=\"background-image:url(\'images/buttonbg.png\'); width:111px; height:35px; line-height:35px; font-weight:bold;float:left; text-align:center;color:#fff;\"> 查询</div></asp:LinkButton>--%>
    </div>
     <table class=\"wxusertab\">
    <asp:Repeater ID=\"RepeaterWxUserList\" runat=\"server\" OnItemDataBound=\"RepeaterWxUserList_ItemDataBound\">
      <HeaderTemplate>
        <tr>
          <th></th>
          <th>OpenID</th>
          <th>头像</th>
          <th>昵称(备注名)</th>
          <th>关注时间</th>
          <th>所属分组</th>
          <th>操作</th>
        </tr>
      </HeaderTemplate>
      <ItemTemplate>
            <tr style=\"width:100%; line-height:50px;\">
              <td style=\"width:30px;\">  <asp:CheckBox ID=\"CheckIn\" runat=\"server\" CssClass=\"checkstyle\" /> <%--OnCheckedChanged=\"CheckIn_CheckedChanged\"--%></td>
              <td style=\"width:150px;\"><asp:Label ID=\"lbwxopenID\" runat=\"server\" Text=\"\"></asp:Label>
              </td>
              <td style=\"width:80px;\"><asp:Image ID=\"ImgHeadUrl\" runat=\"server\" CssClass=\"imgheadstyle\" /> </td>
              <td style=\"width:150px;\"><asp:Label ID=\"lbNickName\" runat=\"server\" CssClass=\"checkstyle\" Text=\"\"></asp:Label>
                <asp:Label ID=\"lbRemark\" runat=\"server\" Text=\"\"></asp:Label>
              </td>
              <td style=\"width:130px;\">
                <asp:Label ID=\"lbSubscrine_time\" runat=\"server\" Text=\"\"></asp:Label>
              </td>
              <td style=\"width:100px;\"> 
                <asp:Label ID=\"lbgroupId\" runat=\"server\" CssClass=\"checkstyle\" Visible=\"false\" Text=\"\"></asp:Label>
                <asp:DropDownList ID=\"DDlAddgroupss\" Enabled=\"false\" CssClass=\"DDlAddgroups\" runat=\"server\">
                <asp:ListItem Value=\"0\">分组名称</asp:ListItem>
              </asp:DropDownList>
              </td>
              <td style=\"width:110px;\">
                <a href=\'UpdateRemarkName.aspx?id=<%# Eval(\"WxopenId\") %>\'><div style=\" border:1px solid #d9d9d9; border-radius:5px; width:111px; height:35px; line-height:35px; font-weight:bold;float:left; text-align:center;\"> 修改备注名称</div></a>
              </td>
            </tr>
      </ItemTemplate>
    </asp:Repeater>
       </table>
     <div id=\"FenPage\">
        <asp:LinkButton ID=\"LinkBtnToPage\" CssClass=\"gotoPagebtn\" runat=\"server\" OnClick=\"LinkBtnToPage_Click\">确定</asp:LinkButton>
        <asp:TextBox ID=\"txtPageIndex\" CssClass=\"toPageIndex\" runat=\"server\"></asp:TextBox> 
        <asp:HyperLink ID=\"lnkLast\" runat=\"server\"><span class=\"fenyebtn2\">>>|</span></asp:HyperLink> 
        <asp:HyperLink ID=\"lnkNext\" runat=\"server\"><span class=\"fenyebtn2\">></span></asp:HyperLink> 
         <asp:HyperLink ID=\"lnkTop\" runat=\"server\"><span class=\"fenyebtn2\"><</span></asp:HyperLink> 
        <asp:HyperLink ID=\"lnkFist\" runat=\"server\"><span class=\"fenyebtn\">|<<</span></asp:HyperLink> 
       <span style=\"float:left;\">当前第</span>
        <span style=\"float:left; color:red;\"><asp:Label ID=\"lbPageIndex\" runat=\"server\" Text=\"\"></asp:Label></span>
        <span style=\"float:left;margin-left:5px;\">页/</span>
        <span style=\"float:left;margin-left:5px;\">共</span>
        <span style=\"float:left;color:red;\"><asp:Label ID=\"lbCountPage\" runat=\"server\" Text=\"\"></asp:Label></span>
        <span style=\"float:left;margin-left:5px;\">页</span>
        <span style=\"float:left;margin-left:10px;\"><asp:Label ID=\"lbPageSize\" runat=\"server\" Text=\"\"></asp:Label></span>
        <span style=\"float:left;margin-left:10px;\">共搜索到 </span>
        <span style=\"float:left;margin-left:5px; color:red;\"><asp:Label ID=\"lbCountData\" runat=\"server\" Text=\"\"></asp:Label></span>
        <span style=\"float:left;margin-left:5px;\">条记录.</span>
      </div>
      </ContentTemplate>
    </asp:UpdatePanel>
  </form>
</body>
</html>

获取用户列表绑定用户信息的后台代码,已包括,修改备注名,将用户移动到分组,新建分组代码

分组统计,用于显示每个分组的已存在人数,无其他作用

上代码:

 PagedDataSource pds = new PagedDataSource();
    protected void Page_Load(object sender, EventArgs e)
    {
      if(!Page.IsPostBack)
      {
        BindGroupList();
        BindGetAllUserOpenIdList();
        this.DataBind();
        this.CheckAll.AutoPostBack = true;
        this.DDlAddgroups.AutoPostBack = true;
      }
      //this.DDlAddgroups.Enabled = false;
      
    }
    /// <summary>
    /// 获取所有用户的openId列表
    /// </summary>
    private void BindGetAllUserOpenIdList()
    {
      WeiXinServer wxs = new WeiXinServer();

      ///从缓存读取accesstoken
      string Access_token = Cache[\"Access_token\"] as string;

      if (Access_token == null)
      {
        //如果为空,重新获取
        Access_token = wxs.GetAccessToken();

        //设置缓存的数据7000秒后过期
        Cache.Insert(\"Access_token\", Access_token, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
      }

      string Access_tokento = Access_token.Substring(17, Access_token.Length - 37);

      string jsonres = \"\";

      string content = Cache[\"AllUserOpenList_content\"] as string;

      if (content == null)
      {
        jsonres = \"https://api.weixin.qq.com/cgi-bin/user/get?access_token=\" + Access_tokento;

        HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(jsonres);
        myRequest.Method = \"GET\";
        HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
        StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
        content = reader.ReadToEnd();
        reader.Close();

        //设置缓存的数据7000秒后过期
        Cache.Insert(\"AllUserOpenList_content\", content, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
      }

      //使用前需要引用Newtonsoft.json.dll文件
      JObject jsonObj = JObject.Parse(content);


      int totalnum = int.Parse(jsonObj[\"count\"].ToString());


      List<WxOpenIdInfo> openidlist = new List<WxOpenIdInfo>();


      for (int i = 0; i < totalnum;i++ )
      {
        WxOpenIdInfo wxopeninfo = new WxOpenIdInfo();
        wxopeninfo.WxopenId = jsonObj[\"data\"][\"openid\"][i].ToString();
        openidlist.Add(wxopeninfo);
      }


      pds.DataSource = openidlist;
      pds.AllowPaging = true;
      pds.PageSize = 20;//每页显示为20条
      int CurrentPage;


      if (!String.IsNullOrWhiteSpace(this.txtPageIndex.Text.ToString().Trim()))
      {

        CurrentPage = Convert.ToInt32(this.txtPageIndex.Text.ToString().Trim());
      }
      else if (Request.QueryString[\"Page\"] != null)
      {
        CurrentPage = Convert.ToInt32(Request.QueryString[\"Page\"]);
      }
      else
      {
        CurrentPage = 1;
      }
      pds.CurrentPageIndex = CurrentPage - 1;//当前页的索引就等于当前页码-1;
      if (!pds.IsFirstPage)
      {
        //Request.CurrentExecutionFilePath 为当前请求的虚拟路径
        this.lnkTop.NavigateUrl = Request.CurrentExecutionFilePath + \"?Page=\" + Convert.ToString(CurrentPage - 1);
        this.lnkFist.Enabled = this.lnkTop.Enabled = true;
        this.lnkNext.Enabled = this.lnkLast.Enabled = true;
      }
      else
      {
        this.lnkFist.Enabled = this.lnkTop.Enabled = false;
        this.lnkNext.Enabled = this.lnkLast.Enabled = true;
        this.lnkFist.Attributes.Add(\"style\", \"color:#ced9df;\");
        this.lnkTop.Attributes.Add(\"style\", \"color:#ced9df;\");
        this.lnkNext.Attributes.Remove(\"style\");
        this.lnkLast.Attributes.Remove(\"style\");
      }
      if (!pds.IsLastPage)
      {
        //Request.CurrentExecutionFilePath 为当前请求的虚拟路径
        this.lnkNext.NavigateUrl = Request.CurrentExecutionFilePath + \"?Page=\" + Convert.ToString(CurrentPage + 1);
        this.lnkFist.Enabled = this.lnkTop.Enabled = true;
        this.lnkNext.Enabled = this.lnkLast.Enabled = true;
      }
      else
      {
        this.lnkNext.Enabled = this.lnkLast.Enabled = false;
        this.lnkFist.Enabled = this.lnkTop.Enabled = true;
        this.lnkNext.Attributes.Add(\"style\", \"color:#ced9df;\");
        this.lnkLast.Attributes.Add(\"style\", \"color:#ced9df;\");
        this.lnkFist.Attributes.Remove(\"style\");
        this.lnkTop.Attributes.Remove(\"style\");
      }
      this.lnkFist.NavigateUrl = Request.CurrentExecutionFilePath + \"?Page=\" + Convert.ToString(1);//跳转至首页
      this.lnkLast.NavigateUrl = Request.CurrentExecutionFilePath + \"?Page=\" + Convert.ToString(pds.PageCount);//跳转至末页

      this.RepeaterWxUserList.DataSource = pds;
      this.RepeaterWxUserList.DataBind();

      this.lbCountData.Text = openidlist.Count.ToString();
      this.lbPageIndex.Text = (pds.CurrentPageIndex + 1).ToString();
      this.lbPageSize.Text = \"每页\" + pds.PageSize.ToString() + \"条记录\";
      this.lbCountPage.Text = pds.PageCount.ToString();
      this.txtPageIndex.Text = (pds.CurrentPageIndex + 1).ToString();

      if (int.Parse(openidlist.Count.ToString()) <= int.Parse(pds.PageSize.ToString()))
      {
        this.lnkFist.Visible = this.lnkTop.Visible = this.lnkNext.Visible = this.lnkLast.Visible = this.txtPageIndex.Visible = this.LinkBtnToPage.Visible = false;
      }
      else
      {
        this.lnkFist.Visible = this.lnkTop.Visible = this.lnkNext.Visible = this.lnkLast.Visible = this.txtPageIndex.Visible = this.LinkBtnToPage.Visible = true;
      }

      this.lbsubscribeCount.Text = openidlist.Count.ToString();
    }
    /// <summary>
    /// 绑定分组列表
    /// </summary>
    private void BindGroupList()
    {
      WeiXinServer wxs = new WeiXinServer();

      ///从缓存读取accesstoken
      string Access_token = Cache[\"Access_token\"] as string;

      if (Access_token == null)
      {
        //如果为空,重新获取
        Access_token = wxs.GetAccessToken();

        //设置缓存的数据7000秒后过期
        Cache.Insert(\"Access_token\", Access_token, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
      }

      string Access_tokento = Access_token.Substring(17, Access_token.Length - 37);

      string jsonres = \"\";

      string content = Cache[\"AllGroups_content\"] as string;

      if (content == null)
      {
        jsonres = \"https://api.weixin.qq.com/cgi-bin/groups/get?access_token=\" + Access_tokento;

        HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(jsonres);
        myRequest.Method = \"GET\";
        HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
        StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
        content = reader.ReadToEnd();
        reader.Close();

        //设置缓存的数据7000秒后过期
        Cache.Insert(\"AllGroups_content\", content, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
      }

      //使用前需要引用Newtonsoft.json.dll文件
      JObject jsonObj = JObject.Parse(content);


      int groupsnum = jsonObj[\"groups\"].Count();

      this.DDLgroups.Items.Clear();//清除
      this.DDlAddgroups.Items.Clear();
      this.DDLgroups.Items.Insert(0, new ListItem(\"分组统计\", \"0\"));//添加默认第一个提示
      this.DDlAddgroups.Items.Insert(0, new ListItem(\"移动用户到分组\", \"0\"));
      for (int i = 0; i < groupsnum; i++)
      {
        this.DDLgroups.Items.Add(new ListItem(jsonObj[\"groups\"][i][\"name\"].ToString() + \"(\" + jsonObj[\"groups\"][i][\"count\"].ToString() + \")\", jsonObj[\"groups\"][i][\"id\"].ToString()));
        
        this.DDlAddgroups.Items.Add(new ListItem(jsonObj[\"groups\"][i][\"name\"].ToString(), jsonObj[\"groups\"][i][\"id\"].ToString()));
      }
    }
    /// <summary>
    /// 输入页码提交跳转
    /// </summary>
    /// <param name=\"sender\"></param>
    /// <param name=\"e\"></param>
    protected void LinkBtnToPage_Click(object sender, EventArgs e)
    {

      if (String.IsNullOrWhiteSpace(this.txtPageIndex.Text.ToString().Trim()))
      {
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), \"\", \"alert(\'页码不能为空!\')\", true);
        this.txtPageIndex.Focus();
        return;
      }
      if (IsNum(this.txtPageIndex.Text.ToString().Trim()))
      {
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), \"\", \"alert(\'页码数只能输入数字!\')\", true);
        this.txtPageIndex.Focus();
        this.txtPageIndex.Text = this.lbPageIndex.Text.ToString();
        return;
      }
      if (int.Parse(this.txtPageIndex.Text.ToString().Trim()) > int.Parse(this.lbCountPage.Text.ToString().Trim()))
      {
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), \"\", \"alert(\'所输页数不能大于总页数!\')\", true);
        this.txtPageIndex.Focus();
        this.txtPageIndex.Text = this.lbPageIndex.Text.ToString();
        return;
      }

      BindGetAllUserOpenIdList();
    }
    /// <summary>
    /// 判断是否是数字
    /// </summary>
    /// <param name=\"text\"></param>
    /// <returns></returns>
    public static bool IsNum(string text) //
    {
      for (int i = 0; i < text.Length; i++)
      {
        if (!Char.IsNumber(text, i))
        {
          return true; //输入的不是数字  
        }
      }
      return false; //否则是数字
    }
    /// <summary>
    /// 绑定用户基本信息事件
    /// </summary>
    /// <param name=\"sender\"></param>
    /// <param name=\"e\"></param>
    protected void RepeaterWxUserList_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
      //CheckBox checkIn = e.Item.FindControl(\"CheckIn\") as CheckBox;

      //checkIn.AutoPostBack = true;


      if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
      {
        WxOpenIdInfo wxopen = e.Item.DataItem as WxOpenIdInfo;


        Label lbwxopenID = e.Item.FindControl(\"lbwxopenID\") as Label;

        lbwxopenID.Text = wxopen.WxopenId.ToString();

        //根据OpenID获取用户基本信息。缓存处理
        WeiXinServer wxs = new WeiXinServer();

        ///从缓存读取accesstoken
        string Access_token = Cache[\"Access_token\"] as string;

        if (Access_token == null)
        {
          //如果为空,重新获取
          Access_token = wxs.GetAccessToken();

          //设置缓存的数据7000秒后过期
          Cache.Insert(\"Access_token\", Access_token, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
        }

        string Access_tokento = Access_token.Substring(17, Access_token.Length - 37);

        string jsonres =\"https://api.weixin.qq.com/cgi-bin/user/info?access_token=\" + Access_tokento + \"&openid=\" + lbwxopenID.Text.ToString();

        HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(jsonres);
        myRequest.Method = \"GET\";
        HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
        StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
        string content = reader.ReadToEnd();
        reader.Close();

        //使用前需要引用Newtonsoft.json.dll文件
        JObject jsonObj = JObject.Parse(content);


        Image ImgHeadUrl = e.Item.FindControl(\"ImgHeadUrl\") as Image;
        Label lbNickName = e.Item.FindControl(\"lbNickName\") as Label;
        Label lbRemark = e.Item.FindControl(\"lbRemark\") as Label;
        Label lbSubscrine_time = e.Item.FindControl(\"lbSubscrine_time\") as Label;

        Label lbgroupId = e.Item.FindControl(\"lbgroupId\") as Label;

        DropDownList DDlAddgroupss = e.Item.FindControl(\"DDlAddgroupss\") as DropDownList;

        lbNickName.Text = jsonObj[\"nickname\"].ToString();

        if (!String.IsNullOrWhiteSpace(jsonObj[\"remark\"].ToString()))
        {
          lbRemark.Text = \"(\" + jsonObj[\"remark\"].ToString() + \")\";
        }

        ImgHeadUrl.ImageUrl = jsonObj[\"headimgurl\"].ToString();
        lbgroupId.Text = jsonObj[\"groupid\"].ToString();

        //获取关注时间
        int totaltiem = int.Parse(jsonObj[\"subscribe_time\"].ToString());
        //将整型格式时间转换为时间格式
        DateTime t = new DateTime(1970, 1, 1).AddSeconds(totaltiem);
        //转换后的时间会比原有时间小8个小时,因此需要加上8个小时
        lbSubscrine_time.Text = t.AddHours(8).ToString();


        string jjjjjjjjjddd = Cache[\"AllGroups_content\"] as string;

        if (jjjjjjjjjddd == null)
        {
          jsonres = \"https://api.weixin.qq.com/cgi-bin/groups/get?access_token=\" + Access_tokento;

          HttpWebRequest myRequestss = (HttpWebRequest)WebRequest.Create(jsonres);
          myRequest.Method = \"GET\";
          HttpWebResponse myResponsess = (HttpWebResponse)myRequest.GetResponse();
          StreamReader readerss = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
          jjjjjjjjjddd = reader.ReadToEnd();
          reader.Close();

          //设置缓存的数据7000秒后过期
          Cache.Insert(\"AllGroups_content\", jjjjjjjjjddd, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
        }

        //使用前需要引用Newtonsoft.json.dll文件
        JObject jsonObjss = JObject.Parse(jjjjjjjjjddd);


        int groupsnumss = jsonObjss[\"groups\"].Count();

        for (int i = 0; i < groupsnumss;i++ )
        {
          if (jsonObjss[\"groups\"][i][\"id\"].ToString().Equals(lbgroupId.Text.ToString()))
          {
            DDlAddgroupss.SelectedItem.Text = jsonObjss[\"groups\"][i][\"name\"].ToString();
          }
        }

      }
    }
    /// <summary>
    /// 创建分组
    /// </summary>
    /// <param name=\"sender\"></param>
    /// <param name=\"e\"></param>
    protected void LinkBtnCreateGroup_Click(object sender, EventArgs e)
    {
      if (this.txtgroupsName.Value.ToString().Equals(\"分组名称\"))
      {
        ////
        ScriptManager.RegisterClientScriptBlock(this.Page,this.GetType(),\"\",\"alert(\'不能为空!\')\",true);
        this.txtgroupsName.Focus();
        return;
      }


      WeiXinServer wxs = new WeiXinServer();
      string res = \"\";

      ///从缓存读取accesstoken
      string Access_token = Cache[\"Access_token\"] as string;

      if (Access_token == null)
      {
        //如果为空,重新获取
        Access_token = wxs.GetAccessToken();

        //设置缓存的数据7000秒后过期
        Cache.Insert(\"Access_token\", Access_token, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
      }

      string Access_tokento = Access_token.Substring(17, Access_token.Length - 37);


      string posturl = \"https://api.weixin.qq.com/cgi-bin/groups/create?access_token=\" + Access_tokento;

      //string postData = \"{\\\"group\\\":{\\\"name\\\":\\\"\"+this.txtgroupsName.Value.ToString().Trim()+\"\\\"}}\";

      string postData = \"{\\\"group\\\":{\\\"name\\\":\\\"\"+this.txtgroupsName.Value.ToString().Trim()+\"\\\"}}\";


      res = wxs.GetPage(posturl, postData);


      ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), \"\", \"alert(\'创建成功!如未显示,请退出重新登录即可!\');location=\'WeiXinUserList.aspx\';\", true);
    }
    /// <summary>
    /// 全选、全不选
    /// </summary>
    /// <param name=\"sender\"></param>
    /// <param name=\"e\"></param>
    protected void CheckAll_CheckedChanged(object sender, EventArgs e)
    {
      CheckBox checkAll = (CheckBox)sender;
      foreach (RepeaterItem item in this.RepeaterWxUserList.Items)
      {
        CheckBox checkIn = (CheckBox)item.FindControl(\"CheckIn\");
        checkIn.Checked = checkAll.Checked;
      }
    }

    /// <summary>
    /// 移动用户到分组
    /// </summary>
    /// <param name=\"sender\"></param>
    /// <param name=\"e\"></param>
    protected void DDlAddgroups_SelectedIndexChanged(object sender, EventArgs e)
    {
      ///取得分组ID
      string groupId = this.DDlAddgroups.SelectedValue.ToString();

      //this.Label1.Text = groupId.ToString();

      Boolean bools = false;

      foreach (RepeaterItem item in this.RepeaterWxUserList.Items)
      {
        CheckBox checkIn = (CheckBox)item.FindControl(\"CheckIn\");

        if (checkIn.Checked)
        {
          bools = true;

          Label lbwxopenID = item.FindControl(\"lbwxopenID\") as Label;


          WeiXinServer wxs = new WeiXinServer();
          string res = \"\";

          ///从缓存读取accesstoken
          string Access_token = Cache[\"Access_token\"] as string;

          if (Access_token == null)
          {
            //如果为空,重新获取
            Access_token = wxs.GetAccessToken();

            //设置缓存的数据7000秒后过期
            Cache.Insert(\"Access_token\", Access_token, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
          }

          string Access_tokento = Access_token.Substring(17, Access_token.Length - 37);


          string posturl = \"https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=\" + Access_tokento;


          //POST数据例子:{\"openid\":\"oDF3iYx0ro3_7jD4HFRDfrjdCM58\",\"to_groupid\":108}
          //string postData = \"{\\\"openid\\\":\\\"\" + openid.ToString().Trim() + \"\\\",\\\"remark\\\":\\\"\" + this.txtRemarkName.Value.ToString() + \"\\\"}\";

          string postData = \"{\\\"openid\\\":\\\"\" + lbwxopenID.Text.ToString() + \"\\\",\\\"to_groupid\\\":\\\"\" + groupId.ToString() + \"\\\"}\";


          res = wxs.GetPage(posturl, postData);


          //使用前需要引用Newtonsoft.json.dll文件
          JObject jsonObj = JObject.Parse(res);

          ///获取返回结果的正确|true|false,
          string isright = jsonObj[\"errcode\"].ToString();//0
          string istrueorfalse = jsonObj[\"errmsg\"].ToString();//ok
          if (isright.Equals(\"0\") && istrueorfalse.Equals(\"ok\"))
          {
            ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), \"\", \"alert(\'移动用户成功!\');location=\'WeiXinUserList.aspx\';\", true);
          }
          else
          {
            ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), \"\", \"alert(\'移动用户失败!\');\", true);
            return;
          }
        }

      }
      if (!bools)
      {
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), \"\", \"alert(\'未选中项!\');location=\'WeiXinUserList.aspx\';\", true);
        return;
      }
    }

 WeiXinServer wxs = new WeiXinServer();是单独创建的一个类,主要用来获取通行证和加载流的方法,代码如下:

 /// <summary>
  /// 微信服务类
  /// </summary>
  public class WeiXinServer
  {
    /// <summary>
    /// 获取通行证
    /// </summary>
    /// <returns></returns>
    public string GetAccessToken()
    {
      string url_token = \"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=此处应该填写公众的appid&secret=此处应该填写公众号的secret\";
      HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url_token);
      myRequest.Method = \"GET\";
      HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
      StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
      string content = reader.ReadToEnd();
      reader.Close();
      return content;
    }
    public string GetPage(string p, 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(p) 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();
        string err = string.Empty;
        return content;
      }
      catch (Exception ex)
      {
        string err = ex.Message;
        return string.Empty;
      }
    }
  }

修改备注页面的代码:

 protected void Page_Load(object sender, EventArgs e)
    {
      if(Request.QueryString[\"id\"]!=null)
      {
        String openid = Request.QueryString[\"id\"].ToString();
        this.txtOpenId.Value = openid.ToString();

        //根据OpenID获取用户基本信息。缓存处理
        WeiXinServer wxs = new WeiXinServer();

        ///从缓存读取accesstoken
        string Access_token = Cache[\"Access_token\"] as string;

        if (Access_token == null)
        {
          //如果为空,重新获取
          Access_token = wxs.GetAccessToken();

          //设置缓存的数据7000秒后过期
          Cache.Insert(\"Access_token\", Access_token, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
        }

        string Access_tokento = Access_token.Substring(17, Access_token.Length - 37);

        string jsonres = \"https://api.weixin.qq.com/cgi-bin/user/info?access_token=\" + Access_tokento + \"&openid=\" + openid;

        HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(jsonres);
        myRequest.Method = \"GET\";
        HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
        StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
        string content = reader.ReadToEnd();
        reader.Close();

        //使用前需要引用Newtonsoft.json.dll文件
        JObject jsonObj = JObject.Parse(content);

          //假如备注名不为空,给备注名文本框赋值,显示原有的备注名
        if (!String.IsNullOrWhiteSpace(jsonObj[\"remark\"].ToString()))
        {
          this.txtRemarkName.Value = jsonObj[\"remark\"].ToString();
        }

      }
    }
    /// <summary>
    /// 设置备注名
    /// </summary>
    /// <param name=\"sender\"></param>
    /// <param name=\"e\"></param>
    protected void LinkBtnSet_Click(object sender, EventArgs e)
    {
     

      String openid = Request.QueryString[\"id\"].ToString();

      WeiXinServer wxs = new WeiXinServer();
      string res = \"\";

      ///从缓存读取accesstoken
      string Access_token = Cache[\"Access_token\"] as string;

      if (Access_token == null)
      {
        //如果为空,重新获取
        Access_token = wxs.GetAccessToken();

        //设置缓存的数据7000秒后过期
        Cache.Insert(\"Access_token\", Access_token, null, DateTime.Now.AddSeconds(7000), System.Web.Caching.Cache.NoSlidingExpiration);
      }

      string Access_tokento = Access_token.Substring(17, Access_token.Length - 37);


      string posturl = \"https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=\" + Access_tokento;

      string postData = \"{\\\"openid\\\":\\\"\" + openid.ToString().Trim() + \"\\\",\\\"remark\\\":\\\"\" + this.txtRemarkName.Value.ToString() + \"\\\"}\";


      res = wxs.GetPage(posturl, postData);


      //使用前需药引用Newtonsoft.json.dll文件
      JObject jsonObj = JObject.Parse(res);

      ///获取返回结果的正确|true|false,
      string isright = jsonObj[\"errcode\"].ToString();//0
      string istrueorfalse = jsonObj[\"errmsg\"].ToString();//ok
      if (isright.Equals(\"0\") && istrueorfalse.Equals(\"ok\"))
      {
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), \"\", \"alert(\'修改备注成功!\');location=\'WeiXinUserList.aspx\';\", true);
      }
      else
      {
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), \"\", \"alert(\'修改备注失败!\');\", true);
      }

    }

以上就是已关注用户管理的全部核心代码,仅供参考,希望对大家的学习有所帮助。

本文地址:https://www.stayed.cn/item/18694

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。