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