修复获取不到素材bug

This commit is contained in:
jinyu 2016-08-08 17:49:43 +08:00
parent a2b9122b71
commit 1c2c966ea2

View File

@ -73,7 +73,8 @@ public class MediaApi extends MpApi {
* @return 图片URL 可用于群发消息中的图片链接和创建卡券logo链接
* @throws WeixinException
*/
public String uploadImage(InputStream is, String fileName) throws WeixinException {
public String uploadImage(InputStream is, String fileName)
throws WeixinException {
if (StringUtil.isBlank(fileName)) {
fileName = ObjectId.get().toHexString();
}
@ -81,10 +82,13 @@ public class MediaApi extends MpApi {
fileName = String.format("%s.jpg", fileName);
}
String image_upload_uri = getRequestUri("image_upload_uri");
MimeType mimeType = new MimeType("image", FileUtil.getFileExtension(fileName));
MimeType mimeType = new MimeType("image",
FileUtil.getFileExtension(fileName));
Token token = tokenManager.getCache();
WeixinResponse response = weixinExecutor.post(String.format(image_upload_uri, token.getAccessToken()),
new FormBodyPart("media", new InputStreamBody(is, mimeType.toString(), fileName)));
WeixinResponse response = weixinExecutor.post(
String.format(image_upload_uri, token.getAccessToken()),
new FormBodyPart("media", new InputStreamBody(is, mimeType
.toString(), fileName)));
return response.getAsJson().getString("url");
}
@ -105,8 +109,8 @@ public class MediaApi extends MpApi {
* "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">高级群发</a>
* @see com.foxinmy.weixin4j.tuple.MpVideo
*/
public MpVideo uploadVideo(InputStream is, String fileName, String title, String description)
throws WeixinException {
public MpVideo uploadVideo(InputStream is, String fileName, String title,
String description) throws WeixinException {
MediaUploadResult uploadResult = uploadMedia(false, is, fileName);
JSONObject obj = new JSONObject();
obj.put("media_id", uploadResult.getMediaId());
@ -114,7 +118,8 @@ public class MediaApi extends MpApi {
obj.put("description", description);
String video_upload_uri = getRequestUri("video_upload_uri");
Token token = tokenManager.getCache();
WeixinResponse response = weixinExecutor.post(String.format(video_upload_uri, token.getAccessToken()),
WeixinResponse response = weixinExecutor.post(
String.format(video_upload_uri, token.getAccessToken()),
obj.toJSONString());
String mediaId = response.getAsJson().getString("media_id");
@ -122,8 +127,8 @@ public class MediaApi extends MpApi {
}
/**
* 上传媒体文件:图片image语音voice视频(video)和缩略图thumb </br>
* <font color="red">此接口只包含图片语音缩略图视频(临时)四种媒体类型的上传</font>
* 上传媒体文件:图片image语音voice视频(video)和缩略图thumb </br> <font
* color="red">此接口只包含图片语音缩略图视频(临时)四种媒体类型的上传</font>
* <p>
* 正常情况下返回{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789},
* 否则抛出异常.
@ -144,7 +149,8 @@ public class MediaApi extends MpApi {
* @see com.foxinmy.weixin4j.type.MediaType
* @throws WeixinException
*/
public MediaUploadResult uploadMedia(boolean isMaterial, InputStream is, String fileName) throws WeixinException {
public MediaUploadResult uploadMedia(boolean isMaterial, InputStream is,
String fileName) throws WeixinException {
byte[] content;
try {
content = IOUtil.toByteArray(is);
@ -156,42 +162,54 @@ public class MediaApi extends MpApi {
}
String suffixName = FileUtil.getFileExtension(fileName);
if (StringUtil.isBlank(suffixName)) {
suffixName = FileUtil.getFileType(new ByteArrayInputStream(content));
suffixName = FileUtil
.getFileType(new ByteArrayInputStream(content));
fileName = String.format("%s.%s", fileName, suffixName);
}
MediaType mediaType;
if (",bmp,png,jpeg,jpg,gif,".contains(String.format(",%s,", suffixName))) {
if (",bmp,png,jpeg,jpg,gif,"
.contains(String.format(",%s,", suffixName))) {
mediaType = MediaType.image;
} else if (",mp3,wma,wav,amr,".contains(String.format(",%s,", suffixName))) {
} else if (",mp3,wma,wav,amr,".contains(String.format(",%s,",
suffixName))) {
mediaType = MediaType.voice;
} else if (",rm,rmvb,wmv,avi,mpg,mpeg,mp4,".contains(String.format(",%s,", suffixName))) {
} else if (",rm,rmvb,wmv,avi,mpg,mpeg,mp4,".contains(String.format(
",%s,", suffixName))) {
mediaType = MediaType.video;
} else {
throw new WeixinException("cannot handle mediaType:" + suffixName);
}
if (mediaType == MediaType.video && isMaterial) {
throw new WeixinException("please invoke uploadMaterialVideo method");
throw new WeixinException(
"please invoke uploadMaterialVideo method");
}
Token token = tokenManager.getCache();
WeixinResponse response = null;
try {
if (isMaterial) {
String material_media_upload_uri = getRequestUri("material_media_upload_uri");
response = weixinExecutor.post(String.format(material_media_upload_uri, token.getAccessToken()),
new FormBodyPart("media",
new ByteArrayBody(content, mediaType.getMimeType().toString(), fileName)),
new FormBodyPart("type", new StringBody(mediaType.name(), Consts.UTF_8)));
response = weixinExecutor.post(
String.format(material_media_upload_uri,
token.getAccessToken()),
new FormBodyPart("media", new ByteArrayBody(content,
mediaType.getMimeType().toString(), fileName)),
new FormBodyPart("type", new StringBody(mediaType
.name(), Consts.UTF_8)));
JSONObject obj = response.getAsJson();
return new MediaUploadResult(obj.getString("media_id"), mediaType, new Date(), obj.getString("url"));
return new MediaUploadResult(obj.getString("media_id"),
mediaType, new Date(), obj.getString("url"));
} else {
String media_upload_uri = getRequestUri("media_upload_uri");
response = weixinExecutor.post(
String.format(media_upload_uri, token.getAccessToken(), mediaType.name()),
new FormBodyPart("media", new InputStreamBody(new ByteArrayInputStream(content),
mediaType.getMimeType().toString(), fileName)));
response = weixinExecutor.post(String.format(media_upload_uri,
token.getAccessToken(), mediaType.name()),
new FormBodyPart("media", new InputStreamBody(
new ByteArrayInputStream(content), mediaType
.getMimeType().toString(), fileName)));
JSONObject obj = response.getAsJson();
return new MediaUploadResult(obj.getString("media_id"), obj.getObject("type", MediaType.class),
new Date(obj.getLong("created_at") * 1000l), obj.getString("url"));
return new MediaUploadResult(obj.getString("media_id"),
obj.getObject("type", MediaType.class), new Date(
obj.getLong("created_at") * 1000l),
obj.getString("url"));
}
} catch (UnsupportedEncodingException e) {
throw new WeixinException(e);
@ -220,39 +238,51 @@ public class MediaApi extends MpApi {
* @see <a href=
* "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738730&token=&lang=zh_CN">下载永久媒体素材</a>
*/
public MediaDownloadResult downloadMedia(String mediaId, boolean isMaterial) throws WeixinException {
public MediaDownloadResult downloadMedia(String mediaId, boolean isMaterial)
throws WeixinException {
Token token = tokenManager.getCache();
try {
HttpRequest request = null;
if (isMaterial) {
String material_media_download_uri = getRequestUri("material_media_download_uri");
request = new HttpRequest(HttpMethod.POST,
String.format(material_media_download_uri, token.getAccessToken()));
request.setEntity(new StringEntity(String.format("{\"media_id\":\"%s\"}", mediaId)));
request = new HttpRequest(HttpMethod.POST, String.format(
material_media_download_uri, token.getAccessToken()));
request.setEntity(new StringEntity(String.format(
"{\"media_id\":\"%s\"}", mediaId)));
} else {
String meida_download_uri = getRequestUri("meida_download_uri");
request = new HttpRequest(HttpMethod.GET,
String.format(meida_download_uri, token.getAccessToken(), mediaId));
request = new HttpRequest(HttpMethod.GET, String.format(
meida_download_uri, token.getAccessToken(), mediaId));
}
logger.info("weixin request >> " + request.getMethod() + " " + request.getURI().toString());
HttpResponse response = weixinExecutor.getExecuteClient().execute(request);
logger.info("weixin request >> " + request.getMethod() + " "
+ request.getURI().toString());
HttpResponse response = weixinExecutor.getExecuteClient().execute(
request);
byte[] content = IOUtil.toByteArray(response.getBody());
HttpHeaders headers = response.getHeaders();
String contentType = headers.getFirst(HttpHeaders.CONTENT_TYPE);
String disposition = headers.getFirst(HttpHeaders.CONTENT_DISPOSITION);
logger.info("weixin response << " + response.getProtocol() + response.getStatus().toString() + "["
+ contentType + "]->" + disposition);
if (JsonMessageConverter.GLOBAL.canConvert(ApiResult.class, response)) {
ApiResult result = JsonMessageConverter.GLOBAL.convert(ApiResult.class, response);
String disposition = headers
.getFirst(HttpHeaders.CONTENT_DISPOSITION);
logger.info("weixin response << " + response.getProtocol()
+ response.getStatus().toString() + "[" + contentType
+ "]->" + disposition);
if (JsonMessageConverter.GLOBAL.canConvert(ApiResult.class,
response)) {
ApiResult result = JsonMessageConverter.GLOBAL.convert(
ApiResult.class, response);
if (!"0".equals(result.getReturnCode())) {
throw new WeixinException(result.getReturnCode(), result.getReturnMsg());
throw new WeixinException(result.getReturnCode(),
result.getReturnMsg());
}
}
String fileName = RegexUtil.regexFileNameFromContentDispositionHeader(disposition);
String fileName = RegexUtil
.regexFileNameFromContentDispositionHeader(disposition);
if (StringUtil.isBlank(fileName)) {
fileName = String.format("%s.%s", mediaId, contentType.split("/")[1]);
fileName = String.format("%s.%s", mediaId,
contentType.split("/")[1]);
}
return new MediaDownloadResult(content, ContentType.create(contentType), fileName);
return new MediaDownloadResult(content,
ContentType.create(contentType), fileName);
} catch (IOException e) {
throw new WeixinException("I/O Error on getBody", e);
} catch (HttpClientException e) {
@ -275,13 +305,15 @@ public class MediaApi extends MpApi {
* "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729&token=&lang=zh_CN">上传永久媒体素材</a>
* @see com.foxinmy.weixin4j.tuple.MpArticle
*/
public String uploadMaterialArticle(List<MpArticle> articles) throws WeixinException {
public String uploadMaterialArticle(List<MpArticle> articles)
throws WeixinException {
Token token = tokenManager.getCache();
String material_article_upload_uri = getRequestUri("material_article_upload_uri");
JSONObject obj = new JSONObject();
obj.put("articles", articles);
WeixinResponse response = weixinExecutor
.post(String.format(material_article_upload_uri, token.getAccessToken()), obj.toJSONString());
WeixinResponse response = weixinExecutor.post(
String.format(material_article_upload_uri,
token.getAccessToken()), obj.toJSONString());
return response.getAsJson().getString("media_id");
}
@ -296,10 +328,12 @@ public class MediaApi extends MpApi {
* @see {@link #downloadMedia(String, boolean)}
* @see com.foxinmy.weixin4j.tuple.MpArticle
*/
public List<MpArticle> downloadArticle(String mediaId) throws WeixinException {
public List<MpArticle> downloadArticle(String mediaId)
throws WeixinException {
MediaDownloadResult result = downloadMedia(mediaId, true);
byte[] content = result.getContent();
JSONObject obj = JSON.parseObject(content, 0, content.length, Consts.UTF_8.newDecoder(), JSONObject.class);
JSONObject obj = JSON.parseObject(content, 0, content.length,
Consts.UTF_8.newDecoder(), JSONObject.class);
return JSON.parseArray(obj.getString("news_item"), MpArticle.class);
}
@ -318,15 +352,17 @@ public class MediaApi extends MpApi {
* @see <a href=
* "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738732&token=&lang=zh_CN">更新永久图文素材</a>
*/
public ApiResult updateMaterialArticle(String mediaId, int index, MpArticle article) throws WeixinException {
public ApiResult updateMaterialArticle(String mediaId, int index,
MpArticle article) throws WeixinException {
Token token = tokenManager.getCache();
String material_article_update_uri = getRequestUri("material_article_update_uri");
JSONObject obj = new JSONObject();
obj.put("articles", article);
obj.put("media_id", mediaId);
obj.put("index", index);
WeixinResponse response = weixinExecutor
.post(String.format(material_article_update_uri, token.getAccessToken()), obj.toJSONString());
WeixinResponse response = weixinExecutor.post(
String.format(material_article_update_uri,
token.getAccessToken()), obj.toJSONString());
return response.getAsResult();
}
@ -346,7 +382,8 @@ public class MediaApi extends MpApi {
String material_media_del_uri = getRequestUri("material_media_del_uri");
JSONObject obj = new JSONObject();
obj.put("media_id", mediaId);
WeixinResponse response = weixinExecutor.post(String.format(material_media_del_uri, token.getAccessToken()),
WeixinResponse response = weixinExecutor.post(
String.format(material_media_del_uri, token.getAccessToken()),
obj.toJSONString());
return response.getAsResult();
@ -368,8 +405,8 @@ public class MediaApi extends MpApi {
* "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729&token=&lang=zh_CN">上传永久媒体素材</a>
* @throws WeixinException
*/
public String uploadMaterialVideo(InputStream is, String fileName, String title, String introduction)
throws WeixinException {
public String uploadMaterialVideo(InputStream is, String fileName,
String title, String introduction) throws WeixinException {
if (StringUtil.isBlank(fileName)) {
fileName = ObjectId.get().toHexString();
}
@ -377,16 +414,20 @@ public class MediaApi extends MpApi {
fileName = String.format("%s.mp4", fileName);
}
String material_media_upload_uri = getRequestUri("material_media_upload_uri");
MimeType mimeType = new MimeType("video", FileUtil.getFileExtension(fileName));
MimeType mimeType = new MimeType("video",
FileUtil.getFileExtension(fileName));
Token token = tokenManager.getCache();
try {
JSONObject description = new JSONObject();
description.put("title", title);
description.put("introduction", introduction);
WeixinResponse response = weixinExecutor.post(
String.format(material_media_upload_uri, token.getAccessToken()),
new FormBodyPart("media", new InputStreamBody(is, mimeType.toString(), fileName)),
new FormBodyPart("description", new StringBody(description.toJSONString(), Consts.UTF_8)));
String.format(material_media_upload_uri,
token.getAccessToken()),
new FormBodyPart("media", new InputStreamBody(is, mimeType
.toString(), fileName)),
new FormBodyPart("description", new StringBody(description
.toJSONString(), Consts.UTF_8)));
return response.getAsJson().getString("media_id");
} catch (UnsupportedEncodingException e) {
throw new WeixinException(e);
@ -402,8 +443,7 @@ public class MediaApi extends MpApi {
}
/**
* 获取永久媒体素材的总数</br>
* .图片和图文消息素材包括单图文和多图文的总数上限为5000其他素材的总数上限为1000
* 获取永久媒体素材的总数</br> .图片和图文消息素材包括单图文和多图文的总数上限为5000其他素材的总数上限为1000
*
* @return 总数对象
* @throws WeixinException
@ -414,7 +454,8 @@ public class MediaApi extends MpApi {
public MediaCounter countMaterialMedia() throws WeixinException {
Token token = tokenManager.getCache();
String material_media_count_uri = getRequestUri("material_media_count_uri");
WeixinResponse response = weixinExecutor.get(String.format(material_media_count_uri, token.getAccessToken()));
WeixinResponse response = weixinExecutor.get(String.format(
material_media_count_uri, token.getAccessToken()));
return response.getAsObject(new TypeReference<MediaCounter>() {
});
@ -437,29 +478,35 @@ public class MediaApi extends MpApi {
* @see <a href=
* "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738734&token=&lang=zh_CN">获取素材列表</a>
*/
public MediaRecord listMaterialMedia(MediaType mediaType, Pageable pageable) throws WeixinException {
public MediaRecord listMaterialMedia(MediaType mediaType, Pageable pageable)
throws WeixinException {
Token token = tokenManager.getCache();
String material_media_list_uri = getRequestUri("material_media_list_uri");
JSONObject obj = new JSONObject();
obj.put("type", mediaType.name());
obj.put("offset", pageable.getOffset());
obj.put("count", pageable.getPageSize());
WeixinResponse response = weixinExecutor.post(String.format(material_media_list_uri, token.getAccessToken()),
WeixinResponse response = weixinExecutor.post(
String.format(material_media_list_uri, token.getAccessToken()),
obj.toJSONString());
obj = response.getAsJson();
obj.put("items", obj.remove("item"));
MediaRecord mediaRecord = null;
if (mediaType == MediaType.news) {
mediaRecord = JSON.parseObject(response.getAsString(), MediaRecord.class, new ExtraProcessor() {
@Override
public void processExtra(Object object, String key, Object value) {
if (key.equals("content")) {
((MediaItem) object).setArticles(
JSON.parseArray(((JSONObject) value).getString("news_item"), MpArticle.class));
}
}
});
mediaRecord = JSON.parseObject(obj.toJSONString(),
MediaRecord.class, new ExtraProcessor() {
@Override
public void processExtra(Object object, String key,
Object value) {
if (key.equals("content")) {
((MediaItem) object).setArticles(JSON
.parseArray(((JSONObject) value)
.getString("news_item"),
MpArticle.class));
}
}
});
} else {
obj = response.getAsJson();
obj.put("items", obj.remove("itemlist"));
mediaRecord = JSON.toJavaObject(obj, MediaRecord.class);
}
mediaRecord.setMediaType(mediaType);
@ -476,13 +523,15 @@ public class MediaApi extends MpApi {
* @see {@link #listMaterialMedia(MediaType, Pageable)}
* @throws WeixinException
*/
public List<MediaItem> listAllMaterialMedia(MediaType mediaType) throws WeixinException {
public List<MediaItem> listAllMaterialMedia(MediaType mediaType)
throws WeixinException {
Pageable pageable = new Pageable(1, 20);
List<MediaItem> mediaList = new ArrayList<MediaItem>();
MediaRecord mediaRecord = null;
for (;;) {
mediaRecord = listMaterialMedia(mediaType, pageable);
if (mediaRecord.getItems() == null || mediaRecord.getItems().isEmpty()) {
if (mediaRecord.getItems() == null
|| mediaRecord.getItems().isEmpty()) {
break;
}
mediaList.addAll(mediaRecord.getItems());