微信企业号上传永久素材讲解与演示

Posted Engineer-Jsp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信企业号上传永久素材讲解与演示相关的知识,希望对你有一定的参考价值。

因为写书的需要,就顺便把这个章节一起写在博客了,只为帮助有需要的朋友,上传永久素材接口里面分了2个小接口

① 上传永久图文素材

② 上传其他类型永久素材

官方开发文档传送门:http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%8A%E4%BC%A0%E6%B0%B8%E4%B9%85%E7%B4%A0%E6%9D%90

首先上传永久图文素材需要一个必须的参数那就是 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)
mediaform-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


上述是官方给出的文档,如上所需,编写对应的方法,来上传我们的文件,并且获取到 media_id 参数

	/**
	 * 上传其它类型永久素材
	 * 
	 * @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,上传永久素材就这么多,希望对大家有帮助!

以上是关于微信企业号上传永久素材讲解与演示的主要内容,如果未能解决你的问题,请参考以下文章

微信公众平台开发—上传永久素材(图片)

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

tp5上传图片添加永久素材到微信公众号

第三方微信公众号开发上传永久素材,当是其他类型的素材是参数如何设置

微信企业号-上传获取临时素材文件

C#开发微信门户及应用(26)-公众号微信素材管理