上一篇介绍了如何群发文本消息,本篇将介绍如何群发图文信息,上传图文信息所需的素材,界面如下:
素材列表,我是使用的repeater控件,
<!--弹出选择素材窗口--> <p id=shownewgroup> <p 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> </p> <p style=height:455px; width:100%;> <asp:UpdatePanel ID=UpdatePanel2 runat=server> <ContentTemplate> <p style=width:100%; height:35px; margin:10px;><asp:LinkButton ID=LinkBtnSelect runat=server OnClick=LinkBtnSelect_Click ><p style=background-image:url('images/buttonbg.png'); width:111px; height:35px; float:left; line-height:35px; font-weight:bold; text-align:center;color:#fff;>确认选择</p></asp:LinkButton> <span style=float:left;margin-left:20px;><asp:LinkButton ID=LinkbtnRefresh CssClass=LinkbtnRefresh runat=server OnClick=LinkbtnRefresh_Click><p style=background-image:url('images/buttonbg.png'); width:111px; height:35px; line-height:35px; font-weight:bold; text-align:center;color:#fff;>刷新</p></asp:LinkButton></span> <span style=float:left;margin-left:20px;><asp:LinkButton ID=LinkBtnDelete CssClass=LinkbtnRefresh runat=server OnClick=LinkBtnDelete_Click><p style=background-image:url('images/buttonbg.png'); width:111px; height:35px; line-height:35px; font-weight:bold; text-align:center;color:#fff;>删除素材</p></asp:LinkButton></span> </p> <p 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> <p 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> </p> </p> </ContentTemplate> </asp:UpdatePanel> </p> </p> <p id=shownewgroupzhezhaoceng></p>
/// <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(); }
再来看看,新建单图文信息界面:
/// <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()); } } } }
新建单图文预览代码如下:
/// <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; }
单击确定按钮代码如下:
/// <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参数传送到群发界面,群发界面接收代码如下:
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; } } }
最终界面如下:
我这里只接收了一个media_id值,相对于做的简单,直接将值赋值给了一个label用于显示,也可以做成像官网那样,确定选择后,按照图文样式显示.
最后一步:群发按钮代码:其实上一章已经将代码贴出去了,这一章,我就单独贴一遍吧。
/// <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; } } } } }
为什么叫群发任务提交成功或失败,因为将信息提交给微信服务器,微信服务器还需审核,审核过程中也有可能审核不通过,不给于群发,所以我起名叫这个,嘿嘿,随便你们怎么起。。。。。
至此群发图文信息功能,已完毕,最后是群发记录,还记得上一章提到的群发成功之后要在本地保存记录吗,保存记录的原因,用于计算当月已群发几条信息,另外还有一个功能就是,群发成功之后,会得到一个消息msgid,根据这个ID可以对已经发送成功的信息进行撤销(删除)操作,关于撤销操作:微信官方规定,对群发成功的图文和视频消息,半个小时之内可以进行删除操作,其他消息一经群发成功概不支持此操作。截图如下:
该类用于存储已群发记录的实体类
/// <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; }//群发日期时间 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。