zoukankan      html  css  js  c++  java
  • asp.net微信开发第四篇----已关注用户管理

    如果本章不明白打标签是什么意思,可以先看用户分组管理,再看本章, 本项目所用框架基于:layUI,官网:https://www.layui.com/

    公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串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"
    }

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

    打标签:

    批量打标签:

    修改用户备注名:

    同步官方数据:具体实现思路如下:

    1.新建微信用户实体类,openID实体类,用于封装微信用户的每个属性信息,

    2.从微信服务器获取到数据后(如果获取数据较多,容易出现卡死现象,我做的是ajax异步获取,加了一个加载数据的动画显示),序列化后转存到本地数据库(转存前删除本地数据库的原有用户数据),页面加载数据的时候是从本地数据库加载的,不和微信打交道,


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

     /// <summary>
        /// 微信用户的OpenID实体类,此类不用来参与数据库数据存储,只是临时储存用户的openID列表
        /// </summary>
        public class WeChat_UserOpenIdInfo
        {
            /// <summary>
            /// 微信用户的openID
            /// </summary>
            public String WeChatUserOpenId { get; set; }
        }
    /// <summary>
        /// 微信已关注用户实体类
        /// </summary>
        public class WeChat_UserInfo
        {
            public int ID { get; set; }//编号,自增列
    
            public string 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 country { get; set; }//国家
    
            public string province { get; set; }//省份
    
            public string language { get; set; }//语言
    
            public string headimgurl { get; set; }//头像图片地址
    
            public string subscribe_time { get; set; }//用户关注时间
    
            public string remark { get; set; }//备注
    
            public string groupid { get; set; }//分组ID
    
            /// <summary>
            /// 用户被打上的标签ID列表
            /// </summary>
            public string tagid_list { get; set; }
    
    
        }
    
    
    用户列表前台代码
    <%@ 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 {100%; height:40px;margin-top:10px; text-indent:5px; line-height:40px;}
            .checkstyle { float:left;}
            #DDlAddgroups { text-align:center; 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; 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; 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; 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; 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 { 1124px; height:25px; line-height:25px; text-align:center; margin:20px auto 20px auto;
            }
            .linka { color:#0094ff; cursor:pointer;
            }
            .fenyebtn {60px; height:25px; border:1px solid #ced9df; border-radius:5px; text-align:center; line-height:25px; float:right;
            }
            .fenyebtn2 { 60px; height:25px; border:1px solid #ced9df; border-radius:5px; text-align:center; line-height:25px;margin-left:10px;float:right;
            }
            .toPageIndex { 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 { 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;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; 120px; height:25px; border:1px solid #ced9df;
            }
            .checkstyle {  float:left;
            }
            .imgheadstyle { 50px; height:50px; margin-top:10px;
            }
            .lbsubscribeCount { font-size:26px;
            }
    
            #shownewgroup { 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%; 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 { 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%; 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'); 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; 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'); 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'); 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'); 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'); 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="100%; line-height:50px;">
                                <td style="30px;">&nbsp;&nbsp;<asp:CheckBox ID="CheckIn" runat="server" CssClass="checkstyle" /> <%--OnCheckedChanged="CheckIn_CheckedChanged"--%></td>
                                <td style="150px;"><asp:Label ID="lbwxopenID" runat="server" Text=""></asp:Label>
                                </td>
                                <td style="80px;"><asp:Image ID="ImgHeadUrl" runat="server" CssClass="imgheadstyle" /> </td>
                                <td style="150px;"><asp:Label ID="lbNickName" runat="server" CssClass="checkstyle" Text=""></asp:Label>
                                    <asp:Label ID="lbRemark" runat="server" Text=""></asp:Label>
                                </td>
                                <td style="130px;">
                                    <asp:Label ID="lbSubscrine_time" runat="server" Text=""></asp:Label>
                                </td>
                                <td style="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="110px;">
                                    <a href='UpdateRemarkName.aspx?id=<%# Eval("WxopenId") %>'><div style=" border:1px solid #d9d9d9; border-radius:5px; 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文件,可在百度中搜索下载,如有需要,也可留下你的邮箱,我发邮件给你,至此用户管理模块告一段落!如有不对之处,欢迎指导!



  • 相关阅读:
    Android Gradle Plugin指南(五)——Build Variants(构建变种版本号)
    文件内容操作篇clearerr fclose fdopen feof fflush fgetc fgets fileno fopen fputc fputs fread freopen fseek ftell fwrite getc getchar gets
    文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write
    嵌入式linux应用程序调试方法
    version control system:git/hg/subversion/cvs/clearcase/vss。software configruation management。代码集成CI:Cruisecontrol/hudson/buildbot
    最值得你所关注的10个C语言开源项目
    如何记录linux终端下的操作日志
    CentOS 5.5 虚拟机安装 VirtualBox 客户端增强功能
    sizeof, strlen区别
    C/C++嵌入式开发面试题
  • 原文地址:https://www.cnblogs.com/shaojiang/p/4914170.html
Copyright © 2011-2022 走看看