這篇文章主要介紹了asp.net微信開發(fā)中有關(guān)高級(jí)群發(fā)圖文的相關(guān)內(nèi)容,需要的朋友可以參考下
上一篇介紹了如何群發(fā)文本消息,本篇將介紹如何群發(fā)圖文信息,上傳圖文信息所需的素材,界面如下:
我們先看從素材庫中獲取圖文素材的代碼,界面:
素材列表,我是使用的repeater控件,
前臺(tái)代碼如下:
<!--彈出選擇素材窗口--> <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="/static/imghw/default1.png" data-src="images/close1.png" class="lazy" 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;">確認(rèn)選擇</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;">本類型素材總數(shù)量為:</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;">本次獲取的素材數(shù)量為:</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>
后臺(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(); 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;//取得文件在服務(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('請選擇圖片!')</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); //請求頭部信息 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ā)送請求并獲取相應(yīng)回應(yīng)數(shù)據(jù) HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才開始向目標(biāo)網(wǎng)頁發(fā)送Post請求 Stream instream = response.GetResponseStream(); StreamReader sr = new StreamReader(instream, Encoding.UTF8); //返回結(jié)果網(wǎng)頁(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('請輸入圖文標(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('請輸入正文內(nèi)容!');", true); this.tbContent.Focus(); return; } //對各項(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("請輸入用戶微信號(hào)")) { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('請輸入接收消息的用戶微信號(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", 可改為對微信號(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ù)覽失敗?。?amp;#39;);", 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(" ", " "); 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('請輸入圖文標(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('請輸入正文內(nèi)容!');", true); return; } //對各項(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> /// 請求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ā)送請求并獲取相應(yīng)回應(yīng)數(shù)據(jù) HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才開始向目標(biāo)網(wǎng)頁發(fā)送Post請求 Stream instream = response.GetResponseStream(); StreamReader sr = new StreamReader(instream, Encoding.UTF8); //返回結(jié)果網(wǎng)頁(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值,相對于做的簡單,直接將值賦值給了一個(gè)label用于顯示,也可以做成像官網(wǎng)那樣,確定選擇后,按照圖文樣式顯示.
最后一步:群發(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('請選擇或新建圖文素材再進(jìn)行群發(fā)!');", true); return; } WxMassService wms = new WxMassService(); List<WxMassInfo> 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ù)保存失?。?amp;#39;);", true); return; } } } else { ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('群發(fā)任務(wù)提交失?。?!');", true); return; } } } } }
為什么叫群發(fā)任務(wù)提交成功或失敗,因?yàn)閷⑿畔⑻峤唤o微信服務(wù)器,微信服務(wù)器還需審核,審核過程中也有可能審核不通過,不給于群發(fā),所以我起名叫這個(gè),嘿嘿,隨便你們怎么起。。。。。
至此群發(fā)圖文信息功能,已完畢,最后是群發(fā)記錄,還記得上一章提到的群發(fā)成功之后要在本地保存記錄嗎,保存記錄的原因,用于計(jì)算當(dāng)月已群發(fā)幾條信息,另外還有一個(gè)功能就是,群發(fā)成功之后,會(huì)得到一個(gè)消息msgid,根據(jù)這個(gè)ID可以對已經(jīng)發(fā)送成功的信息進(jìn)行撤銷(刪除)操作,關(guān)于撤銷操作:微信官方規(guī)定,對群發(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ù)庫自增列 public string title { get; set; }//圖文消息的標(biāo)題,若消息是文本類型,此項(xiàng)不顯示 public string ImageUrl { get; set; }//圖片地址,若消息是文本類型,此項(xiàng)不顯示 public string type { get; set; }//消息的類型,文本,圖文,圖片,語音,視頻 public string contents { get; set; }//文本消息的內(nèi)容,圖文消息的正文 public string massObject { get; set; }//群發(fā)對象 public string massStatus { get; set; }//群發(fā)狀態(tài) public string massMessageID{ get; set; }//群發(fā)成功后返回的消息ID public string massDate { get; set; }//群發(fā)日期時(shí)間 }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
更多asp.net WeChat development (advanced mass text sending)相關(guān)文章請關(guān)注PHP中文網(wǎng)!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)
