微信企業號上傳永久素材講解與演示

因爲寫書的需要,就順便把這個章節一起寫在博客了,只爲幫助有需要的朋友,上傳永久素材接口裏面分了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,上傳永久素材就這麼多,希望對大家有幫助!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章