服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - ASP.NET教程 - asp.net微信开发(高级群发图文)

asp.net微信开发(高级群发图文)

2019-12-28 13:51将哥 ASP.NET教程

这篇文章主要介绍了asp.net微信开发中有关高级群发图文的相关内容,需要的朋友可以参考下

上一篇介绍了如何群发文本消息,本篇将介绍如何群发图文信息,上传图文信息所需的素材,界面如下:

asp.net微信开发(高级群发图文)

我们先看从素材库中获取图文素材的代码,界面:

asp.net微信开发(高级群发图文)

素材列表,我是使用的repeater控件,

前台代码如下:

?
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
<!--弹出选择素材窗口-->
 <div id="shownewgroup">
 <div class="closeLogin" style="height:40px; background-color:#ddd9ff; line-height:40px;"><span style="float:left; color:#000; font-size:14px; text-indent:5px;">选择素材</span>
 <span style="float:left;margin-left:20px;"><a href="WxNewTuWen.aspx" style="color:red;" onclick="hrefurl();" class="hrefurl">新建图文素材</a></span>
 <a class="closeloginpage"><img src="images/close1.png" alt="" /></a>  </div>
 
 <div style="height:455px; width:100%;">
 <asp:UpdatePanel ID="UpdatePanel2" runat="server">
  <ContentTemplate>
   <div style="width:100%; height:35px; margin:10px;"><asp:LinkButton ID="LinkBtnSelect" runat="server" OnClick="LinkBtnSelect_Click" ><div style="background-image:url('images/buttonbg.png'); width:111px; height:35px; float:left; line-height:35px; font-weight:bold; text-align:center;color:#fff;">确认选择</div></asp:LinkButton>
   <span style="float:left;margin-left:20px;"><asp:LinkButton ID="LinkbtnRefresh" CssClass="LinkbtnRefresh" runat="server" OnClick="LinkbtnRefresh_Click"><div style="background-image:url('images/buttonbg.png'); width:111px; height:35px; line-height:35px; font-weight:bold; text-align:center;color:#fff;">刷新</div></asp:LinkButton></span>
   <span style="float:left;margin-left:20px;"><asp:LinkButton ID="LinkBtnDelete" CssClass="LinkbtnRefresh" runat="server" OnClick="LinkBtnDelete_Click"><div style="background-image:url('images/buttonbg.png'); width:111px; height:35px; line-height:35px; font-weight:bold; text-align:center;color:#fff;">删除素材</div></asp:LinkButton></span>
   </div>
 <div style="word-wrap:break-word;" id="lbnewssucai" runat="server">
  <asp:Repeater ID="Repeatersucailist" runat="server" OnItemDataBound="Repeatersucailist_ItemDataBound">
  <ItemTemplate>
   <table style="width:100%; border-top:1px solid #edc9df; border-collapse:collapse; font-size:12px;" >
   <tr>
    <td style="width:100px;"><asp:Image ID="ImageUrl" CssClass="fenmianstyle2" runat="server" /></td>
    <td style="text-align:left; width:470px; ">
    <asp:Repeater ID="Repeatersucailist2" runat="server">
     <ItemTemplate>
     <ul style="margin:0px;padding:0px;">
      <li><%# Eval("title") %></li>
     </ul>
     </ItemTemplate>
    </asp:Repeater>
    </td>
    <td style="width:130px;">
    <asp:Label ID="lbUpate_time" runat="server" Text="Label"></asp:Label>
    </td>
    <td style="width:50px; text-align:center;">
    <asp:CheckBox ID="CheckIn" runat="server" />
    <asp:Label ID="lbmedia_id" runat="server" Visible="false" Text=""></asp:Label>
    </td>
   </tr>
   </table>
  </ItemTemplate>
  </asp:Repeater>
  <div style="font-size:14px; height:30px; line-height:30px; text-indent:10px; border-top:1px solid #ced9df;">
  <span style="float:left;">本类型素材总数量为:</span><span style="float:left; color:red;"><asp:Label ID="lbtotal_count" runat="server" Text="0"></asp:Label></span>  
  <span style="float:left; margin-left:20px;">本次获取的素材数量为:</span><span style="float:left; color:red;"><asp:Label ID="lbitem_count" runat="server" Text="0"></asp:Label></span>
  </div>
 </div>
  </ContentTemplate>
 </asp:UpdatePanel>
 </div>
</div>
<div id="shownewgroupzhezhaoceng"></div>

后台代码如下:

?
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
/// <summary>
/// 绑定图文素材列表
/// </summary>
private void BindNewsSucaiList()
{
 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/material/batchget_material?access_token=" + Access_tokento;
 
 
 //POST数据例子: POST数据例子:{"type":TYPE,"offset":OFFSET,"count":COUNT}
 
 string postData = "{\"type\":\"news\",\"offset\":\"0\",\"count\":\"20\"}";
 
 res = wxs.GetPage(posturl, postData);
 
 //使用前需要引用Newtonsoft.json.dll文件
 JObject jsonObj = JObject.Parse(res);
 
 int groupsnum = jsonObj["item"].Count();
 
 List<WxNewsSucaiIteminfo> newssucaiitemlist = new List<WxNewsSucaiIteminfo>();
 List<WxNewsSuCaiItemlistinfo> WxNewsSuCaiItemlist = new List<WxNewsSuCaiItemlistinfo>();
 for (int i = 0; i < groupsnum; i++)
 {
 WxNewsSucaiIteminfo newssucaiitem = new WxNewsSucaiIteminfo();
 newssucaiitem.media_id = jsonObj["item"][i]["media_id"].ToString();
 newssucaiitem.update_time = jsonObj["item"][i]["update_time"].ToString();
 newssucaiitem.total_count = jsonObj["total_count"].ToString();
 newssucaiitem.item_count = jsonObj["item_count"].ToString();
 
 newssucaiitemlist.Add(newssucaiitem);
 int news_itemcount = jsonObj["item"][i]["content"]["news_item"].Count();
 if (news_itemcount > 0)
 {
  for (int j = 0; j < news_itemcount; j++)
  {
  WxNewsSuCaiItemlistinfo wnscilinfo = new WxNewsSuCaiItemlistinfo();
  wnscilinfo.title = jsonObj["item"][i]["content"]["news_item"][j]["title"].ToString();
  wnscilinfo.thumb_media_id = jsonObj["item"][i]["content"]["news_item"][j]["thumb_media_id"].ToString();
  wnscilinfo.show_cover_pic = int.Parse(jsonObj["item"][i]["content"]["news_item"][j]["show_cover_pic"].ToString());
  wnscilinfo.author = jsonObj["item"][i]["content"]["news_item"][j]["author"].ToString();
  wnscilinfo.digest = jsonObj["item"][i]["content"]["news_item"][j]["digest"].ToString();
  wnscilinfo.content = jsonObj["item"][i]["content"]["news_item"][j]["content"].ToString();
  wnscilinfo.url = jsonObj["item"][i]["content"]["news_item"][j]["url"].ToString();
  wnscilinfo.content_source_url = jsonObj["item"][i]["content"]["news_item"][j]["content_source_url"].ToString();
  wnscilinfo.media_id = newssucaiitem.media_id.ToString();
  WxNewsSuCaiItemlist.Add(wnscilinfo);
  }
 }
 }
 Session["WxNewsSuCaiItemlist"] = WxNewsSuCaiItemlist;
 this.Repeatersucailist.DataSource = newssucaiitemlist;
 this.Repeatersucailist.DataBind();
}

再来看看,新建单图文信息界面:

asp.net微信开发(高级群发图文)

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
/// <summary>
///
/// </summary>上传图片文件
/// <param name="sender"></param>
/// <param name="e"></param>
protected void LinkBtnFileUploadImg_Click(object sender, EventArgs e)
{
 if (this.FileUploadImg.HasFile)
 {
 string fileContentType = FileUploadImg.PostedFile.ContentType;
 if (fileContentType == "image/bmp" || fileContentType == "image/gif" || fileContentType == "image/png" || fileContentType == "image/x-png" || fileContentType == "image/jpeg"
  || fileContentType == "image/pjpeg")
 {
  int fileSize = this.FileUploadImg.PostedFile.ContentLength;
 
  if (fileSize <=2097152)
  {
  string fileName = this.FileUploadImg.PostedFile.FileName;
  // 客户端文件路径
  string filepath = FileUploadImg.PostedFile.FileName; //得到的是文件的完整路径,包括文件名,如:C:\Documents and Settings\Administrator\My Documents\My Pictures\20022775_m.jpg
  //string filepath = FileUpload1.FileName;  //得到上传的文件名20022775_m.jpg
  string filename = filepath.Substring(filepath.LastIndexOf("\\") + 1);//20022775_m.jpg
  string serverpath = Server.MapPath("~/WeiXinImg/") + filename;//取得文件在服务器上保存的位置C:\Inetpub\wwwroot\WebSite1\images\20022775_m.jpg
 
  this.ImgTuWen.ImageUrl = "~/WeiXinImg/" + FileUploadImg.FileName;
  this.ImgTuWen2.Visible = true;
  this.ImgTuWen2.ImageUrl = "~/WeiXinImg/" + FileUploadImg.FileName;
  this.FileUploadImg.PostedFile.SaveAs(serverpath);//将上传的文件另存为
  this.LinkBtnDeleteImg.Visible = true;
  Session["fileNameimg"] = this.FileUploadImg.PostedFile.FileName;
 
 
  //上传临时图片素材至微信服务器,3天后微信服务器会自动删除
 
  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);
 
 
  //WebClient wx_upload = new WebClient();
  //wx_upload.Credentials = CredentialCache.DefaultCredentials;
  string url = string.Format("http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}", Access_tokento, "image");
 
  string result = HttpUploadFile(url, serverpath);
 
  if (result.Contains("media_id"))
  {
   //使用前需要引用Newtonsoft.json.dll文件
   JObject jsonObj = JObject.Parse(result);
 
   Session["imgmedia_id"] = jsonObj["media_id"].ToString();
  }
 
 
  Response.Write("<script>alert('上传图片成功!')</script>");
  }
  else
  {
  Response.Write("<script>alert('上传文件不能大于2M!')</script>");
  }
  
 }
 else
 {
  Response.Write("<script>alert('只支持BMP,GIF,PNG,JPG格式的图片!')</script>");
 }
 }
 else
 {
 Response.Write("<script>alert('请选择图片!')</script>");
 }
}
/// <summary>
/// Http上传文件
/// </summary>
public static string HttpUploadFile(string url, string path)
{
 // 设置参数
 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
 CookieContainer cookieContainer = new CookieContainer();
 request.CookieContainer = cookieContainer;
 request.AllowAutoRedirect = true;
 request.Method = "POST";
 string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
 request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
 byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
 byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
 
 int pos = path.LastIndexOf("\\");
 string fileName = path.Substring(pos + 1);
 
 //请求头部信息
 StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));
 byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
 
 FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
 byte[] bArr = new byte[fs.Length];
 fs.Read(bArr, 0, bArr.Length);
 fs.Close();
 
 Stream postStream = request.GetRequestStream();
 postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
 postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
 postStream.Write(bArr, 0, bArr.Length);
 postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
 postStream.Close();
 
 //发送请求并获取相应回应数据
 HttpWebResponse response = request.GetResponse() as HttpWebResponse;
 //直到request.GetResponse()程序才开始向目标网页发送Post请求
 Stream instream = response.GetResponseStream();
 StreamReader sr = new StreamReader(instream, Encoding.UTF8);
 //返回结果网页(html)代码
 string content = sr.ReadToEnd();
 return content;
}
/// <summary>
/// 删除图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void LinkBtnDeleteImg_Click(object sender, EventArgs e)
{
 string filename = Session["fileNameimg"].ToString();
 
 if (!string.IsNullOrEmpty(filename))//确保picPath有值并且不为空。
 {
 
 string serverpath = Server.MapPath("~/WeiXinImg/") + filename;//取得文件在服务器上保存的位置C:\Inetpub\wwwroot\WebSite1\images\20022775_m.jpg
 
 if (File.Exists(serverpath))
 {
  try
  {
  File.Delete(serverpath);
  this.ImgTuWen.ImageUrl = "weixinimg/fengmiandefault.jpg";
  this.ImgTuWen2.Visible = false;
  this.ImgTuWen2.ImageUrl = "";
  Session["fileNameimg"] = null;
  this.LinkBtnDeleteImg.Visible = false;
  }
  catch(Exception ex)
  {
  //错误处理:
  Response.Write(ex.Message.ToString());
  }
 }
 }
}

新建单图文预览代码如下:

?
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
/// <summary>
/// 预览图文消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void LinkBtnSendPreview_Click(object sender, EventArgs e)
{
 Session["media_id"] = null;
 
 //非空验证
 if (String.IsNullOrWhiteSpace(this.txttuwen_title.Value.ToString()))
 {
 ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('请输入图文标题!');", true);
 this.txttuwen_title.Focus();
 return;
 }
 if (this.ImgTuWen2.ImageUrl.ToString().Equals(""))
 {
 ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('必须上传一张图片!');", true);
 this.ImgTuWen2.Focus();
 return;
 }
 if (String.IsNullOrWhiteSpace(this.tbContent.InnerText.ToString()))
 {
 ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('请输入正文内容!');", true);
 this.tbContent.Focus();
 return;
 }
 
 //对各项进行赋值
 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);
 
 
 
 //POST数据例子: POST数据例子:
 //{
 // "articles": [{
 // "title": TITLE,
 // "thumb_media_id": THUMB_MEDIA_ID,
 // "author": AUTHOR,
 // "digest": DIGEST,
 // "show_cover_pic": SHOW_COVER_PIC(0 / 1),
 // "content": CONTENT,
 // "content_source_url": CONTENT_SOURCE_URL
 // },
 // //若新增的是多图文素材,则此处应还有几段articles结构
 // ]
 //}
 
 string isshow_cover_pic = "";
 if (this.CheckFengMianShow.Checked)
 {
 isshow_cover_pic = "1";
 }
 else
 {
 isshow_cover_pic = "0";
 }
 
 
 string description = NoHTML(this.tbContent.InnerText.ToString());
 
 
 string postData = "{\"articles\":[{\"title\":\"" + this.txttuwen_title.Value.ToString() +
 "\",\"thumb_media_id\":\"" + Session["imgmedia_id"].ToString() +
 "\",\"author\":\"" + this.txttuwen_author.Value.ToString() +
 "\",\"digest\":\"" + this.txtzhaiyao.InnerText.ToString() +
  "\",\"show_cover_pic\":\"" + isshow_cover_pic +
  "\",\"content\":\"" + description +
  "\",\"content_source_url\":\"" + this.txtYuanWenUrl.Text.ToString() +
  "\"}]}";
 
 string posturl = string.Format("https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token={0}", Access_tokento);
 
 string jsonres = PostUrl(posturl, postData);
 
 
 if (jsonres.Contains("media_id"))
 {
 //使用前需要引用Newtonsoft.json.dll文件
 JObject jsonObj = JObject.Parse(jsonres);
 
 if (this.txttoUserName.Value.ToString().Trim().Equals("请输入用户微信号"))
 {
  ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('请输入接收消息的用户微信号!');", true);
  return;
 }
 
 
 
 string posturls = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=" + Access_tokento;
 
 //预览图文消息的json数据{
 // "touser":"OPENID", 可改为对微信号预览,例如towxname:zhangsan
 // "mpnews":{ 
 //  "media_id":"123dsdajkasd231jhksad" 
 //  },
 // "msgtype":"mpnews"
 //}
 string postDatas = "{\"towxname\":\"" + this.txttoUserName.Value.ToString() +
    "\",\"mpnews\":{\"media_id\":\"" + jsonObj["media_id"].ToString() +
    "\"},\"msgtype\":\"mpnews\"}";
 
 string tuwenres = wxs.GetPage(posturls, postDatas);
 
 //使用前需药引用Newtonsoft.json.dll文件
 JObject jsonObjss = JObject.Parse(tuwenres);
 
 if (jsonObjss["errcode"].ToString().Equals("0"))
 {
  ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('发送预览成功!!');", true);
  return;
 }
 else
 {
  ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('发送预览失败!!');", true);
  return;
 }
 }
}
public static string NoHTML(string Htmlstring)
{
 
 //删除脚本
 Htmlstring = Regex.Replace(Htmlstring, @"<script[^>]*?>.*?</script>", "", RegexOptions.IgnoreCase);
 
 //替换标签
 Htmlstring = Htmlstring.Replace("\r\n", " ");
 Htmlstring = Htmlstring.Replace("\"", "'");
 Htmlstring = Htmlstring.Replace(" ", " ");
 return Htmlstring;
 
}

单击确定按钮代码如下:

?
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
/// <summary>
/// 确认选择
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void LinkBtnSubSave_Click(object sender, EventArgs e)
{
 Session["media_id"] = null;
 //非空验证
 if (String.IsNullOrWhiteSpace(this.txttuwen_title.Value.ToString()))
 {
 ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('请输入图文标题!');", true);
 return;
 }
 if (this.ImgTuWen2.ImageUrl.ToString().Equals(""))
 {
 ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('必须上传一张图片!');", true);
 return;
 }
 if (String.IsNullOrWhiteSpace(this.tbContent.InnerText.ToString()))
 {
 ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('请输入正文内容!');", true);
 return;
 }
 
 //对各项进行赋值
 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);
 
 
 
 //POST数据例子: POST数据例子:
 //{
 // "articles": [{
 // "title": TITLE,
 // "thumb_media_id": THUMB_MEDIA_ID,
 // "author": AUTHOR,
 // "digest": DIGEST,
 // "show_cover_pic": SHOW_COVER_PIC(0 / 1),
 // "content": CONTENT,
 // "content_source_url": CONTENT_SOURCE_URL
 // },
 // //若新增的是多图文素材,则此处应还有几段articles结构
 // ]
 //}
 
 string isshow_cover_pic = "";
 if (this.CheckFengMianShow.Checked)
 {
 isshow_cover_pic = "1";
 }
 else
 {
 isshow_cover_pic = "0";
 }
 
 string description = NoHTML(this.tbContent.InnerText.ToString());
 
 
 string postData = "{\"articles\":[{\"title\":\"" + this.txttuwen_title.Value.ToString() +
 "\",\"thumb_media_id\":\"" + Session["imgmedia_id"].ToString() +
 "\",\"author\":\"" + this.txttuwen_author.Value.ToString() +
 "\",\"digest\":\"" + this.txtzhaiyao.InnerText.ToString() +
  "\",\"show_cover_pic\":\"" + isshow_cover_pic +
  "\",\"content\":\"" + description +
  "\",\"content_source_url\":\"" + this.txtYuanWenUrl.Text.ToString() +
  "\"}]}";
 
 string posturl = string.Format("https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token={0}", Access_tokento);
 
 string jsonres = PostUrl(posturl, postData);
 
 
 if (jsonres.Contains("media_id"))
 {
 //使用前需要引用Newtonsoft.json.dll文件
 JObject jsonObj = JObject.Parse(jsonres);
 
 WxMpNewsInfo wmninfo = new WxMpNewsInfo();
 wmninfo.title = this.txttuwen_title.Value.ToString();
 wmninfo.contents = description.ToString();
 wmninfo.ImageUrl = this.ImgTuWen.ImageUrl.ToString();
 Session["wmninfo"] = wmninfo;
 Response.Redirect("WxMassManage.aspx?media_id=" + jsonObj["media_id"].ToString());
 }
}
/// <summary>
/// 请求Url,发送数据
/// </summary>
public static string PostUrl(string url, string postData)
{
 byte[] data = Encoding.UTF8.GetBytes(postData);
 
 // 设置参数
 HttpWebRequest request = WebRequest.Create(url) 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;
 Stream outstream = request.GetRequestStream();
 outstream.Write(data, 0, data.Length);
 outstream.Close();
 
 //发送请求并获取相应回应数据
 HttpWebResponse response = request.GetResponse() as HttpWebResponse;
 //直到request.GetResponse()程序才开始向目标网页发送Post请求
 Stream instream = response.GetResponseStream();
 StreamReader sr = new StreamReader(instream, Encoding.UTF8);
 //返回结果网页(html)代码
 string content = sr.ReadToEnd();
 return content;
}

Response.Redirect("WxMassManage.aspx?media_id=" + jsonObj["media_id"].ToString());
这句代码就是将上传图文后得到的media_Id参数传送到群发界面,群发界面接收代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
protected void Page_Load(object sender, EventArgs e)
{
 if(!Page.IsPostBack)
 {
 BindNewsSucaiList();//绑定素材列表
 BindGroupList();//绑定分组列表
 BindMassCount();//绑定本月已群发条数
 this.DataBind();
 if (Request.QueryString["media_id"] != null)
 {
  this.RadioBtnList.SelectedValue = "1";
  this.showExpress.Visible = false;
  this.txtwenben.Visible = false;
  this.tuwen.Visible = true;
  this.tuwenxuan.Visible = false;
  this.tuwenjian.Visible = false;
  this.lbtuwenmedai_id.Visible = true;
  this.lbtuwenmedai_id.Text = Request.QueryString["media_id"].ToString();
  this.LinkBtndeletetuwen.Visible = true;
  this.Imageyixuan.Visible = true;
 }
 }
}

最终界面如下:

asp.net微信开发(高级群发图文)

我这里只接收了一个media_id值,相对于做的简单,直接将值赋值给了一个label用于显示,也可以做成像官网那样,确定选择后,按照图文样式显示.

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
/// <summary>
 /// 群发
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 protected void LinkBtnSubSend_Click(object sender, EventArgs e)
 {
  //根据单选按钮判断类型,//如果选择的是图文消息
  if (this.RadioBtnList.SelectedValue.ToString().Equals("1"))
  {
   if (String.IsNullOrWhiteSpace(this.lbtuwenmedai_id.Text.ToString().Trim()))
   {
    ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('请选择或新建图文素材再进行群发!');", true);
    return;
   }
 
   WxMassService wms = new WxMassService();
 
   List<WxMassInfo> wxmaslist = wms.GetMonthMassCount();
 
   if (wxmaslist.Count >= 4)
   {
    ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('本月可群发消息数量已达上限!');", true);
    return;
   }
   else
   {
    
    //如何群发类型为全部用户,根据openID列表群发给全部用户,订阅号不可用,服务号认证后可用
    if (this.DDLMassType.SelectedValue.ToString().Equals("0"))
    {
     StringBuilder sbs = new StringBuilder();
     sbs.Append(GetAllUserOpenIDList());
 
     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 posturl = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=" + Access_tokento;
 
     ///群发POST数据示例如下:
     // {
     // "touser":[
     // "OPENID1",
     // "OPENID2"
     // ],
     // "mpnews":{
     //  "media_id":"123dsdajkasd231jhksad"
     // },
     // "msgtype":"mpnews"
     //}
 
     string postData = "{\"touser\":[" + sbs.ToString() +
      "],\"mpnews\":{\"media_id\":\"" + this.lbtuwenmedai_id.Text.ToString() +
      "\"},\"msgtype\":\"mpnews\"}";
 
 
     string tuwenres = wxs.GetPage(posturl, postData);
 
     //使用前需药引用Newtonsoft.json.dll文件
     JObject jsonObj = JObject.Parse(tuwenres);
 
     if (jsonObj["errcode"].ToString().Equals("0"))
     {
      Session["media_id"] = null;
      WxMassInfo wmi = new WxMassInfo();
      if (Session["wmninfo"] != null)
      {
       WxMpNewsInfo wmninfo = Session["wmninfo"] as WxMpNewsInfo;
 
       wmi.title = wmninfo.title.ToString();
       wmi.contents = wmninfo.contents.ToString();
       wmi.ImageUrl = wmninfo.ImageUrl.ToString();
 
 
       wmi.type = "图文";
 
       if (this.DDLMassType.SelectedValue.ToString().Equals("0"))
       {
        wmi.massObject = this.DDLMassType.SelectedItem.Text.ToString();
       }
       else
       {
        wmi.massObject = this.DDLGroupList.SelectedItem.Text.ToString();
       }
 
       wmi.massStatus = "成功";//群发成功之后返回的状态码
       wmi.massMessageID = jsonObj["msg_id"].ToString();//群发成功之后返回的消息ID
 
       wmi.massDate = System.DateTime.Now.ToString();
 
       int num = wms.AddWxMassInfo(wmi);
 
       if (num > 0)
       {
        Session["wmninfo"] = null;
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群发任务已提交成功!!!数据已保存!');location='WxMassManage.aspx';", true);
        return;
       }
       else
       {
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群发任务已提交成功!!!数据保存失败!');", true);
        return;
       }
      }
      else
      {
       wmi.title = "";
       wmi.contents = "";
       wmi.ImageUrl = "";
       wmi.type = "图文";
 
       if (this.DDLMassType.SelectedValue.ToString().Equals("0"))
       {
        wmi.massObject = this.DDLMassType.SelectedItem.Text.ToString();
       }
       else
       {
        wmi.massObject = this.DDLGroupList.SelectedItem.Text.ToString();
       }
 
       wmi.massStatus = "成功";//群发成功之后返回的状态码
       wmi.massMessageID = jsonObj["msg_id"].ToString();//群发成功之后返回的消息ID
 
       wmi.massDate = System.DateTime.Now.ToString();
 
       int num = wms.AddWxMassInfo(wmi);
 
       if (num > 0)
       {
        Session["wmninfo"] = null;
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群发任务已提交成功!!!图文部分数据已保存!');location='WxMassManage.aspx';", true);
        return;
       }
       else
       {
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群发任务已提交成功!!!数据保存失败!');", true);
        return;
       }
      }
     }
     else
     {
      ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群发任务提交失败!!');", true);
      return;
     }
 
 
    }
    else
    {
     //根据分组进行群发,订阅号和服务号认证后均可用
 
     string group_id = this.DDLGroupList.SelectedValue.ToString();
 
 
     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 posturl = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=" + Access_tokento;
 
     ///群发POST数据示例如下:
     // {
     // "filter":{
     //  "is_to_all":false
     //  "group_id":"2"
     // },
     // "mpnews":{
     //  "media_id":"123dsdajkasd231jhksad"
     // },
     // "msgtype":"mpnews"
     //}
 
     string postData = "{\"filter\":{\"is_to_all\":\"false\"\"group_id\":\""+group_id+
      "\"},\"mpnews\":{\"media_id\":\"" + this.lbtuwenmedai_id.Text.ToString() +
      "\"},\"msgtype\":\"mpnews\"}";
 
 
     string tuwenres = wxs.GetPage(posturl, postData);
 
     //使用前需药引用Newtonsoft.json.dll文件
     JObject jsonObj = JObject.Parse(tuwenres);
 
     if (jsonObj["errcode"].ToString().Equals("0"))
     {
      Session["media_id"] = null;
      WxMassInfo wmi = new WxMassInfo();
      if (Session["wmninfo"] != null)
      {
       WxMpNewsInfo wmninfo = Session["wmninfo"] as WxMpNewsInfo;
 
       wmi.title = wmninfo.title.ToString();
       wmi.contents = wmninfo.contents.ToString();
       wmi.ImageUrl = wmninfo.ImageUrl.ToString();
 
 
       wmi.type = "图文";
 
       if (this.DDLMassType.SelectedValue.ToString().Equals("0"))
       {
        wmi.massObject = this.DDLMassType.SelectedItem.Text.ToString();
       }
       else
       {
        wmi.massObject = this.DDLGroupList.SelectedItem.Text.ToString();
       }
 
       wmi.massStatus = "成功";//群发成功之后返回的状态码
       wmi.massMessageID = jsonObj["msg_id"].ToString();//群发成功之后返回的消息ID
 
       wmi.massDate = System.DateTime.Now.ToString();
 
       int num = wms.AddWxMassInfo(wmi);
 
       if (num > 0)
       {
        Session["wmninfo"] = null;
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群发任务已提交成功!!!数据已保存!');location='WxMassManage.aspx';", true);
        return;
       }
       else
       {
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群发任务已提交成功!!!数据保存失败!');", true);
        return;
       }
      }
      else
      {
       wmi.title = "";
       wmi.contents = "";
       wmi.ImageUrl = "";
       wmi.type = "图文";
 
       if (this.DDLMassType.SelectedValue.ToString().Equals("0"))
       {
        wmi.massObject = this.DDLMassType.SelectedItem.Text.ToString();
       }
       else
       {
        wmi.massObject = this.DDLGroupList.SelectedItem.Text.ToString();
       }
 
       wmi.massStatus = "成功";//群发成功之后返回的状态码
       wmi.massMessageID = jsonObj["msg_id"].ToString();//群发成功之后返回的消息ID
 
       wmi.massDate = System.DateTime.Now.ToString();
 
       int num = wms.AddWxMassInfo(wmi);
 
       if (num > 0)
       {
        Session["wmninfo"] = null;
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群发任务已提交成功!!!图文部分数据已保存!');location='WxMassManage.aspx';", true);
        return;
       }
       else
       {
        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群发任务已提交成功!!!数据保存失败!');", true);
        return;
       }
      }
     }
     else
     {
      ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群发任务提交失败!!');", true);
      return;
     }
    }
   }
  }
 }

为什么叫群发任务提交成功或失败,因为将信息提交给微信服务器,微信服务器还需审核,审核过程中也有可能审核不通过,不给于群发,所以我起名叫这个,嘿嘿,随便你们怎么起。。。。。

asp.net微信开发(高级群发图文)

至此群发图文信息功能,已完毕,最后是群发记录,还记得上一章提到的群发成功之后要在本地保存记录吗,保存记录的原因,用于计算当月已群发几条信息,另外还有一个功能就是,群发成功之后,会得到一个消息msgid,根据这个ID可以对已经发送成功的信息进行撤销(删除)操作,关于撤销操作:微信官方规定,对群发成功的图文和视频消息,半个小时之内可以进行删除操作,其他消息一经群发成功概不支持此操作。截图如下:

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
/// <summary>
/// 微信已群发消息实体类,用于记录已群发消息的条数,信息实体
/// </summary>
public class WxMassInfo
{
 public int WxMassNo { get; set; }//群发消息编号,数据库自增列
 
 public string title { get; set; }//图文消息的标题,若消息是文本类型,此项不显示
 
 public string ImageUrl { get; set; }//图片地址,若消息是文本类型,此项不显示
 
 public string type { get; set; }//消息的类型,文本,图文,图片,语音,视频
 
 public string contents { get; set; }//文本消息的内容,图文消息的正文
 
 public string massObject { get; set; }//群发对象
 
 public string massStatus { get; set; }//群发状态
 
 public string massMessageID{ get; set; }//群发成功后返回的消息ID
 
 public string massDate { get; set; }//群发日期时间
 
}

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

延伸 · 阅读

精彩推荐