欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-12 22:04:46
上一篇介绍了如何群发文本消息,本篇将介绍如何群发图文信息,上传图文信息所需的素材,界面如下: 我们先看从素材库中获取图文素材的代码,界面: 素材列表,我是使用的...

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

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

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

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

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

前台代码如下:

 <!--弹出选择素材窗口-->
  <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>

后台代码如下:

 /// <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微信开发(高级群发图文)

新建单图文上传封面,删除封面的代码如下:

 /// <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;
  }
  }
 }

最终界面如下:

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

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

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

最后一步:群发按钮代码:其实上一章已经将代码贴出去了,这一章,我就单独贴一遍吧。
 

 /// <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微信开发(高级群发图文)

该类用于存储已群发记录的实体类

 /// <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; }//群发日期时间

 }

本文已被整理到了《asp.net微信开发教程汇总》,欢迎大家学习阅读。

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