微信企业号上传永久素材讲解与演示
Posted Engineer-Jsp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信企业号上传永久素材讲解与演示相关的知识,希望对你有一定的参考价值。
因为写书的需要,就顺便把这个章节一起写在博客了,只为帮助有需要的朋友,上传永久素材接口里面分了2个小接口
① 上传永久图文素材
② 上传其他类型永久素材
首先上传永久图文素材需要一个必须的参数那就是 media_id ,而这个参数需要通过上传其它类型永久素材获得,所以我们必须先上传一个文件,并且得到文件上传成功返回的
media_id参数,然后用于上传永久图文素材,所以这篇博客我们先说上传其它类型永久素材
1.上传其它类型永久素材
用于上传图片、语音、视频等媒体资源文件以及普通文件(如doc,ppt),接口返回素材资源标识ID:media_id。media_id是可复用的,同一个media_id可用于消息的多次发送。
- 请求说明
Https请求方式: POST
https://qyapi.weixin.qq.com/cgi-bin/material/add_material?type=TYPE&access_token=ACCESS_TOKEN
- 参数说明
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
type | 是 | 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) |
media | 是 | form-data中媒体文件标识,有filename、filelength、content-type等信息 |
- 权限说明
所有管理组均可调用。
- 返回说明
"errcode":0,
"errmsg":"ok",
"media_id": "2-G6nrLmr5EFSDC3MMfasdfb_-zK1dDdzmd0p7"
参数 | 说明 |
---|---|
media_id | 素材资源标识ID。最大长度为256字节 |
- 上传永久素材限制
所有文件size必须大于5个字节
图片(image):2MB,支持JPG,PNG格式
语音(voice):2MB,播放长度不超过60s,支持AMR格式
视频(video):10MB,支持MP4格式
普通文件(file):20MB
整个企业图文消息素材和图片素材数目的上限为5000,其他类型为1000
超出素材数量限制返回错误码45028
/**
* 上传其它类型永久素材
*
* @param accessToken
* 接口访问凭证
* @param type
* 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)
* @param media
* form-data中媒体文件标识,有filename、filelength、content-type等信息
* @param mediaFileUrl
* 媒体文件的url 上传的媒体文件限制 图片(image):1MB,支持JPG格式
* 语音(voice):2MB,播放长度不超过60s,支持AMR格式 视频(video):10MB,支持MP4格式
* 普通文件(file):10MB
*/
public static String uploadForeverMedia(String accessToken, String type,
String mediaFileUrl)
String ForeverMediaId = "";
// 拼装请求地址
String uploadMediaUrl = "https://qyapi.weixin.qq.com/cgi-bin/material/add_material?type=TYPE&access_token=ACCESS_TOKEN";
uploadMediaUrl = uploadMediaUrl.replace("ACCESS_TOKEN", accessToken)
.replace("TYPE", type);
// 定义数据分隔符
String boundary = "------------7da2e536604c8";
try
URL uploadUrl = new URL(uploadMediaUrl);
HttpURLConnection uploadConn = (HttpURLConnection) uploadUrl
.openConnection();
uploadConn.setDoOutput(true);
uploadConn.setDoInput(true);
uploadConn.setRequestMethod("POST");
// 设置请求头Content-Type
uploadConn.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
// 获取媒体文件上传的输出流(往微信服务器写数据)
OutputStream outputStream = uploadConn.getOutputStream();
URL mediaUrl = new URL(mediaFileUrl);
HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl
.openConnection();
meidaConn.setDoOutput(true);
meidaConn.setRequestMethod("GET");
// 从请求头中获取内容类型
String contentType = meidaConn.getHeaderField("Content-Type");
// 根据内容类型判断文件扩展名
String fileExt = WeixinUtil.getFileEndWitsh(contentType);
// 请求体开始
outputStream.write(("--" + boundary + "\\r\\n").getBytes());
outputStream
.write(String
.format(
"Content-Disposition: form-data; name=\\"media\\"; filename=\\"file1%s\\"\\r\\n",
fileExt).getBytes());
outputStream.write(String.format("Content-Type: %s\\r\\n\\r\\n",
contentType).getBytes());
// 获取媒体文件的输入流(读取文件)
BufferedInputStream bis = new BufferedInputStream(meidaConn
.getInputStream());
byte[] buf = new byte[8096];
int size = 0;
while ((size = bis.read(buf)) != -1)
// 将媒体文件写到输出流(往微信服务器写数据)
outputStream.write(buf, 0, size);
// 请求体结束
outputStream.write(("\\r\\n--" + boundary + "--\\r\\n").getBytes());
outputStream.close();
bis.close();
meidaConn.disconnect();
// 获取媒体文件上传的输入流(从微信服务器读数据)
InputStream inputStream = uploadConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
StringBuffer buffer = new StringBuffer();
String str = null;
while ((str = bufferedReader.readLine()) != null)
buffer.append(str);
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
uploadConn.disconnect();
// 使用JSON-lib解析返回结果
JSONObject jsonObject = JSONObject.fromObject(buffer.toString());
// 测试打印结果
System.out.println("打印测试结果" + jsonObject);
if (jsonObject != null)
if (jsonObject.getInt("errcode") == 0)
ForeverMediaId = jsonObject.getString("media_id");
// type等于 缩略图(thumb) 时的返回结果和其它类型不一样
catch (Exception e)
String error = String.format("上传媒体文件失败:%s", e);
System.out.println(error);
return ForeverMediaId;
该函数的参数在注释头里面已经解释了,下面需要测试上传
public static void main(String[] args)
// 获取 accesstoken
String access_token = WeixinUtil.getAccessToken(ParamesAPI.corpId,
ParamesAPI.secret).getToken();
// 测试素材地址
// http://engineer-jsp.cn/images/4.mp3
// http://localhost/weixinClient/images/1.jpg
// http://localhost/weixinClient/images/weather3.png
String weixinMediaid = uploadForeverMedia(access_token, "image",
"http://localhost/ImageCaCheTest/images/weather1.png");
// media_id
//2jgIPFBe8e6loFxjju2uYEN564-Q5d5UPTS4Sw-58AC3idFCq2RKZfA5l16644VZ4tdf9exlKkXNvpApecRhFIA
//2oPn4I5ihl3OYAr2-x3xwvAVzdcQbxb3FWJBCzJtMj8jlF5H1I6H8Hs53K2VpMrejF1RJhE6jCTVqc_dGJM9zJQ
//27N7vimhmaV0kMGvy5P8KCqqTC0MK0XGVd0WSyqp5xcxxJ-BEbgHllRVjAIIRh7wjZG2Pr-sCBhW2D12fsNk10A
System.out.println("\\nmedia_id:" + weixinMediaid);
if (null != weixinMediaid && weixinMediaid.getBytes().length > 2)
System.out.println("\\n上传成功!");
else
System.out.println("\\n上传失败!");
WeixinUtil.getAccessToken 就不贴了,看过我专栏的都知道......如果实在需要的,请在本博客留言!注明需要源码
上传成功后,官方会返回一个 JSON ,解析 JSON 拿到 media_id 参数,然后保存一下,用于下面的上传永久图文素材接口测试
/**
* 上传永久图文素材示例
*/
public static void main(String[] args)
// 定义发送永久图文素材 JSON 头
String SendForeverNewsJSONHeader = "\\"touser\\": \\"@all\\", \\"toparty\\":\\" @all\\", \\"msgtype\\": \\"mpnews\\", \\"agentid\\": 1, \\"mpnews\\":\\"media_id\\": \\"%s\\", \\"safe\\": 0";
// 定义 JSON 头
String JSONHeadr = "\\"mpnews\\":\\"articles\\":%s";
// 定义 JSON 主体
List<String> JSONBody = new ArrayList<String>();
// 开始封装主体
/** 第一个图文主体 */
ForeverArticle mArticle1 = new ForeverArticle();
// 图文消息标题
mArticle1.title = "上传永久图文素材测试-1";
// 图文消息缩略图的media_id, 可以在上传永久素材接口中获得
mArticle1.thumb_media_id =
"2jgIPFBe8e6loFxjju2uYEN564-Q5d5UPTS4Sw-58AC3idFCq2RKZfA5l16644VZ4tdf9exlKkXNvpApecRhFIA";
// 图文消息的作者
mArticle1.author = "Engineer-Jsp";
// 图文消息点击“阅读原文”之后的页面链接
mArticle1.content_source_url = "http://www.engineer-jsp.cn/";
// 图文消息的内容,支持html标签
mArticle1.content = "上传永久图文素材测试-1";
// 图文消息的描述
mArticle1.digest = "上传永久图文素材测试-1";
// 是否显示封面,1为显示,0为不显示。默认为0
mArticle1.show_cover_pic = "1";
// 将该主体添加到 JSON 主体中
JSONBody.add(mArticle1.getJSONObject());
/** 第二个图文主体 */
ForeverArticle mArticle2 = new ForeverArticle();
// 图文消息标题
mArticle2.title = "上传永久图文素材测试-2";
// 图文消息缩略图的media_id, 可以在上传永久素材接口中获得
mArticle2.thumb_media_id =
"2oPn4I5ihl3OYAr2-x3xwvAVzdcQbxb3FWJBCzJtMj8jlF5H1I6H8Hs53K2VpMrejF1RJhE6jCTVqc_dGJM9zJQ";
// 图文消息的作者
mArticle2.author = "Engineer-Jsp";
// 图文消息点击“阅读原文”之后的页面链接
mArticle2.content_source_url = "http://www.engineer-jsp.cn/";
// 图文消息的内容,支持html标签
mArticle2.content = "上传永久图文素材测试-2";
// 图文消息的描述
mArticle2.digest = "上传永久图文素材测试-2";
// 是否显示封面,1为显示,0为不显示。默认为0
mArticle2.show_cover_pic = "0";
// 将该主体添加到 JSON 主体中
JSONBody.add(mArticle2.getJSONObject());
/** 第二个图文主体 */
ForeverArticle mArticle3 = new ForeverArticle();
// 图文消息标题
mArticle3.title = "上传永久图文素材测试-3";
// 图文消息缩略图的media_id, 可以在上传永久素材接口中获得
mArticle3.thumb_media_id =
"27N7vimhmaV0kMGvy5P8KCqqTC0MK0XGVd0WSyqp5xcxxJ-BEbgHllRVjAIIRh7wjZG2Pr-sCBhW2D12fsNk10A";
// 图文消息的作者
mArticle3.author = "Engineer-Jsp";
// 图文消息点击“阅读原文”之后的页面链接
mArticle3.content_source_url = "http://www.engineer-jsp.cn/";
// 图文消息的内容,支持html标签
mArticle3.content = "上传永久图文素材测试-3";
// 图文消息的描述
mArticle3.digest = "上传永久图文素材测试-3";
// 是否显示封面,1为显示,0为不显示。默认为0
mArticle3.show_cover_pic = "0";
// 将该主体添加到 JSON 主体中
JSONBody.add(mArticle3.getJSONObject());
// 将所有 JSON 主体添加到 JSON 头
String PostJSONHeader = String.format(JSONHeadr, JSONBody.toString());
System.out.println(PostJSONHeader);
// 上传地址
String PostUrl =
"https://qyapi.weixin.qq.com/cgi-bin/material/add_mpnews?access_token=ACCESS_TOKEN";
// 获取 accesstoken
String access_token = WeixinUtil.getAccessToken(ParamesAPI.corpId,
ParamesAPI.secret).getToken();
// 替换 accesstoken
PostUrl = PostUrl.replace("ACCESS_TOKEN", access_token);
JSONObject JSONResult = WeixinUtil.HttpRequest(PostUrl, "POST",
PostJSONHeader);
if (JSONResult.has("errcode") && JSONResult.getInt("errcode") == 0)
System.out.println("上传永久图文素材成功");
// 发送永久图文素材给所有关注用户的测试
String POST_URL =
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN";
String media_id = JSONResult.getString("media_id");
String PostSendForeverNesData = String.format(
SendForeverNewsJSONHeader, media_id);
int result = WeixinUtil.PostMessage(access_token, "POST", POST_URL,
PostSendForeverNesData);
// 打印结果
if (0 == result)
System.out.println("发送成功");
else
System.out.println("发送失败");
else
System.out.println("上传永久图文素材失败");
/** 测试用的media_id,来自上传其他类型永久素材 */
//2jgIPFBe8e6loFxjju2uYEN564-Q5d5UPTS4Sw-58AC3idFCq2RKZfA5l16644VZ4tdf9exlKkXNvpApecRhFIA
//2oPn4I5ihl3OYAr2-x3xwvAVzdcQbxb3FWJBCzJtMj8jlF5H1I6H8Hs53K2VpMrejF1RJhE6jCTVqc_dGJM9zJQ
//27N7vimhmaV0kMGvy5P8KCqqTC0MK0XGVd0WSyqp5xcxxJ-BEbgHllRVjAIIRh7wjZG2Pr-sCBhW2D12fsNk10A
/** 获取到的永久图文素材 media_id */
// 29Ujz_kRpTZ9LOIjurDHR6d4tffci2gWMt0tIw2nDPetZsRpJPBZKhP6onvu9NFq1
// 29Ujz_kRpTZ9LOIjurDHR6d4tffci2gWMt0tIw2nDPesE3KzbigjS8wlsp1pAnPhU
package jsp.weixin.media.util;
public class ForeverArticle
private String JSONFlags = "\\"title\\": \\"%s\\",\\"thumb_media_id\\": \\"%s\\",\\"author\\": \\"%s\\",\\"content_source_url\\": \\"%s\\",\\"content\\": \\"%s\\",\\"digest\\": \\"%s\\",\\"show_cover_pic\\": \\"%s\\"";
public String title;
public String thumb_media_id;
public String author;
public String content_source_url;
public String content;
public String digest;
public String show_cover_pic;
public String getJSONObject()
return String.format(JSONFlags, title, thumb_media_id, author,
content_source_url, content, digest, show_cover_pic);
上传成功后,直接发送给所有已关注的用户!
微信端收到图文消息:
本地资源文件:
OK,上传永久素材就这么多,希望对大家有帮助!
以上是关于微信企业号上传永久素材讲解与演示的主要内容,如果未能解决你的问题,请参考以下文章