上一篇介紹了如何群發(fā)文本消息,本篇將介紹如何群發(fā)圖文信息,上傳圖文信息所需的素材,界面如下:
我們先看從素材庫(kù)中獲取圖文素材的代碼,界面:
素材列表,我是使用的repeater控件,
前臺(tái)代碼如下:
!--彈出選擇素材窗口--> 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>nbsp;nbsp;/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;">確認(rèn)選擇/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;">本類型素材總數(shù)量為:/span>span style="float:left; color:red;">asp:Label ID="lbtotal_count" runat="server" Text="0">/asp:Label>/span>nbsp;nbsp; span style="float:left; margin-left:20px;">本次獲取的素材數(shù)量為:/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>
后臺(tái)代碼如下:
/// 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(); //設(shè)置緩存的數(shù)據(jù)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數(shù)據(jù)例子: POST數(shù)據(jù)例子:{"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(); ListWxNewsSucaiIteminfo> newssucaiitemlist = new ListWxNewsSucaiIteminfo>(); ListWxNewsSuCaiItemlistinfo> WxNewsSuCaiItemlist = new ListWxNewsSuCaiItemlistinfo>(); 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;//取得文件在服務(wù)器上保存的位置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; //上傳臨時(shí)圖片素材至微信服務(wù)器,3天后微信服務(wù)器會(huì)自動(dòng)刪除 WeiXinServer wxs = new WeiXinServer(); ///從緩存讀取accesstoken string Access_token = Cache["Access_token"] as string; if (Access_token == null) { //如果為空,重新獲取 Access_token = wxs.GetAccessToken(); //設(shè)置緩存的數(shù)據(jù)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('請(qǐng)選擇圖片!')/script>"); } } /// summary> /// Http上傳文件 /// /summary> public static string HttpUploadFile(string url, string path) { // 設(shè)置參數(shù) 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"); // 隨機(jī)分隔線 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); //請(qǐng)求頭部信息 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(); //發(fā)送請(qǐng)求并獲取相應(yīng)回應(yīng)數(shù)據(jù) HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才開始向目標(biāo)網(wǎng)頁(yè)發(fā)送Post請(qǐng)求 Stream instream = response.GetResponseStream(); StreamReader sr = new StreamReader(instream, Encoding.UTF8); //返回結(jié)果網(wǎng)頁(yè)(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;//取得文件在服務(wù)器上保存的位置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) { //錯(cuò)誤處理: Response.Write(ex.Message.ToString()); } } } }
新建單圖文預(yù)覽代碼如下:
/// summary> /// 預(yù)覽圖文消息 /// /summary> /// param name="sender">/param> /// param name="e">/param> protected void LinkBtnSendPreview_Click(object sender, EventArgs e) { Session["media_id"] = null; //非空驗(yàn)證 if (String.IsNullOrWhiteSpace(this.txttuwen_title.Value.ToString())) { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('請(qǐng)輸入圖文標(biāo)題!');", 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('請(qǐng)輸入正文內(nèi)容!');", true); this.tbContent.Focus(); return; } //對(duì)各項(xiàng)進(jìn)行賦值 WeiXinServer wxs = new WeiXinServer(); ///從緩存讀取accesstoken string Access_token = Cache["Access_token"] as string; if (Access_token == null) { //如果為空,重新獲取 Access_token = wxs.GetAccessToken(); //設(shè)置緩存的數(shù)據(jù)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數(shù)據(jù)例子: POST數(shù)據(jù)例子: //{ // "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 // }, // //若新增的是多圖文素材,則此處應(yīng)還有幾段articles結(jié)構(gòu) // ] //} 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("請(qǐng)輸入用戶微信號(hào)")) { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('請(qǐng)輸入接收消息的用戶微信號(hào)!');", true); return; } string posturls = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=" + Access_tokento; //預(yù)覽圖文消息的json數(shù)據(jù){ // "touser":"OPENID", 可改為對(duì)微信號(hào)預(yù)覽,例如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('發(fā)送預(yù)覽成功?。?);", true); return; } else { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('發(fā)送預(yù)覽失?。?!');", true); return; } } } public static string NoHTML(string Htmlstring) { //刪除腳本 Htmlstring = Regex.Replace(Htmlstring, @"script[^>]*?>.*?/script>", "", RegexOptions.IgnoreCase); //替換標(biāo)簽 Htmlstring = Htmlstring.Replace("\r\n", " "); Htmlstring = Htmlstring.Replace("\"", "'"); Htmlstring = Htmlstring.Replace("nbsp;", " "); return Htmlstring; }
單擊確定按鈕代碼如下:
/// summary> /// 確認(rèn)選擇 /// /summary> /// param name="sender">/param> /// param name="e">/param> protected void LinkBtnSubSave_Click(object sender, EventArgs e) { Session["media_id"] = null; //非空驗(yàn)證 if (String.IsNullOrWhiteSpace(this.txttuwen_title.Value.ToString())) { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('請(qǐng)輸入圖文標(biāo)題!');", 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('請(qǐng)輸入正文內(nèi)容!');", true); return; } //對(duì)各項(xiàng)進(jìn)行賦值 WeiXinServer wxs = new WeiXinServer(); ///從緩存讀取accesstoken string Access_token = Cache["Access_token"] as string; if (Access_token == null) { //如果為空,重新獲取 Access_token = wxs.GetAccessToken(); //設(shè)置緩存的數(shù)據(jù)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數(shù)據(jù)例子: POST數(shù)據(jù)例子: //{ // "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 // }, // //若新增的是多圖文素材,則此處應(yīng)還有幾段articles結(jié)構(gòu) // ] //} 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> /// 請(qǐng)求Url,發(fā)送數(shù)據(jù) /// /summary> public static string PostUrl(string url, string postData) { byte[] data = Encoding.UTF8.GetBytes(postData); // 設(shè)置參數(shù) 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(); //發(fā)送請(qǐng)求并獲取相應(yīng)回應(yīng)數(shù)據(jù) HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才開始向目標(biāo)網(wǎng)頁(yè)發(fā)送Post請(qǐng)求 Stream instream = response.GetResponseStream(); StreamReader sr = new StreamReader(instream, Encoding.UTF8); //返回結(jié)果網(wǎng)頁(yè)(html)代碼 string content = sr.ReadToEnd(); return content; }
Response.Redirect("WxMassManage.aspx?media_id=" + jsonObj["media_id"].ToString());
這句代碼就是將上傳圖文后得到的media_Id參數(shù)傳送到群發(fā)界面,群發(fā)界面接收代碼如下:
protected void Page_Load(object sender, EventArgs e) { if(!Page.IsPostBack) { BindNewsSucaiList();//綁定素材列表 BindGroupList();//綁定分組列表 BindMassCount();//綁定本月已群發(fā)條數(shù) 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; } } }
最終界面如下:
我這里只接收了一個(gè)media_id值,相對(duì)于做的簡(jiǎn)單,直接將值賦值給了一個(gè)label用于顯示,也可以做成像官網(wǎng)那樣,確定選擇后,按照?qǐng)D文樣式顯示.
最后一步:群發(fā)按鈕代碼:其實(shí)上一章已經(jīng)將代碼貼出去了,這一章,我就單獨(dú)貼一遍吧。
/// summary> /// 群發(fā) /// /summary> /// param name="sender">/param> /// param name="e">/param> protected void LinkBtnSubSend_Click(object sender, EventArgs e) { //根據(jù)單選按鈕判斷類型,//如果選擇的是圖文消息 if (this.RadioBtnList.SelectedValue.ToString().Equals("1")) { if (String.IsNullOrWhiteSpace(this.lbtuwenmedai_id.Text.ToString().Trim())) { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('請(qǐng)選擇或新建圖文素材再進(jìn)行群發(fā)!');", true); return; } WxMassService wms = new WxMassService(); ListWxMassInfo> wxmaslist = wms.GetMonthMassCount(); if (wxmaslist.Count >= 4) { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('本月可群發(fā)消息數(shù)量已達(dá)上限!');", true); return; } else { //如何群發(fā)類型為全部用戶,根據(jù)openID列表群發(fā)給全部用戶,訂閱號(hào)不可用,服務(wù)號(hào)認(rèn)證后可用 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(); //設(shè)置緩存的數(shù)據(jù)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; ///群發(fā)POST數(shù)據(jù)示例如下: // { // "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 = "成功";//群發(fā)成功之后返回的狀態(tài)碼 wmi.massMessageID = jsonObj["msg_id"].ToString();//群發(fā)成功之后返回的消息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('群發(fā)任務(wù)已提交成功?。?!數(shù)據(jù)已保存!');location='WxMassManage.aspx';", true); return; } else { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群發(fā)任務(wù)已提交成功!??!數(shù)據(jù)保存失?。?);", 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 = "成功";//群發(fā)成功之后返回的狀態(tài)碼 wmi.massMessageID = jsonObj["msg_id"].ToString();//群發(fā)成功之后返回的消息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('群發(fā)任務(wù)已提交成功?。?!圖文部分?jǐn)?shù)據(jù)已保存!');location='WxMassManage.aspx';", true); return; } else { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群發(fā)任務(wù)已提交成功?。。?shù)據(jù)保存失??!');", true); return; } } } else { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群發(fā)任務(wù)提交失?。。?);", true); return; } } else { //根據(jù)分組進(jìn)行群發(fā),訂閱號(hào)和服務(wù)號(hào)認(rèn)證后均可用 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(); //設(shè)置緩存的數(shù)據(jù)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; ///群發(fā)POST數(shù)據(jù)示例如下: // { // "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 = "成功";//群發(fā)成功之后返回的狀態(tài)碼 wmi.massMessageID = jsonObj["msg_id"].ToString();//群發(fā)成功之后返回的消息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('群發(fā)任務(wù)已提交成功?。?!數(shù)據(jù)已保存!');location='WxMassManage.aspx';", true); return; } else { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群發(fā)任務(wù)已提交成功?。。?shù)據(jù)保存失??!');", 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 = "成功";//群發(fā)成功之后返回的狀態(tài)碼 wmi.massMessageID = jsonObj["msg_id"].ToString();//群發(fā)成功之后返回的消息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('群發(fā)任務(wù)已提交成功?。。D文部分?jǐn)?shù)據(jù)已保存!');location='WxMassManage.aspx';", true); return; } else { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群發(fā)任務(wù)已提交成功?。?!數(shù)據(jù)保存失敗!');", true); return; } } } else { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群發(fā)任務(wù)提交失?。?!');", true); return; } } } } }
為什么叫群發(fā)任務(wù)提交成功或失敗,因?yàn)閷⑿畔⑻峤唤o微信服務(wù)器,微信服務(wù)器還需審核,審核過程中也有可能審核不通過,不給于群發(fā),所以我起名叫這個(gè),嘿嘿,隨便你們?cè)趺雌稹?。。。?/p>
至此群發(fā)圖文信息功能,已完畢,最后是群發(fā)記錄,還記得上一章提到的群發(fā)成功之后要在本地保存記錄嗎,保存記錄的原因,用于計(jì)算當(dāng)月已群發(fā)幾條信息,另外還有一個(gè)功能就是,群發(fā)成功之后,會(huì)得到一個(gè)消息msgid,根據(jù)這個(gè)ID可以對(duì)已經(jīng)發(fā)送成功的信息進(jìn)行撤銷(刪除)操作,關(guān)于撤銷操作:微信官方規(guī)定,對(duì)群發(fā)成功的圖文和視頻消息,半個(gè)小時(shí)之內(nèi)可以進(jìn)行刪除操作,其他消息一經(jīng)群發(fā)成功概不支持此操作。截圖如下:
該類用于存儲(chǔ)已群發(fā)記錄的實(shí)體類
/// summary> /// 微信已群發(fā)消息實(shí)體類,用于記錄已群發(fā)消息的條數(shù),信息實(shí)體 /// /summary> public class WxMassInfo { public int WxMassNo { get; set; }//群發(fā)消息編號(hào),數(shù)據(jù)庫(kù)自增列 public string title { get; set; }//圖文消息的標(biāo)題,若消息是文本類型,此項(xiàng)不顯示 public string ImageUrl { get; set; }//圖片地址,若消息是文本類型,此項(xiàng)不顯示 public string type { get; set; }//消息的類型,文本,圖文,圖片,語(yǔ)音,視頻 public string contents { get; set; }//文本消息的內(nèi)容,圖文消息的正文 public string massObject { get; set; }//群發(fā)對(duì)象 public string massStatus { get; set; }//群發(fā)狀態(tài) public string massMessageID{ get; set; }//群發(fā)成功后返回的消息ID public string massDate { get; set; }//群發(fā)日期時(shí)間 }
本文已被整理到了《ASP.NET微信開發(fā)教程匯總》,歡迎大家學(xué)習(xí)閱讀。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
標(biāo)簽:洛陽(yáng) 衢州 崇左 贛州 南寧 汕尾 青海
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《asp.net微信開發(fā)(高級(jí)群發(fā)圖文)》,本文關(guān)鍵詞 asp.net,微信,開發(fā),高級(jí),群發(fā),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。