微信开发第四篇----已关注用户管理

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

接口调用请求说明

http请求方式: GET(请使用https协议)
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
参数 是否必须 说明
access_token 调用接口凭证
next_openid 第一个拉取的OPENID,不填默认从头开始拉取

返回说明

正确时返回JSON数据包:

{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
参数 说明
total 关注该公众账号的总用户数
count 拉取的OPENID个数,最大值为10000
data 列表数据,OPENID的列表
next_openid 拉取列表的最后一个用户的OPENID

错误时返回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>&nbsp;&nbsp;</div>
             <div style="font-size:12px; height:40px; color:red; line-height:40px;">&nbsp;&nbsp;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;">&nbsp;确定创建</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;">全选&nbsp;</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;">&nbsp;+&nbsp;新建分组</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;">刷&nbsp;&nbsp;新</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;">&nbsp;查询</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;">&nbsp;&nbsp;<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;">&nbsp;修改备注名称</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>&nbsp;
               <asp:HyperLink ID="lnkLast" runat="server"><span class="fenyebtn2">>>|</span></asp:HyperLink>&nbsp;
                <asp:HyperLink ID="lnkNext" runat="server"><span class="fenyebtn2">></span></asp:HyperLink>&nbsp;
                 <asp:HyperLink ID="lnkTop" runat="server"><span class="fenyebtn2"><</span></asp:HyperLink>&nbsp;
                <asp:HyperLink ID="lnkFist" runat="server"><span class="fenyebtn">|<<</span></asp:HyperLink>&nbsp;
              <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;">共搜索到&nbsp;</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);
            }

        }
至于Newtonsoft.json.dll文件,可在百度中搜索下载,如有需要,也可留下你的邮箱,我发邮件给你,至此用户管理模块告一段落!如有不对之处,欢迎指导!
时间: 2024-12-10 03:58:00

微信开发第四篇----已关注用户管理的相关文章

java微信开发API解析(五)-用户管理

java微信开发API解析(五)-用户管理 全局说明 * 详细说明请参考前两篇文章. 本文说明 *本文分为五部分: * 工具类MyHttpUtils的封装 * 用户分组管理文档的简单阅读解析 * 分组bean的构建以及各种分组管理的实现源码 * 用户管理的应用场景 * 测试的微信号二维码 * 本文只分析用户管理的用户分组管理部分,其它都大同小异,不再分析处理.如需要,请留言. * 以后原理分析会越来越简洁,具体原理分析请查看以前文章. * 下一篇文章会对于用户普通消息.自定义菜单消息.自动完成用

嵌入式linux QT开发(四)——QT Creator工程管理

嵌入式linux QT开发(四)--QT Creator工程管理 一.QT Creator工程管理 QT Creator以工程项目的方式对源码进行管理,一个QT工程中包含不同类型的文件如下: A..pro项目描述文件 B..pro.user用户描述文件 C..h头文件 D..cpp源文件 E..ui界面描述文件 F.资源文件(图片.音频等) 二..pro项目描述文件 1..pro项目描述文件基本构成如下: A.#注释起始符 B.QT模块声明 C.TARGET可执行文件名 D.TEMPLATE程序

微信开发之入门篇(一)

刚开始进行微信的开发测试,从最基础的入手: 控件.接口等的使用参考https://mp.weixin.qq.com/debug/wxadoc/dev/index.html?t=2017117 今天测试wx.request接口的时候出现域名网址不合法的情况,捣鼓了好久,网上说需要在小程序的公众平台账号上配置域名才能正常访问: 但今天测试出来了另外一种方法(适用于测试): 将微信开发工具左上角的设置-->设置代理栏选为不使用任何代理,直接连接服务器 然后勾选项目中的开发环境不校验请求域名与TLS版本

微信公众号_订阅号_用户管理

用户管理 1. 一个公众号,最多可以创建 100 个标签 查看手册,根据 请求 url,以及参数说明,请求体格式,进行编程 . 5 5 55 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 原文地址:https://www.cnblogs.com/tianxiaxuange/p/10188725.html

获取微信公众号已关注用户基本信息

当用户关注某一个公众号时,被关注的公众号就可以获得用户在此公众号下的OpenID.通过用户的OpenID,可以获取一些基本的信息,如头像.昵称.性别.地区等 1.获取access_token 获取用户的基本信息之前必须要先获得access_token public function http_curl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIF

微信接口开发之高级篇系列【用户分组接口和生成带参数的二维码】

<?php /** * Created by PhpStorm. * User: Tinywan * Date: 2016/9/11 * Time: 10:00 */ namespace Home\Controller; use Org\Util\WechatAuth; use Think\Controller; class UserController extends Controller { private $appid; private $appSecret; private $Wecha

微信开发第六篇服务器主动发送信息

上几篇文章基本是介绍有手机客户端触发的事件在先,这种有手机微信客户端触发的请求,咱们的服务器被动响应,这种模式我个人理解为被动发送信息. 但是除此之外我们有时间要让用户推送消息,比如向家长每天发送孩子的作业信息.这就要用到模板消息了 对于模板消息首先要添加 进入模板选择行业之后就要等两天才能用模板消息 能用模板消息之后 根据自己的情况,查看模板选择适用于自己的模板 如果没有可以自己定义 只要微信官方审核通过就可以用(我申请的好像说是7-15天,完成审计,但是好像30分钟就给我发通知说申请成功)

微信开发第五篇手机端微信公众号自定义菜单及OAuth2.0授权页面

说到自定义菜单,首先要想到调用微信的接口,其实微信公众号开发本身就是看对不对微信公众号接口的熟悉程度,我也是在项目中才开始接触微信公众号开发的,很感谢公司能给我这个项目机会.其实对于一个程序员来说最宝贵的是他的学习能力,而不是经验,不扯没用的了. 菜单上一篇讲到了怎么查看微信开发文档,那么很容易找到自定义菜单管理,根据里面的内容可以做一下思路 手机微信客户端与微信服务器交互,再由微信服务器与咱们自己的服务器交互,在第一次交互时先删除原始的那种可以打字的那种菜单,之后设置自己新的菜单,最后把自己的

Android Studio开发第四篇版本管理Git(下)

前面一片介绍了在as下如何关联远程仓库,这篇就介绍在开发过程中怎么应用. 提交+Push 如果本地开发代码有改动了或者你觉得某功能做完了,你打算把改动代码提交到远程仓库,这个时候很简单, 还是在工具栏找到VSC箭头朝上的按钮. 这时首先会弹出commit changes对话框,然后再下面的蓝色Commit按钮点右边下拉三角形,选中Commit and push 本地commit成功之后就会弹出push commit对话框,点push就推送到远程仓库了. 更新+Pull 我们直接在远程仓库更改代码