C# 微信公众平台开发(5)--添加图文素材
微信公众平台开发 --添加素材
关于微信公众号素材管理,我们可以通过接口文档,了解基本详情:
http://mp.weixin.qq.com/wiki/10/10ea5a44870f53d79449290dfd43d006.html eg:发布图文素材
1.上传封面图片 >>新增其他类型永久素材 接口调用请求说明
通过POST表单来调用接口,表单id为media,包含需要上传的素材内容,有filename、filelength、content-type等信息。请注意:图片素材将进入公众平台官网素材管理模块中的默认分组。
http请求方式: POST,需使用https
https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN
调用示例(使用curl命令,用FORM表单方式新增一个其他类型的永久素材,curl命令的使用请自行查阅资料)
| 参数 | 是否必须 | 说明 |
|---|---|---|
| access_token | 是 | 调用接口凭证 |
| type | 是 | 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb) |
| media | 是 | form-data中媒体文件标识,有filename、filelength、content-type等信息 |
上传图片:
string filename = Server.MapPath(model.ImgUrl);
string url = string.Format("https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}", access_token, "image");
string resultJson = HttpHelper.UploadFile(url, filename, "image/jpeg");
filename = Server.MapPath(ImgUrl) ImgUrl=‘~\UploadFile\20160126\656495cd9ce3417282df4c859c36b9e1.jpg’
上传永久图片为表单上传,跟以前的请求方式不同:
/// <summary>
/// 服务号:上传多媒体文件
/// </summary>
/// <param name="accesstoken">调用接口凭据</param>
/// <param name="filename">文件路径</param>
/// <param name="contenttype">文件Content-Type类型(例如:image/jpeg、audio/mpeg)</param>
/// <returns></returns>
public static string UploadFile(string url, string path, string contenttype)
{
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
byte[] bArr = new byte[fs.Length];
fs.Read(bArr, , bArr.Length); // 设置参数
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 + ); //组织表单数据
StringBuilder sbHeader = new StringBuilder();
sbHeader.Append("--" + boundary + "\r\n");
sbHeader.Append("Content-Disposition: form-data; name=\"media\"; filename=\"" + path + "\"; filelength=\"" + fs.Length + "\"");
sbHeader.Append("\r\n");
sbHeader.Append("Content-Type: " + contenttype);
sbHeader.Append("\r\n\r\n"); //请求头部信息
//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()); Stream postStream = request.GetRequestStream();
postStream.Write(itemBoundaryBytes, , itemBoundaryBytes.Length);
postStream.Write(postHeaderBytes, , postHeaderBytes.Length);
postStream.Write(bArr, , bArr.Length);
postStream.Write(endBoundaryBytes, , endBoundaryBytes.Length);
postStream.Close(); fs.Close();
fs.Dispose(); //发送请求并获取相应回应数据
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;
}
返回说明
{ "media_id":MEDIA_ID, "url":URL }
返回参数说明
| 参数 | 描述 |
|---|---|
| media_id | 新增的永久素材的media_id |
| url | 新增的图片素材的图片URL(仅新增图片素材时会返回该字段) |
错误情况下的返回JSON数据包示例如下(示例为无效媒体类型错误):
{"errcode":40007,"errmsg":"invalid media_id"}
2.上传图文消息内容
string strUploadNewsUrl = string.Format("https://api.weixin.qq.com/cgi-bin/material/add_news?access_token={0}", access_token);
string newsJson = HttpHelper.PostHttpResponse(strUploadNewsUrl, str);
str 就是我们拼接的素材内容
官网的例子:
{
"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结构,最多8段
]
}
注意一:上面示例 "title": TITLE 但实际写的时候后面 也需要加上双引号,否则会报错; builder.Append("\"title\":\"" + list[i].Title + "\",");
注意二:{"errcode":40007,"errmsg":"invalid media_id"},出现这个问题很有可能就是 在上传图片的时候 用的是临时的上传接口,导致出现40007错误;
注意三: "content": CONTENT;本人在项目中,发现的一个问题,由于本人是在后台拼接的内容 ,出现一个问题就是内容中的图片上传后发现,
builder.Append("\"content\":\"" + list[i].Content + "\",");,
在微信中显示不出来,只能显示文字;
通过上传成功后返回的media_id返回的数据,content中关于img标签是剩下<img>了,最后发现是因为双引号引起的问题
list[i].Content = <p>Test</p><p><img alt="测试.jpg" src="http://mmbiz.qpic.cn/mmbiz/IcV3dMDKQT6xeeWETz43mpMYfHR7jjoxr6g0HDuYH7QDYr7hUQnl44664Tiaib6liaaybAwjhViafHHNHTHU6xX8ww/0"/></p>
所以builder.Append("\"content\":\"" + list[i].Content + "\",") 就会出现问题 改成 builder.Append("\"content\":\"" + list[i].Content.Replace("\"", "'") + "\",");
注意以上问题,基本上可以正确结果
最后 返回结果
{
"media_id":MEDIA_ID
}
通过Media_id,可以进行删除、查看操作; 3.修改永久图文素材
http请求方式: POST
https://api.weixin.qq.com/cgi-bin/material/update_news?access_token=ACCESS_TOKEN
调用示例
{
"media_id":MEDIA_ID,
"index":INDEX,
"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
}
}
参数说明
| 参数 | 是否必须 | 说明 |
|---|---|---|
| media_id | 是 | 要修改的图文消息的id |
| index | 是 | 要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0 |
| title | 是 | 标题 |
| thumb_media_id | 是 | 图文消息的封面图片素材id(必须是永久mediaID) |
| author | 是 | 作者 |
| digest | 是 | 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空 |
| show_cover_pic | 是 | 是否显示封面,0为false,即不显示,1为true,即显示 |
| content | 是 | 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS |
| content_source_url | 是 | 图文消息的原文地址,即点击“阅读原文”后的URL |
修改素材的时候 ,每次只能修改某一素材的其中一条,如果我要删除或者添加一天呢?
是否觉得很蛋疼;
本人直接根据上传的获取的MEDIA_ID 进行删除,然后重新添加一次! ---------------------------------------------------------------------------------------------------- 如果你觉得有帮助 请关注我的微信公众号,没有帮助你也可以添加哟!o(∩_∩)o 哈哈

C# 微信公众平台开发(5)--添加图文素材的更多相关文章
- 微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint
微信公众号开发自从支持允许在群发图文中插入小程序,方便了小程序的运营及推广.最近在三方服务开发中,要支持图文素材插入小程序遇到了一个很是棘手的问题.官方给出的插入小程序的示例支持文字.图片.卡片.如下 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler
上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK>我们讲述了如何使用Senparc.Weixin.MP SDK ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明
上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>介绍了如何通过通用接口获取AccessToken,有了AccessToken,我们就可以来操作 ...
- 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单
我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...
- 转载收藏之用 - 微信公众平台开发教程(六):了解MessageHandler
上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK>我们讲述了如何使用Senparc.Weixin.MP SDK ...
- 微信公众平台开发接口PHP SDK
以前没接触过微信公众平台开发,前几天刚找到实习公司就要求我做一个微信公众平台的应用,于是乎开始学习微信公众平台开发接口的调用,看开发文档之后还是不知道从何入手,只好上网找入门资料,终于在方倍工作室找到 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十):使用菜单消息功能
在<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>教程中,我们介绍了如何使用“客服接口”,即在服务器后台,在任意时间向微信发送文本.图文.图片等不 ...
- NodeJS微信公众平台开发
微信是手机用户必备的App,微信最开始只是作为社交通讯应用供用户使用,但随着用户量不断的增加,微信的公众号在微信上表现出来了它强大的一面,微信公众平台具有四大优势:1.平台更加稳固:2.用户关系更加平 ...
- php 微信公众平台开发之微信群发信息
这篇文章主要为大家详细介绍了php微信公众平台开发之微信群发信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.目的 完成在微信公众号中群发消息.这里只是完成简单的文字发送.也可以发送语音图片 ...
随机推荐
- 链表数据-PHP的实现
首先,链表数据的结构是: 其次,链表数据的结构特点: 随后,填充链表结构: 链表结构的数据,从链表尾部塞入数据. 最后,删除链表结构:
- 作业十一——LL(1)文法的判断,递归下降分析程序
作业十一——LL(1)文法的判断,递归下降分析程序 判断是否为LL(1)文法 选取有多个产生式的求select,只有一条产生式的无需求select 同一个非终结符之间求交集,全部判断为空后则为LL(1 ...
- 徐州A
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #defi ...
- 标准库os
os模块 提供对操作系统进行调用的接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 os ...
- B/S和C/S架构的区别
一.B/S架构 什么是B/S模式 B/S模式,即浏览器/服务器模式,是一种从传统的二层CS模式发展起来的新的网络结构模式,其本质是三层结构C/S模式.B/S网络结构模式是基于Intranet的需求而出 ...
- 汉字编码对照表(gb2312/Big5/GB2312)
一.汉字编码的种类 1.GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆.新加坡等地也使用此编码.它是一个简化字的编码规范,当然也包括其他的符号.字母.日文假名等,共74 ...
- Neditor 2.1.16 发布,修复缩放图片问题
开发四年只会写业务代码,分布式高并发都不会还做程序员? BUG 修复 修复缩放图片时,鼠标mouseUp后图片还是在缩放 by @ShinyHwong Demo: https://demo.ne ...
- 27.rm命令
rm命令可以删除指定的文件或目录.也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变. 选项:-f:强制删除. -r:递归处理,将指定目录下的 ...
- Bind+DLZ+MySQL智能DNS的正向解析和反向解析实现方法
使用文本配置文件的配置方式结合bind的最新的acl和view特性来实现智能DNS想必很多人已经很熟悉了,使用MySQL数据库来存放zone文件的方式可能也不少.对于两者都熟悉的,实现 Bind+DL ...
- OEL6 /boot分区删除恢复
对linux的应用有一段时间来,虽然谈不上精通,但日常应用maintenance还是没问题的,昨天自己故意把/boot分区直接format了,今天来尝试恢复,看看自己对linux启动方面的认识如何,总 ...