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

时间:2022-09-24 16:16:34

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

接口调用请求说明

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

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

返回说明

正确时返回JSON数据包:

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

错误时返回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
返回结果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
{
 "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
返回结果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
{
 "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为空):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
{
 "total":23000,
 "count":3000,
 "data":{"
 "openid":[
  "OPENID20001",
  "OPENID20002",
  ...,
  "OPENID23000"
 ]
 },
 "next_openid":"OPENID23000"
}

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

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

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

?
1
2
3
4
public class WxOpenIdInfo
 {
 public string WxopenId { get; set; }//用户存放微信用户的openId
 }

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/// <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
 
}

 用户列表前台代码

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
<%@ 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>

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

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

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

上代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
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();是单独创建的一个类,主要用来获取通行证和加载流的方法,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/// <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;
 }
}
}

修改备注页面的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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);
 }
 
}

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