C#开发微信门户及应用(26)-公众号微信素材管理
微信公众号最新修改了素材的管理模式,提供了两类素材的管理:临时素材和永久素材的管理,原先的素材管理就是临时素材管理,永久素材可以永久保留在微信服务器上,微信素材可以在上传后,进行图片文件或者图文消息的发送,关注的公众号可以在素材有效期内查看相关的资源,对于永久素材,那就不会存在过期的问题,只是纯粹数量上限的限制。本文综合两方面进行介绍素材管理的各种接口和实现。
1、素材类型和功能点
关于素材的官方说明:
临时素材:
公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。通过本接口,公众号可以新增临时素材(即上传临时多媒体文件)。对于临时素材,每个素材(media_id)会在开发者上传或粉丝发送到微信服务器3天后自动删除。素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式。
永久素材:
除了3天就会失效的临时素材外,开发者有时需要永久保存一些素材,届时就可以通过本接口新增永久素材。新增的永久素材也可以在公众平台官网素材管理模块中看到。永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000。
素材管理包含了下面截图的相关功能:
2、临时素材的管理接口定义和实现
我们定义一个IMediaApi接口,用来定义相关的接口处理。
1)上传临时文件
对于上传临时文件,官方的接口定义如下所示。
接口调用请求说明
http请求方式: POST/FORM,需使用https
https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
调用示例(使用curl命令,用FORM表单方式上传一个多媒体文件):
curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"
对于上传临时文件的处理,我们可以定义它的接口如下所示。
/// <summary>
/// 上传的临时多媒体文件。格式和大小限制,如下:
/// 图片(image): 1M,支持JPG格式
/// 语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
/// 视频(video):10MB,支持MP4格式
/// 缩略图(thumb):64KB,支持JPG格式。
/// 媒体文件在后台保存时间为3天,即3天后media_id失效。
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="type">媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)</param>
/// <param name="file">form-data中媒体文件标识,有filename、filelength、content-type等信息</param>
/// <returns></returns>
UploadJsonResult UploadTempMedia(string accessToken, UploadMediaFileType type, string file);
根据官方接口的说明,我们需要上传一个文件,并指定它的类型TYPE就可以了。
具体代码如下所示。
public UploadJsonResult UploadTempMedia(string accessToken, UploadMediaFileType type, string file)
{
string url = string.Format("http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}", accessToken, type.ToString()); UploadJsonResult result = JsonHelper<UploadJsonResult>.PostFile(url, file);
return result;
}
其中JsonHelper类的PostFile就是发送一个文件流,我们进一步可以看它的实现思路如下所示。
/// <summary>
/// 提交文件并解析返回的结果
/// </summary>
/// <param name="url">提交文件数据的链接地址</param>
/// <param name="file">文件地址</param>
/// <returns></returns>
public static T PostFile(string url, string file, NameValueCollection nvc = null)
{
HttpHelper helper = new HttpHelper();
string content = helper.PostStream(url, new string[] { file }, nvc);
VerifyErrorCode(content); T result = JsonConvert.DeserializeObject<T>(content);
return result;
}
上面代码主要就是通过POST一个文件流,并获得响应的结果字符串内容,然后我们分析其中是否有错误代码,如果没有,我们把字符串结果解析为对应的实体对象就可以了。
其中返回结果的实体类信息UploadJsonResult的类定义如下所示。
/// <summary>
/// 上传多媒体文件的返回结果
/// </summary>
public class UploadJsonResult : BaseJsonResult
{
/// <summary>
/// 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb,主要用于视频与音乐格式的缩略图)
/// </summary>
public UploadMediaFileType type { get; set; } /// <summary>
/// 媒体文件上传后,获取时的唯一标识
/// </summary>
public string media_id { get; set; } /// <summary>
/// 媒体文件上传时间戳
/// </summary>
public long created_at { get; set; }
}
这个接口的调用实例代码如下所示。
private void btnUpload_Click(object sender, EventArgs e)
{
string file = FileDialogHelper.OpenImage(false);
if (!string.IsNullOrEmpty(file))
{
IMediaApi mediaBLL = new MediaApi();
UploadJsonResult result = mediaBLL.UploadTempMedia(token, UploadMediaFileType.image, file);
if (result != null)
{
this.image_mediaId = result.media_id;
Console.WriteLine("{0} {1}", result.media_id, result.created_at);
}
else
{
Console.WriteLine("上传文件失败");
}
}
}
2)获取临时素材文件
上传文件是上传一个文件流,并获得对应的返回结果,主要就是一个media_Id的内容;而获取素材文件则是一个逆过程,通过一个media_id的参数获取一个文件流保存到本地的过程。
获取临时文件接口的官方定义如下所示。
接口调用请求说明
http请求方式: GET,https调用
https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
请求示例(示例为通过curl命令获取多媒体文件)
curl -I -G "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
对于获取临时文件,我们定义的接口如下所示。
/// <summary>
/// 获取临时素材
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="mediaId">媒体文件ID</param>
/// <param name="stream"></param>
Stream GetTempMedia(string accessToken, string mediaId, ref string fileName);
我们获得文件流的同时,也返回一个文件名参数(不过一般情况下,我们获取不到文件名)。
它的实现代码如下所示,主要逻辑就是解析返回结果,获取返回的文件流。
/// <summary>
/// 获取临时素材
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="mediaId">媒体文件ID</param>
/// <param name="stream"></param>
public Stream GetTempMedia(string accessToken, string mediaId, ref string fileName)
{
string url = string.Format("http://file.api.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}", accessToken, mediaId); HttpHelper helper = new HttpHelper();
Stream stream = helper.GetStream(url, ref fileName, null);
return stream;
}
获取素材文件的实例代码如下所示。
private void btnDownload_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(image_mediaId))
{
IMediaApi mediaBLL = new MediaApi(); string fileName = "";
Stream stream = mediaBLL.GetTempMedia(token, image_mediaId, ref fileName);
if (stream != null)
{
string filePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, fileName);
using (var fileStream = File.Create(filePath))
{
byte[] buffer = new byte[];
int bytesRead = ;
while ((bytesRead = stream.Read(buffer, , buffer.Length)) != )
{
fileStream.Write(buffer, , bytesRead);
}
fileStream.Flush();
}
stream.Close();
}
Console.WriteLine("下载文件:" + (File.Exists(fileName) ? "成功" : "失败"));
}
}
3、永久素材的管理接口定义和实现
根据官方接口的描述,我们可以把新增永久素材接口定义为三种:新增图文素材、其他类型永久素材和视频素材三种接口。
1)新增永久图文素材
接口调用请求说明
http请求方式: POST
https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN
调用示例
{
"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结构
]
}
2)新增其他类型永久素材
接口调用请求说明
通过POST表单来调用接口,表单id为media,包含需要上传的素材内容,有filename、filelength、content-type等信息。请注意:图片素材将进入公众平台官网素材管理模块中的默认分组。
http请求方式: POST
http://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN
调用示例(使用curl命令,用FORM表单方式新增一个其他类型的永久素材):
curl -F media=@test.jpg "http://file.api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN"
3)新增永久视频素材
在上传视频素材时需要POST另一个表单,id为description,包含素材的描述信息,内容格式为JSON,格式如下:
{
"title":VIDEO_TITLE,
"introduction":INTRODUCTION
}
新增永久视频素材的调用示例:
curl "http://file.api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN" -F media=@media.file -F description='{"title":VIDEO_TITLE, "introduction":INTRODUCTION}'
根据上面的说明,我们定义新增永久图文素材的接口代码如下所示。
/// <summary>
/// 新增永久图文素材
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="newsList">图文消息组</param>
/// <returns></returns>
MaterialResult UploadMaterialNews(string accessToken, List<NewsUploadJson> newsList);
定义新增其他永久素材接口如下:
/// <summary>
/// 新增其他类型永久素材(图片(image)、语音(voice)和缩略图(thumb))
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="type">媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)</param>
/// <param name="file">form-data中媒体文件标识,有filename、filelength、content-type等信息</param>
/// <returns></returns>
MaterialResult UploadMaterialMedia(string accessToken, UploadMediaFileType type, string file);
定义新增视频永久素材接口如下所示:
/// <summary>
/// 在上传视频素材时需要POST另一个表单,id为description,包含素材的描述信息,内容格式为JSON.
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="file">form-data中媒体文件标识,有filename、filelength、content-type等信息</param>
/// <param name="title">视频标题</param>
/// <param name="introduction">视频描述</param>
/// <returns></returns>
MaterialResult UploadMaterialVideo(string accessToken, string file, string title, string introduction);
这几个接口都没有太多难度,不过在微信接口讨论组里面,很多人对于上传永久素材的操作总是不成功,觉得可能是微信API本身的问题,其实不然,这个接口我还是测试通过了,并且在服务器上看到对应的素材信息,具体我们来看看上传其他类型素材的接口实现代码。
/// <summary>
/// 新增其他类型永久素材(图片(image)、语音(voice)和缩略图(thumb))
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="type">媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)</param>
/// <param name="file">form-data中媒体文件标识,有filename、filelength、content-type等信息</param>
/// <returns></returns>
public MaterialResult UploadMaterialMedia(string accessToken, UploadMediaFileType type, string file)
{
string url = string.Format("http://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}", accessToken, type.ToString()); MaterialResult result = JsonHelper<MaterialResult>.PostFile(url, file);
return result;
}
注意这个URL是http而不是https,有点特殊。
另外,我们在使用POST文件流的时候,HttpWebRequest对象的内容一定要设置好,主要是需要和微信定义的media这个保持一直才可以。如下是HttpHelper 辅助类里面的PostStream的部分代码,供参考。
永久素材上传后的结果可以在微信公众号后台进行查看到,具体界面如下所示。
对于永久素材的接口,我们还可以根据微信API的要求,完善永久素材的更新、删除、获取素材,以及获取素材总数、获取图文素材列表等功能,由于大多数操作类似,不需要一一列出,希望再次抛砖引玉,使得大家能够更好了解、利用好微信公众号的素材管理接口,从而实现我们更加丰富的数据管理。
如果对这个《C#开发微信门户及应用》系列感兴趣,可以关注我的其他文章,系列随笔如下所示:
C#开发微信门户及应用(26)-公众号微信素材管理
C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试
C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)
C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理
C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理
C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能
C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据
C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍
C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息
C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器
C#开发微信门户及应用(26)-公众号微信素材管理的更多相关文章
- C#开发微信门户及应用(27)-公众号模板消息管理
通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息.模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消 ...
- C#开发微信门户及应用(1)--开始使用微信接口
微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介 ...
- 微信支付接口开发之---微信支付之JSSDK(公众号支付)步骤
1.准备 1.1.公众号为服务号,开通微信支付功能 1.2.为了方便调试微信后台的回调URL(必须为外网),我用了nat123软件来做一个映射 1.3.官方微信开发的示例WxP ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...
- 微信硬件平台(一) 公众号 ESP8266 Arduino LED
微信硬件平台 本文目的,使用微信公众号控制ESP8266的LED开和关.进一步使用微信当遥控器(避免写APP或者IOS或者小程序),控制一切设备.给两个关键的总教程参考. 官网教程 微信硬件平台 微 ...
- C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...
- 【分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...
- 微信公众号 微信连wifi最全的教程
微信公众号 微信连wifi最全的教程 http://jingyan.baidu.com/article/1709ad806c69bd4634c4f0b3.html 放到自定义菜单 只能用新建图文 把二 ...
- 微信中的APP、公众号、小程序的openid及unionid介绍
微信中的APP.公众号.小程序的openid及unionid介绍 1.unionid 如果开发者拥有多个移动应用.网站应用.和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只 ...
随机推荐
- 使用SwingBench 对Oracle RAC DB性能 压力测试
我们可以使用swingbench这个工具对数据库性能进行压力测试,得到一些性能指标作为参考. SwingBench下载: http://www.dominicgiles.com/downloads.h ...
- Oracle第一步
Oracle 启动数据库 Startup [NOMOUNT|MOUNT|OPEN|FORCE] [restrict] [pfile=filename] 启动实例,加载数据库,启动数据库 oRACLE关 ...
- RMS去除在线认证
在微软 OS 平台创建打开 RMS 文档如何避免时延 相信我们在企业内部的环境中已经部署了微软最新的OS平台,Windows 7和Windows 2008 R2,在这些OS平台上使用IRM功能时,您有 ...
- Android中点击事件的实现方式
在之前博文中多次使用了点击事件的处理实现,有朋友就问了,发现了很多按钮的点击实现,但有很多博文中使用的实现方式有都不一样,到底是怎么回事.今天我们就汇总一下点击事件的实现方式. 点击事件的实现大致分为 ...
- 使用gulp解决RequireJS项目前端缓存问题(二)
1.前言 这一节,我们主要解决在上一节<使用gulp解决RequireJSs项目前端缓存问题(一)>末尾提到的几个问题: 对通过require-config.js引入的js文件修改后,没有 ...
- SQL Server 2014聚集列存储索引
转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...
- Set up VLAN (802.1q) tagging on a network interface?
SOLUTION VERIFIED October 13 2015 KB39674 KB741413 environment Red Hat Enterprise Linux 4 Red Hat En ...
- Hacker Rank: Two Strings - thinking in C# 15+ ways
March 18, 2016 Problem statement: https://www.hackerrank.com/challenges/two-strings/submissions/code ...
- 创建maven项目(cmd 命令)
2016五月 22 原 创建maven项目(cmd 命令) 分类:maven (994) (0) 1.普通方式创建 1)进入cmd窗口执行 mvn archetype:generate 2) 光标停止 ...
- 杂项之python描述符协议
杂项之python描述符协议 本节内容 由来 描述符协议概念 类的静态方法及类方法实现原理 类作为装饰器使用 1. 由来 闲来无事去看了看django中的内置分页方法,发现里面用到了类作为装饰器来使用 ...