除了3天就会失效的临时素材外,开发者有时需要永久保存一些素材,届时就可以通过本接口新增永久素材。

最近更新,永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。

请注意:

  1. 1、新增的永久素材也可以在公众平台官网素材管理模块中看到
  2. 2、永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
  3. 3、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式
  4. 4、调用该接口需https协议

新增永久图文素材

接口调用请求说明

  1. http请求方式: POST
  2. https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN

调用示例

  1. {
  2. "articles": [{
  3. "title": TITLE,
  4. "thumb_media_id": THUMB_MEDIA_ID,
  5. "author": AUTHOR,
  6. "digest": DIGEST,
  7. "show_cover_pic": SHOW_COVER_PIC(0 / 1),
  8. "content": CONTENT,
  9. "content_source_url": CONTENT_SOURCE_URL
  10. },
  11. //若新增的是多图文素材,则此处应还有几段articles结构
  12. ]
  13. }

参数说明

参数 是否必须 说明
title 标题
thumb_media_id 图文消息的封面图片素材id(必须是永久mediaID)
author 作者
digest 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空
show_cover_pic 是否显示封面,0为false,即不显示,1为true,即显示
content 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS
content_source_url 图文消息的原文地址,即点击“阅读原文”后的URL

返回说明

  1. {
  2. "media_id":MEDIA_ID
  3. }

返回的即为新增的图文消息素材的media_id。

请注意,在图文消息的具体内容中,将过滤外部的图片链接,开发者可以通过下述接口上传图片得到URL,放到图文内容中使用。

上传图文消息内的图片获取URL 请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。

接口调用请求说明

  1. http请求方式: POST
  2. https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN
  3. 调用示例(使用curl命令,用FORM表单方式上传一个图片):
  4. curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"

参数说明

参数 是否必须 说明
access_token 调用接口凭证
media form-data中媒体文件标识,有filename、filelength、content-type等信息

返回说明 正常情况下的返回结果为:

  1. {
  2. "url": "http://mmbiz.qpic.cn/mmbiz/gLO17UPS6FS2xsypf378iaNhWacZ1G1UplZYWEYfwvuU6Ont96b1roYs CNFwaRrSaKTPCUdBK9DgEHicsKwWCBRQ/0"
  3. }

其中url就是上传图片的URL,可用于后续群发中,放置到图文消息中。

新增其他类型永久素材

接口调用请求说明

通过POST表单来调用接口,表单id为media,包含需要上传的素材内容,有filename、filelength、content-type等信息。请注意:图片素材将进入公众平台官网素材管理模块中的默认分组。

  1. http请求方式: POST,需使用https
  2. https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN
  3. 调用示例(使用curl命令,用FORM表单方式新增一个其他类型的永久素材,curl命令的使用请自行查阅资料)

参数说明

参数 是否必须 说明
access_token 调用接口凭证
type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
media form-data中媒体文件标识,有filename、filelength、content-type等信息

新增永久视频素材需特别注意

在上传视频素材时需要POST另一个表单,id为description,包含素材的描述信息,内容格式为JSON,格式如下:

  1. {
  2. "title":VIDEO_TITLE,
  3. "introduction":INTRODUCTION
  4. }

新增永久视频素材的调用示例:

  1. curl "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN" -F media=@media.file -F description='{"title":VIDEO_TITLE, "introduction":INTRODUCTION}'

参数说明

参数 是否必须 说明
title 视频素材的标题
introduction 视频素材的描述

返回说明

  1. {
  2. "media_id":MEDIA_ID,
  3. "url":URL
  4. }

返回参数说明

参数 描述
media_id 新增的永久素材的media_id
url 新增的图片素材的图片URL(仅新增图片素材时会返回该字段)

错误情况下的返回JSON数据包示例如下(示例为无效媒体类型错误):

  1. {"errcode":40007,"errmsg":"invalid media_id"}
  2.  
  3. 先来看我自己自定义的后台永久素材管理效果图,如下:
  4.  
  5.  
  6. 再看看微信官网后台上的显示界面,同步的哦!
  7.  
  8.  
  9. 首先我们来分析一下步骤:
  10.  
  11. 第一步:如果想让图片在自己的页面显示,首先得先建个实体类吧,用来存储素材的信息吧
  1. /// <summary>
  2. /// 微信永久素材实体类,用于保存永久素材上传至微信服务器后返回的数据
  3. /// </summary>
  4. public class WxSuCaiInfo
  5. {
  6. public int SuCaiId { get; set; }//自增列序号
  7.  
  8. public string SuCaiUrl { get; set; }// 存储文件名
  9.  
  10. public string SuCaiType { get; set; }//素材类型,可分为image,voice,video,thumb(缩略图)
  11.  
  12. public string SuCaiTitle { get; set; }//图文消息的标题
  13.  
  14. public string SuCaiDigest { get; set; }//图文消息的摘要
  15.  
  16. public string SuCaiauthor { get; set; }//图文消息的作者
  17. public string SuCaishow_cover_pic { get; set; }//图文消息是否显示封面.保存0或1
  18.  
  19. public string SuCaicontent { get; set; }//图文消息的正文内容
  20. public string SuCaicontent_source_url { get; set; }//图文消息的原文链接
  21.  
  22. public string media_ID { get; set; }//上传至微信服务器后,返回的永久mediaID
  23.  
  24. public string Url { get; set; }//上传至微信服务器后,返回的图片URL,仅图片才会返回此属性
  25.  
  26. public string uploadDate { get; set; }//上传日期时间
  27.  
  28. }

 第二步:上传图片至微信服务器,成功后将返回的media_id和url两个字段数据和其他字段数据一并保存到本地服务器,上传的代码如下:

  1. /// <summary>
  2. /// 上传图片至微信服务器,并且本地也保存一份
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. protected void LinBtnUploadImg_Click(object sender, EventArgs e)
  7. {
  8. if (this.FileUploadImage.HasFile)
  9. {
  10. string fileContentType = FileUploadImage.PostedFile.ContentType;
  11. if (fileContentType == "image/bmp" || fileContentType == "image/gif" || fileContentType == "image/png" || fileContentType == "image/x-png" || fileContentType == "image/jpeg"
  12. || fileContentType == "image/pjpeg")
  13. {
  14. int fileSize = this.FileUploadImage.PostedFile.ContentLength;
  15.  
  16. if (fileSize <= )
  17. {
  18. string fileName = this.FileUploadImage.PostedFile.FileName;
  19. // 客户端文件路径
  20. string filepath = FileUploadImage.PostedFile.FileName; //得到的是文件的完整路径,包括文件名,如:C:\Documents and Settings\Administrator\My Documents\My Pictures\20022775_m.jpg
  21. //string filepath = FileUpload1.FileName; //得到上传的文件名20022775_m.jpg
  22. string filename = filepath.Substring(filepath.LastIndexOf("\\") + );//20022775_m.jpg
  23. string serverpath = Server.MapPath("~/WeiXinImg/") + filename;//取得文件在服务器上保存的位置C:\Inetpub\wwwroot\WebSite1\images\20022775_m.jpg
  24.  
  25. //把图片上传至本地服务器
  26. this.FileUploadImage.PostedFile.SaveAs(serverpath);//将上传的文件另存为
  27.  
  28. //上传图片素材至微信服务器,永久保存
  29.  
  30. WeiXinServer wxs = new WeiXinServer();
  31.  
  32. ///从缓存读取accesstoken
  33. string Access_token = Cache["Access_token"] as string;
  34.  
  35. if (Access_token == null)
  36. {
  37. //如果为空,重新获取
  38. Access_token = wxs.GetAccessToken();
  39.  
  40. //设置缓存的数据7000秒后过期
  41. Cache.Insert("Access_token", Access_token, null, DateTime.Now.AddSeconds(), System.Web.Caching.Cache.NoSlidingExpiration);
  42. }
  43.  
  44. string Access_tokento = Access_token.Substring(, Access_token.Length - );
  45.  
  46. string url = string.Format("http://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}", Access_tokento,"image");
  47.  
  48. try
  49. {
  50.  
  51. string res = HttpUploadFile(url, serverpath);
  52. //判断res结果集里面是否包含media_id
  53. if (res.Contains("media_id"))
  54. {
  55. //如果能进行到这里,那说明图片已经上传至微信服务器,是永久素材哦,
  56. //开始解析json串,使用前需要引用Newtonsoft.json.dll文件
  57. JObject jsonObj = JObject.Parse(res);
  58.  
  59. //图片上传成功后,返回的是两个字段,media_id和url
  60.  
  61. //将两个字段开始存入数据库,保存数据,方便获取列表的时候直接从本地服务器读取
  62. WxSuCaiInfo wsc = new WxSuCaiInfo();
  63.  
  64. wsc.SuCaiUrl = filename;//注意,这里保存的图片名称
  65.  
  66. wsc.SuCaiType = "image";//文件类型
  67.  
  68. wsc.media_ID = jsonObj["media_id"].ToString();//这个属性保存的是微信返回的media_id
  69.  
  70. wsc.Url = jsonObj["url"].ToString();//这个属性保存的才是微信返回的url
  71.  
  72. wsc.uploadDate = System.DateTime.Now.ToString();//记录当前文件上传日期时间
  73.  
  74. //存入数据库
  75. WxSuCaiService wscs = new WxSuCaiService();
  76.  
  77. int num = wscs.AddWxSuCaiInfo(wsc);
  78.  
  79. if (num > )
  80. {
  81. Response.Write("<script>alert('上传图片素材成功!');location='WxSuCaiMannageImageList.aspx';</script>");
  82. }
  83. else
  84. {
  85. Response.Write("<script>alert('上传图片素材失败!');location='WxSuCaiMannageImageList.aspx';</script>");
  86. }
  87. }
  88. }
  89. catch(Exception ex)
  90. {
  91. Response.Write(ex.Message.ToString());
  92. }
  93. }
  94. else
  95. {
  96. Response.Write("<script>alert('上传文件不能大于2M!')</script>");
  97. }
  98.  
  99. }
  100. else
  101. {
  102. Response.Write("<script>alert('只支持BMP,GIF,PNG,JPG,JPEG格式的图片!')</script>");
  103. }
  104. }
  105. else
  106. {
  107. Response.Write("<script>alert('请选择图片!')</script>");
  108. }
  109. }
  1. 走到这其实效果已经出来了,接下来看最后一步就是删除选中的素材,删除微信远程服务器的数据--再删除本地服务器的数据,有人问难道这个还有顺序?
    其实你可以想象,如果微信服务器的图片没有删除成功,你先把本地服务器的图片删除了,那就和官网同步不了了。
  2.  
  3. 第三步:删除素材
  1. /// <summary>
  2. /// 全选全不选
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. protected void CheckAll_CheckedChanged(object sender, EventArgs e)
  7. {
  8. foreach (DataListItem item in this.DLSuCaiImageList.Items)
  9. {
  10. CheckBox checkIn = item.FindControl("CheckIn") as CheckBox;
  11. checkIn.Checked = CheckAll.Checked;
  12. }
  13. }
  14. /// <summary>
  15. /// 删除选中项
  16. /// </summary>
  17. /// <param name="sender"></param>
  18. /// <param name="e"></param>
  19. protected void LinkBtnDeleteSelected_Click(object sender, EventArgs e)
  20. {
  21. Boolean ischeck = false;
  22.  
  23. foreach (DataListItem item in this.DLSuCaiImageList.Items)
  24. {
  25. CheckBox checkIn = item.FindControl("CheckIn") as CheckBox;
  26. if (checkIn.Checked)
  27. {
  28. ischeck = true;
  29. Label lbSuCaiId = item.FindControl("lbSuCaiId") as Label;
  30. Label lbSuCaiUrl = item.FindControl("lbSuCaiUrl") as Label;
  31. Label lbmedia_ID = item.FindControl("lbmedia_ID") as Label;
  32.  
  33. //删除微信服务器上的图片
  34. WeiXinServer wxs = new WeiXinServer();
  35. string res = "";
  36.  
  37. ///从缓存读取accesstoken
  38. string Access_token = Cache["Access_token"] as string;
  39.  
  40. if (Access_token == null)
  41. {
  42. //如果为空,重新获取
  43. Access_token = wxs.GetAccessToken();
  44.  
  45. //设置缓存的数据7000秒后过期
  46. Cache.Insert("Access_token", Access_token, null, DateTime.Now.AddSeconds(), System.Web.Caching.Cache.NoSlidingExpiration);
  47. }
  48.  
  49. string Access_tokento = Access_token.Substring(, Access_token.Length - );
  50.  
  51. string posturl = "https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=" + Access_tokento;
  52.  
  53. //POST数据例子: POST数据例子:{"media_id":MEDIA_ID}
  54.  
  55. string media_id = lbmedia_ID.Text.ToString();
  56.  
  57. string postData = "{\"media_id\":\"" + media_id + "\"}";
  58.  
  59. res = wxs.GetPage(posturl, postData);
  60.  
  61. if (res.Contains("errcode"))
  62. {
  63. //开始解析json串,使用前需要引用Newtonsoft.json.dll文件
  64. JObject jsonObj = JObject.Parse(res);
  65.  
  66. if (jsonObj["errcode"].ToString().Equals(""))
  67. {
  68.  
  69. ///获取本地服务器的路径
  70. string serverPathss = Server.MapPath("~/WeiXinImg/") + lbSuCaiUrl.Text.ToString();
  71. //验证本地服务的路径是否存在该图片
  72. if (File.Exists(serverPathss))
  73. {
  74. //如果存在就删除
  75. File.Delete(serverPathss);
  76. }
  77.  
  78. WxSuCaiService wscs = new WxSuCaiService();
  79. //通过media_id删除本地服务器数据库记录
  80. int num = wscs.DeleteWxSuCaiInfo(lbmedia_ID.Text.ToString());
  81. if (num > )
  82. {
  83. Response.Write("<script>alert('图片素材删除成功!');location='WxSuCaiMannageImageList.aspx';</script>");
  84. }
  85. else
  86. {
  87. Response.Write("<script>alert('微信服务器图片删除成功!本地服务器图片素材删除失败!');location='WxSuCaiMannageImageList.aspx';</script>");
  88. }
  89. }
  90. }
  91. }
  92. }
  93. if (!ischeck)
  94. {
  95. ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('请先选中删除项!!!')", true);
  96. return;
  97. }
  98. }
  1. 最后是页面的代码一并奉上,研究不透可再咨询我哦
  1. <!DOCTYPE html>
  2.  
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head runat="server">
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  6. <title></title>
  7. <link href="css/style.css" rel="Stylesheet" type="text/css" />
  8. <style type="text/css">
  9. .meun { width:1100px; height:40px; margin-left:20px; line-height:40px; margin-top:10px;border-bottom:1px solid #d6d6d6;
  10. }
  11. .meun ul { padding:0px; margin:0px;
  12. }
  13. .meun ul li{ float:left; width:100px; text-align:center;list-style:none;
  14. }
  15. .meun ul li:hover{ border-bottom:3px solid #ecd9df; cursor:pointer;
  16. }
  17. a:hover { color:#;
  18. }
  19. .checkedstyle { border-bottom:3px solid #;
  20. }
  21. .meun_imglist { width:1050px; min-height:300px; border:1px solid #d6d6d6; margin-top:20px; margin-left:35px; margin-bottom:30px;
  22. }
  23. .uploadstyle { width:300px; background-image:url('images/inputbg.gif'); background-repeat:repeat-x; height:35px; border:1px solid #d6d6d6; float:left; margin-bottom:10px; line-height:35px;
  24. }
  25. .CheckAll { float:left; padding:5px;
  26. }
  27. .CheckIn { float:left; padding:2px;
  28. }
  29. .DLSuCaiImageList { margin-top:10px; margin-left:10px;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <form id="form1" runat="server">
  35. <div class="place">
  36. <span>位置:</span>
  37. <ul class="placeul">
  38. <li><a href="WelCome.aspx" target="rightFrame">首页</a></li>
  39. <li>微信管理</li>
  40. <li>德桥员工服务中心--素材管理</li>
  41. </ul>
  42. </div>
  43. <div style="height:30px; line-height:30px; margin-top:10px; margin-left:45px;"><span style="float:left; font-size:16px;">素材管理</span><span style="color:red; float:left; margin-left:20px;">永久素材和微信官网同步,您在这里所操作的任何一项,将影响到官网后台素材管理,谨慎操作!</span></div>
  44. <div class="meun">
  45. <ul>
  46. <li><a href="WxSuCaiManageList.aspx">图文消息</a></li>
  47. <li class="checkedstyle"><a href="WxSuCaiMannageImageList.aspx">图片库</a></li>
  48. <li><a href="#">语音</a></li>
  49. <li><a href="#">视频</a></li>
  50. </ul>
  51. </div>
  52. <div class="meun_imglist">
  53. <div style="margin:5px auto 10px 10px; height:36px; line-height:36px;">
  54. <asp:FileUpload ID="FileUploadImage" CssClass="uploadstyle" runat="server" />
  55. <asp:LinkButton ID="LinBtnUploadImg" runat="server" OnClick="LinBtnUploadImg_Click"><span style="background-image:url('images/buttonbg.png'); width:111px; height:35px; line-height:35px; margin-bottom:10px; font-weight:bold; text-align:center; float:left; margin-left:10px; color:#fff;">上传</span></asp:LinkButton>
  56. <span style="margin-left:30px; color:red;" >&nbsp;&nbsp;支持jpg,gif,png,bmp格式图片,大小2M内,如上传成功后,图片未能显示,请将图片重新命名后再尝试上传.</span>
  57. </div>
  58. <div style=" clear:both;line-height:35px; margin:10px auto auto auto; height:35px; width:1030px; background-color:#f6f6f6; border-radius:5px; border-bottom:1px solid #d6d6d6;">
  59. <asp:CheckBox ID="CheckAll" CssClass="CheckAll" AutoPostBack="true" runat="server" OnCheckedChanged="CheckAll_CheckedChanged" />&nbsp;&nbsp;<span style="float:left; padding:3px;">全选</span>
  60. <asp:LinkButton ID="LinkBtnDeleteSelected" runat="server" OnClick="LinkBtnDeleteSelected_Click"><span style="width:111px; height:25px; line-height:25px; font-weight:bold; text-align:center; float:left; margin-left:15px; color:#000; background-color:#fff; margin-top:5px; border:1px solid #ecd9df; border-radius:3px;">删除选中</span></asp:LinkButton>
  61. </div>
  62.  
  63. <asp:DataList ID="DLSuCaiImageList" CssClass="DLSuCaiImageList" runat="server" RepeatColumns="">
  64. <ItemTemplate>
  65. <div style="width:150px; height:180px; margin-right:22px;margin-bottom:15px; border:1px solid #d9d9d9;">
  66. <img src='../WeiXinImg/<%# Eval("SuCaiUrl") %>' style="height:120px; width:150px; border:0px;" />
  67. <div style="width:150px;height:25px; line-height:25px; text-indent:3px; border-top:1px solid #d9d9d9;">
  68. <asp:CheckBox ID="CheckIn" CssClass="CheckIn" runat="server" />
  69. <asp:Label ID="lbSuCaiUrl" ToolTip='<%# Eval("SuCaiUrl")%>' runat="server" Text='<%# Eval("SuCaiUrl").ToString().Length>8?Eval("SuCaiUrl").ToString().Substring(0,8)+"...":Eval("SuCaiUrl").ToString() %>'></asp:Label>
  70. </div>
  71. <div style=" clear:both; width:150px;height:25px; line-height:25px; text-indent:5px; border-top:1px solid #d9d9d9;">
  72. <%# Eval("uploadDate").ToString().Length>?Eval("uploadDate").ToString().Substring(,)+"...":Eval("uploadDate").ToString() %>
  73. <asp:Label ID="lbSuCaiId" runat="server" Visible="false" Text='<%# Eval("SuCaiId") %>'></asp:Label>
  74. <asp:Label ID="lbmedia_ID" runat="server" Visible="false" Text='<%# Eval("media_ID") %>'></asp:Label>
  75. </div>
  76. </div>
  77. </ItemTemplate>
  78. </asp:DataList>
  79.  
  80. </div>
  81. </form>
  82. </body>
  83. </html>
  1. 其他素材上传都类似,我就不一 介绍了。
  2.  
  3. 新建图文素材界面如下:

  1.  
  2. 从图片库选择图片素材如下:
  3.  
  4.  
  5. 这是就是从已上传过的图片库中选择的,和图片素材管理界面的功能基本相似,只不过多了一个确认选择的按钮,因为确认选择了之后,要关闭本页,回到新建图文页面,主要代码:
  1. /// <summary>
  2. /// 确认选择,选中之后,跳转至新建图文页面
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. protected void LinkBtnSubMitSelected_Click(object sender, EventArgs e)
  7. {
  8.  
  9. Boolean bools = false;
  10. int num = ;
  11. foreach (DataListItem item in this.DLSuCaiImageList.Items)
  12. {
  13. CheckBox checkIn = item.FindControl("CheckIn") as CheckBox;
  14.  
  15. if (checkIn.Checked)
  16. {
  17. num += ;
  18. bools = true;
  19. }
  20. }
  21. if (!bools)
  22. {
  23. ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('请选择一个图片素材!!!')", true);
  24. return;
  25. }
  26. if (num >= )
  27. {
  28. ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('您只能选择一个图片素材!');", true);
  29. return;
  30. }
  31. else
  32. {
  33. foreach (DataListItem item in this.DLSuCaiImageList.Items)
  34. {
  35. CheckBox checkIn = item.FindControl("CheckIn") as CheckBox;
  36.  
  37. if (checkIn.Checked)
  38. {
  39. ///获取选中图片media_id
  40. Label lbmedia_ID = item.FindControl("lbmedia_ID") as Label;
  41. Session["imgmedia_id"] = lbmedia_ID.Text.ToString();
  42. Response.Write("<script>alert('已选择!');window.opener.location.reload();window.close();</script>");
  43. }
  44. }
  45. }
  46. }
  1. 新建图文的页面在接收的时候可以这样:
  1. if (Session["imgmedia_id"] != null)
  2. {
  3. WxSuCaiService wscs = new WxSuCaiService();
  4.  
  5. WxSuCaiInfo wscinfo = wscs.GetWxSuCaiInfo(Session["imgmedia_id"].ToString());
  6.  
  7. if(wscinfo!=null)
  8. {
  9. this.ImgTuWen.ImageUrl = "~/WeiXinImg/" + wscinfo.SuCaiUrl.ToString();
  10. this.ImgTuWen2.ImageUrl = "~/WeiXinImg/" + wscinfo.SuCaiUrl.ToString();
  11. this.ImgTuWen2.Visible = true;
  12. Session["imgmedia_id"] = wscinfo.media_ID.ToString();//图片的media_id
  13. Session["fileNameimg"] = wscinfo.SuCaiUrl.ToString();//图片的文件名称
  14. }
  15.  
  16. }
  1. 最后新建图文信息的效果图如下:

官方后台如下:

  1. 关于编辑图文信息的关键代码如下:
  1. /// <summary>
  2. /// 绑定事件
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. protected void DLMpNewsList_ItemDataBound(object sender, DataListItemEventArgs e)
  7. {
  8. if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
  9. {
  10. LinkButton LinkBtnDeleteSucai = e.Item.FindControl("LinkBtnDeleteSucai") as LinkButton;
  11.  
  12. LinkBtnDeleteSucai.Attributes.Add("OnClick","return confirm('您确定删除该图文素材???删除后将和微信官网同步删除!!')");
  13.  
  14. HyperLink HyperLinkEdit = e.Item.FindControl("HyperLinkEdit") as HyperLink;
  15.  
  16. HyperLinkEdit.Attributes.Add("OnClick", "return confirm('即将进入编辑模式!!是否执行下一步操作??')");
  17.  
  18. Label lbmedia_ID = e.Item.FindControl("lbmedia_ID") as Label;
  19.  
  20. HyperLinkEdit.NavigateUrl = "WxNewTuWen.aspx?media_id=" + lbmedia_ID.Text.ToString();//把图文消息的media_id传参到新建图文界面
  21.  
  22. }
  23. }

新建图文页面关键代码如下:

  1. if(!Page.IsPostBack)
  2. {
  3. ///编辑模式
  4. if (Request.QueryString["media_id"] != null)
  5. {
  6. string media_id = Request.QueryString["media_id"].ToString();
  7.  
  8. Session["sucaimedia_id"] = media_id;
  9.  
  10. WxSuCaiService wscs = new WxSuCaiService();
  11.  
  12. WxSuCaiInfo wscinfo = wscs.GetWxSuCaiInfo(media_id);
  13.  
  14. if (wscinfo != null)
  15. {
  16. this.txttuwen_title.Value = wscinfo.SuCaiTitle.ToString();
  17.  
  18. if (wscinfo.SuCaiTitle.ToString().Length > )
  19. {
  20. this.biaoti_yulan.InnerText = wscinfo.SuCaiTitle.ToString().Substring(, ) + "...";
  21. }
  22. else
  23. {
  24. this.biaoti_yulan.InnerText = wscinfo.SuCaiTitle.ToString();
  25. }
  26.  
  27. this.txttuwen_author.Value = wscinfo.SuCaiauthor.ToString();
  28. this.txtzhaiyao.InnerText = wscinfo.SuCaiDigest.ToString();
  29. this.ImgTuWen.ImageUrl = "~/WeiXinImg/" + wscinfo.SuCaiUrl.ToString();
  30. this.ImgTuWen2.ImageUrl = "~/WeiXinImg/" + wscinfo.SuCaiUrl.ToString();
  31. this.ImgTuWen2.Visible = true;
  32. Session["imgmedia_id"] = wscinfo.SuCaithumb_media_id.ToString();
  33. this.LinkBtnDeleteImg.Visible = true;
  34.  
  35. if (!String.IsNullOrWhiteSpace(wscinfo.SuCaicontent_source_url.ToString()))
  36. {
  37. this.txtYuanWenUrl.Text = wscinfo.SuCaicontent_source_url.ToString();
  38. this.txtYuanWenUrl.Visible = true;
  39. this.CheckYuanWen.Checked = true;
  40. }
  41.  
  42. this.txtYuanWenUrl.Text = wscinfo.SuCaicontent_source_url.ToString();
  43.  
  44. this.tbContent.InnerText = wscinfo.SuCaicontent.ToString();
  45.  
  46. if (wscinfo.SuCaishow_cover_pic.ToString().Equals(""))
  47. {
  48. this.CheckFengMianShow.Checked = true;
  49. }
  50. else
  51. {
  52. this.CheckFengMianShow.Checked = false;
  53. }
  54. }
  55. }
  56. }

编辑提交关键代码如下:

  1. /// <summary>
  2. /// 保存图文素材和修改按钮公用
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. protected void LinkBtnSaveYongjiu_Click(object sender, EventArgs e)
  7. {
  8. //非空验证
  9. if (String.IsNullOrWhiteSpace(this.txttuwen_title.Value.ToString()))
  10. {
  11. ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('请输入图文标题!');", true);
  12. return;
  13. }
  14. if (this.ImgTuWen2.ImageUrl.ToString().Equals(""))
  15. {
  16. ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('必须上传一张图片!');", true);
  17. return;
  18. }
  19. if (String.IsNullOrWhiteSpace(this.tbContent.InnerText.ToString()))
  20. {
  21. ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "", "alert('请输入正文内容!');", true);
  22. return;
  23. }
  24.  
  25. //对各项进行赋值
  26. WeiXinServer wxs = new WeiXinServer();
  27.  
  28. ///从缓存读取accesstoken
  29. string Access_token = Cache["Access_token"] as string;
  30.  
  31. if (Access_token == null)
  32. {
  33. //如果为空,重新获取
  34. Access_token = wxs.GetAccessToken();
  35.  
  36. //设置缓存的数据7000秒后过期
  37. Cache.Insert("Access_token", Access_token, null, DateTime.Now.AddSeconds(), System.Web.Caching.Cache.NoSlidingExpiration);
  38. }
  39.  
  40. string Access_tokento = Access_token.Substring(, Access_token.Length - );
  41.  
  42. //根据session判断media_id是否为空,也可根据request.queryString["media_id"]进行判断是否为空
  43. if (Session["sucaimedia_id"] != null)
  44. {
  45. //执行更新操作
  46.  
  47. //{
  48. // "media_id":MEDIA_ID,
  49. // "index":INDEX,
  50. // "articles": {
  51. // "title": TITLE,
  52. // "thumb_media_id": THUMB_MEDIA_ID,
  53. // "author": AUTHOR,
  54. // "digest": DIGEST,
  55. // "show_cover_pic": SHOW_COVER_PIC(0 / 1),
  56. // "content": CONTENT,
  57. // "content_source_url": CONTENT_SOURCE_URL
  58. // }
  59. //}
  60.  
  61. string isshow_cover_pic = "";
  62. if (this.CheckFengMianShow.Checked)
  63. {
  64. isshow_cover_pic = "";
  65. }
  66. else
  67. {
  68. isshow_cover_pic = "";
  69. }
  70.  
  71. string description = NoHTML(this.tbContent.InnerText.ToString());
  72.  
  73. string postData = "{\"media_id\":\"" + Session["sucaimedia_id"].ToString() +
  74. "\",\"index\":\"0\" ,\"articles\":{\"title\":\"" + this.txttuwen_title.Value.ToString() +
  75. "\",\"thumb_media_id\":\"" + Session["imgmedia_id"].ToString() +
  76. "\",\"author\":\"" + this.txttuwen_author.Value.ToString() +
  77. "\",\"digest\":\"" + this.txtzhaiyao.InnerText.ToString() +
  78. "\",\"show_cover_pic\":\"" + isshow_cover_pic +
  79. "\",\"content\":\"" + description +
  80. "\",\"content_source_url\":\"" + this.txtYuanWenUrl.Text.ToString() +
  81. "\"}}";
  82.  
  83. ///修改永久图文素材
  84. string url = string.Format("https://api.weixin.qq.com/cgi-bin/material/update_news?access_token={0}", Access_tokento);
  85.  
  86. string jsonres = PostUrl(url, postData);
  87.  
  88. if (jsonres.Contains("errcode"))
  89. {
  90. //使用前需要引用Newtonsoft.json.dll文件
  91. JObject jsonObj = JObject.Parse(jsonres);
  92.  
  93. if (jsonObj["errcode"].ToString().Equals(""))
  94. {
  95. //修改本地数据
  96. //保存数据,方便获取列表的时候直接从本地服务器读取
  97. WxSuCaiInfo wsc = new WxSuCaiInfo();
  98.  
  99. wsc.SuCaiUrl = Session["fileNameimg"].ToString();//注意,这里保存的图片名称
  100.  
  101. wsc.SuCaiTitle = this.txttuwen_title.Value.ToString();//图文消息的标题
  102.  
  103. wsc.SuCaiDigest = this.txtzhaiyao.InnerText.ToString();//图文消息的摘要
  104.  
  105. wsc.SuCaithumb_media_id = Session["imgmedia_id"].ToString();//图文的消息封面media_id
  106.  
  107. wsc.SuCaiauthor = this.txttuwen_author.Value.ToString();
  108.  
  109. wsc.SuCaishow_cover_pic = isshow_cover_pic;
  110.  
  111. wsc.SuCaicontent = description;
  112.  
  113. wsc.SuCaicontent_source_url = this.txtYuanWenUrl.Text.ToString();
  114.  
  115. wsc.uploadDate = System.DateTime.Now.ToString();//记录当前文件保存图文素材日期时间
  116.  
  117. //修改数据库信息
  118. WxSuCaiService wscs = new WxSuCaiService();
  119.  
  120. int num = wscs.UpdateWxSuCaiInfo(Session["sucaimedia_id"].ToString(), wsc);
  121.  
  122. if (num > )
  123. {
  124. Session["sucaimedia_id"] = null;
  125. Response.Write("<script>alert('图文素材修改成功!');location='WxSuCaiManageList.aspx';</script>");
  126. }
  127. else
  128. {
  129. Response.Write("<script>alert('图文素材修改失败!');</script>");
  130. }
  131.  
  132. }
  133.  
  134. }
  135.  
  136. }
  137. else
  138. {
  139. //新增图文素材
  140. }
  141. }

需注意:新建图文页面和修改图文页面是公用的一个页面.......

编辑提交按钮和保存按钮是公用的一个按钮.....

asp.net微信开发第八篇----永久素材管理的更多相关文章

  1. asp.net微信开发第五篇----用户分组管理

    上一篇已讲解到新建用户分组,移动用户到分组的功能,这一章主要讲解修改分组名称和删除分组 开发者可以使用接口,对公众平台的分组进行查询.创建.修改.删除等操作,也可以使用接口在需要时移动用户到某个分组. ...

  2. asp.net微信开发第三篇----自定义会话管理

    和微信用户的沟通少不了,总觉得看起来微信官网后台管理中的会话回复消息有点呆板,所以我这里就自定义了一个会话管理功能,最终效果图如下: 因为我试使用富文本文件CKEDITOR来进行编写,你看到稳中可能会 ...

  3. asp.net微信开发第十篇----使用百度编辑器编辑图文消息,上传图片、微信视频

    经过几天的资料收集,终于完成了该编辑器的图片上传,视频插入功能,视频插入功能主要借用了该编辑器的插入iframe功能,如原始插件图: 修改后的插件图如下(其中我隐藏掉了一些不需要使用的插件功能): 配 ...

  4. asp.net微信开发第四篇----已关注用户管理

    公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成.一次拉取调用最多拉取10000个关注者的OpenID,可以通过 ...

  5. asp.net微信开发第七篇----高级群发(图文)

    上一篇介绍了如何群发文本消息,本篇将介绍如何群发图文信息,上传图文信息所需的素材,界面如下: 我们先看从素材库中获取图文素材的代码,界面: 素材列表,我是使用的repeater控件, 前台代码如下: ...

  6. asp.net微信开发第六篇----高级群发(文本)

    说到高级群发,微信的参考资料http://mp.weixin.qq.com/wiki/14/0c53fac3bdec3906aaa36987b91d64ea.html 首先我们先来讲解一下群发文本信息 ...

  7. Java 微信公众号上传永久素材的方法

    Java 微信公众号上传永久素材的方法 学习了:http://blog.csdn.net/u013791374/article/details/53258275 膜拜一下,源码如下: @Request ...

  8. asp.net 微信开发(二)

    本节我们主要讲解微信的调试: 前言:平时我们开发项目都是在本地就能进行项目的开发调试,但是在微信上就有难度了,因为微信的数据需要从微信服务器上面拿,所以就需要直接在网站上调试了,接下来就相关的一些个人 ...

  9. PowerBI开发 第八篇:查询参数

    在PowerBI Desktop中,用户可以定义一个或多个查询参数(Query Parameter),参数的功能是为了实现PowerBI的参数化编程,使得Data Source的属性.替换值和过滤数据 ...

随机推荐

  1. 88 Merge Sorted Array(归并排序Easy)

    题目意思:num1和num2均为递增数组,对其进行递增排序存到num1中 class Solution { public: void merge(vector<int>& nums ...

  2. call和apply

    在js中经常会看到call和apply,他们实际上就是用于改变this的上下文 经典例子 function pet(words) { this.words=words; this.speak=func ...

  3. Reflow、Repaint 性能优化

    涉及到操作大量Dom节点及其样式时,有时感觉画面不顺畅,殊不知浏览器亚历山大了.所以我们心里面一定得清楚 Reflow(回流).Repaint(重绘). 浏览器根据每个Dom节点的样式,包括(大小,颜 ...

  4. UVA1152 4Values whose Sum is 0

    Description The SUM problem can be formulated as follows: given four lists A, B, C, D of integer val ...

  5. 魅蓝3s adb interface 找不到驱动程序

    完全照搬大神的步骤就ok啦,,自己记录下,方便以后查找 Win7 x64 Eclipse无法识别手机 / adb interface有黄色感叹号,无法识别 http://blog.csdn.net/z ...

  6. 转:Centos6.3添加解码器播放MP3和常见视频音频

    原文来自于:http://blog.csdn.net/odaynot/article/details/8462273 参考地址: http://wiki.centos.org/AdditionalRe ...

  7. 【JavaScript】关于JavaScript

    1. Language 2. DOM 3. Library 4. Framework

  8. linux下删除修改时间为某天之前的文件

    time_file #新建一个标识文件,修改时间为2014年4月9日0点0分 find . ! -cnewer time_file | xargs rm #删除最后修改时间在上述标识文件之前的所有文件

  9. C51指针的使用

    指针就是指变量或数据所在的存储区地址.如一个字符型的变量 STR 存放在内存单元DATA 区的 51H 这个地址中,那么 DATA 区的 51H 地址就是变量 STR 的指针.在 C 语言中指针是一个 ...

  10. 【HDOJ】1244 Max Sum Plus Plus Plus

    这题目一直wa,原来是因为我把JUDGE写错了,对拍了一下午都没检查出来.水DP啊. #include <cstdio> #include <cstring> #include ...