@@ -16,6 +16,7 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder; | |||||
public class WxMediaUploadResult implements Serializable { | public class WxMediaUploadResult implements Serializable { | ||||
private static final long serialVersionUID = 330834334738622341L; | private static final long serialVersionUID = 330834334738622341L; | ||||
private String url; | |||||
private String type; | private String type; | ||||
private String mediaId; | private String mediaId; | ||||
private String thumbMediaId; | private String thumbMediaId; | ||||
@@ -1,10 +1,14 @@ | |||||
package me.chanjar.weixin.common.util.json; | package me.chanjar.weixin.common.util.json; | ||||
import com.google.gson.*; | |||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | |||||
import java.lang.reflect.Type; | import java.lang.reflect.Type; | ||||
import com.google.gson.JsonDeserializationContext; | |||||
import com.google.gson.JsonDeserializer; | |||||
import com.google.gson.JsonElement; | |||||
import com.google.gson.JsonObject; | |||||
import com.google.gson.JsonParseException; | |||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | |||||
/** | /** | ||||
* @author Daniel Qian | * @author Daniel Qian | ||||
*/ | */ | ||||
@@ -12,22 +16,25 @@ public class WxMediaUploadResultAdapter implements JsonDeserializer<WxMediaUploa | |||||
@Override | @Override | ||||
public WxMediaUploadResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { | public WxMediaUploadResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { | ||||
WxMediaUploadResult uploadResult = new WxMediaUploadResult(); | |||||
JsonObject uploadResultJsonObject = json.getAsJsonObject(); | |||||
WxMediaUploadResult result = new WxMediaUploadResult(); | |||||
JsonObject jsonObject = json.getAsJsonObject(); | |||||
if (jsonObject.get("url") != null && !jsonObject.get("url").isJsonNull()) { | |||||
result.setUrl(GsonHelper.getAsString(jsonObject.get("url"))); | |||||
} | |||||
if (uploadResultJsonObject.get("type") != null && !uploadResultJsonObject.get("type").isJsonNull()) { | |||||
uploadResult.setType(GsonHelper.getAsString(uploadResultJsonObject.get("type"))); | |||||
if (jsonObject.get("type") != null && !jsonObject.get("type").isJsonNull()) { | |||||
result.setType(GsonHelper.getAsString(jsonObject.get("type"))); | |||||
} | } | ||||
if (uploadResultJsonObject.get("media_id") != null && !uploadResultJsonObject.get("media_id").isJsonNull()) { | |||||
uploadResult.setMediaId(GsonHelper.getAsString(uploadResultJsonObject.get("media_id"))); | |||||
if (jsonObject.get("media_id") != null && !jsonObject.get("media_id").isJsonNull()) { | |||||
result.setMediaId(GsonHelper.getAsString(jsonObject.get("media_id"))); | |||||
} | } | ||||
if (uploadResultJsonObject.get("thumb_media_id") != null && !uploadResultJsonObject.get("thumb_media_id").isJsonNull()) { | |||||
uploadResult.setThumbMediaId(GsonHelper.getAsString(uploadResultJsonObject.get("thumb_media_id"))); | |||||
if (jsonObject.get("thumb_media_id") != null && !jsonObject.get("thumb_media_id").isJsonNull()) { | |||||
result.setThumbMediaId(GsonHelper.getAsString(jsonObject.get("thumb_media_id"))); | |||||
} | } | ||||
if (uploadResultJsonObject.get("created_at") != null && !uploadResultJsonObject.get("created_at").isJsonNull()) { | |||||
uploadResult.setCreatedAt(GsonHelper.getAsPrimitiveLong(uploadResultJsonObject.get("created_at"))); | |||||
if (jsonObject.get("created_at") != null && !jsonObject.get("created_at").isJsonNull()) { | |||||
result.setCreatedAt(GsonHelper.getAsPrimitiveLong(jsonObject.get("created_at"))); | |||||
} | } | ||||
return uploadResult; | |||||
return result; | |||||
} | } | ||||
} | } |
@@ -9,17 +9,20 @@ import me.chanjar.weixin.common.error.WxErrorException; | |||||
/** | /** | ||||
* <pre> | * <pre> | ||||
* 媒体管理接口 | |||||
* 媒体管理接口. | |||||
* Created by BinaryWang on 2017/6/24. | * Created by BinaryWang on 2017/6/24. | ||||
* </pre> | * </pre> | ||||
* | * | ||||
* @author <a href="https://github.com/binarywang">Binary Wang</a> | * @author <a href="https://github.com/binarywang">Binary Wang</a> | ||||
*/ | */ | ||||
public interface WxCpMediaService { | public interface WxCpMediaService { | ||||
String MEDIA_GET_URL = "https://qyapi.weixin.qq.com/cgi-bin/media/get"; | |||||
String MEDIA_UPLOAD_URL = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?type="; | |||||
String IMG_UPLOAD_URL = "https://qyapi.weixin.qq.com/cgi-bin/media/uploadimg"; | |||||
/** | /** | ||||
* <pre> | * <pre> | ||||
* 上传多媒体文件 | |||||
* 上传多媒体文件. | |||||
* 上传的多媒体文件有格式和大小限制,如下: | * 上传的多媒体文件有格式和大小限制,如下: | ||||
* 图片(image): 1M,支持JPG格式 | * 图片(image): 1M,支持JPG格式 | ||||
* 语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式 | * 语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式 | ||||
@@ -36,6 +39,8 @@ public interface WxCpMediaService { | |||||
throws WxErrorException, IOException; | throws WxErrorException, IOException; | ||||
/** | /** | ||||
* 上传多媒体文件. | |||||
* | |||||
* @param mediaType 媒体类型 | * @param mediaType 媒体类型 | ||||
* @param file 文件对象 | * @param file 文件对象 | ||||
* @see #upload(String, String, InputStream) | * @see #upload(String, String, InputStream) | ||||
@@ -44,7 +49,7 @@ public interface WxCpMediaService { | |||||
/** | /** | ||||
* <pre> | * <pre> | ||||
* 下载多媒体文件 | |||||
* 下载多媒体文件. | |||||
* 根据微信文档,视频文件下载不了,会返回null | * 根据微信文档,视频文件下载不了,会返回null | ||||
* 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=上传下载多媒体文件 | * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=上传下载多媒体文件 | ||||
* </pre> | * </pre> | ||||
@@ -54,4 +59,17 @@ public interface WxCpMediaService { | |||||
*/ | */ | ||||
File download(String mediaId) throws WxErrorException; | File download(String mediaId) throws WxErrorException; | ||||
/** | |||||
* <pre> | |||||
* 上传图片. | |||||
* 上传图片得到图片URL,该URL永久有效 | |||||
* 返回的图片URL,仅能用于图文消息(mpnews)正文中的图片展示;若用于非企业微信域名下的页面,图片将被屏蔽。 | |||||
* 每个企业每天最多可上传100张图片 | |||||
* 接口url格式:https://qyapi.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN | |||||
* </pre> | |||||
* | |||||
* @param file 上传的文件对象 | |||||
* @return 返回图片url | |||||
*/ | |||||
String uploadImg(File file) throws WxErrorException; | |||||
} | } |
@@ -1,5 +1,10 @@ | |||||
package me.chanjar.weixin.cp.api.impl; | package me.chanjar.weixin.cp.api.impl; | ||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.util.UUID; | |||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | ||||
import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
import me.chanjar.weixin.common.util.fs.FileUtils; | import me.chanjar.weixin.common.util.fs.FileUtils; | ||||
@@ -8,11 +13,6 @@ import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; | |||||
import me.chanjar.weixin.cp.api.WxCpMediaService; | import me.chanjar.weixin.cp.api.WxCpMediaService; | ||||
import me.chanjar.weixin.cp.api.WxCpService; | import me.chanjar.weixin.cp.api.WxCpService; | ||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.util.UUID; | |||||
/** | /** | ||||
* <pre> | * <pre> | ||||
* 媒体管理接口 | * 媒体管理接口 | ||||
@@ -35,16 +35,22 @@ public class WxCpMediaServiceImpl implements WxCpMediaService { | |||||
@Override | @Override | ||||
public WxMediaUploadResult upload(String mediaType, File file) throws WxErrorException { | public WxMediaUploadResult upload(String mediaType, File file) throws WxErrorException { | ||||
String url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?type=" + mediaType; | |||||
return this.mainService.execute(MediaUploadRequestExecutor.create(this.mainService.getRequestHttp()), url, file); | |||||
return this.mainService.execute(MediaUploadRequestExecutor.create(this.mainService.getRequestHttp()), | |||||
MEDIA_UPLOAD_URL + mediaType, file); | |||||
} | } | ||||
@Override | @Override | ||||
public File download(String mediaId) throws WxErrorException { | public File download(String mediaId) throws WxErrorException { | ||||
String url = "https://qyapi.weixin.qq.com/cgi-bin/media/get"; | |||||
return this.mainService.execute( | return this.mainService.execute( | ||||
BaseMediaDownloadRequestExecutor.create(this.mainService.getRequestHttp(), | BaseMediaDownloadRequestExecutor.create(this.mainService.getRequestHttp(), | ||||
this.mainService.getWxCpConfigStorage().getTmpDirFile()), | this.mainService.getWxCpConfigStorage().getTmpDirFile()), | ||||
url, "media_id=" + mediaId); | |||||
MEDIA_GET_URL, "media_id=" + mediaId); | |||||
} | |||||
@Override | |||||
public String uploadImg(File file) throws WxErrorException { | |||||
final WxMediaUploadResult result = this.mainService | |||||
.execute(MediaUploadRequestExecutor.create(this.mainService.getRequestHttp()), IMG_UPLOAD_URL, file); | |||||
return result.getUrl(); | |||||
} | } | ||||
} | } |
@@ -1,5 +1,14 @@ | |||||
package me.chanjar.weixin.cp.api.impl; | package me.chanjar.weixin.cp.api.impl; | ||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.net.URL; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import org.testng.annotations.*; | |||||
import com.google.inject.Inject; | import com.google.inject.Inject; | ||||
import me.chanjar.weixin.common.api.WxConsts; | import me.chanjar.weixin.common.api.WxConsts; | ||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | ||||
@@ -7,22 +16,14 @@ import me.chanjar.weixin.common.error.WxErrorException; | |||||
import me.chanjar.weixin.cp.api.ApiTestModule; | import me.chanjar.weixin.cp.api.ApiTestModule; | ||||
import me.chanjar.weixin.cp.api.TestConstants; | import me.chanjar.weixin.cp.api.TestConstants; | ||||
import me.chanjar.weixin.cp.api.WxCpService; | import me.chanjar.weixin.cp.api.WxCpService; | ||||
import org.testng.annotations.*; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import static org.assertj.core.api.Assertions.assertThat; | |||||
import static org.testng.Assert.*; | import static org.testng.Assert.*; | ||||
/** | /** | ||||
* <pre> | |||||
* | |||||
* Created by Binary Wang on 2017-6-25. | * Created by Binary Wang on 2017-6-25. | ||||
* | |||||
* @author <a href="https://github.com/binarywang">Binary Wang</a> | * @author <a href="https://github.com/binarywang">Binary Wang</a> | ||||
* </pre> | |||||
*/ | */ | ||||
@Guice(modules = ApiTestModule.class) | @Guice(modules = ApiTestModule.class) | ||||
public class WxCpMediaServiceImplTest { | public class WxCpMediaServiceImplTest { | ||||
@@ -35,8 +36,8 @@ public class WxCpMediaServiceImplTest { | |||||
public Object[][] mediaData() { | public Object[][] mediaData() { | ||||
return new Object[][]{ | return new Object[][]{ | ||||
new Object[]{WxConsts.MediaFileType.IMAGE, TestConstants.FILE_JPG, "mm.jpeg"}, | new Object[]{WxConsts.MediaFileType.IMAGE, TestConstants.FILE_JPG, "mm.jpeg"}, | ||||
new Object[]{WxConsts.MediaFileType.VOICE, TestConstants.FILE_MP3, "mm.mp3"}, | |||||
new Object[]{WxConsts.MediaFileType.VOICE, TestConstants.FILE_AMR, "mm.amr"},//{"errcode":301017,"errmsg":"voice file only support amr like myvoice.amr"} | |||||
new Object[]{WxConsts.MediaFileType.VOICE, TestConstants.FILE_MP3, "mm.mp3"},//{"errcode":301017,"errmsg":"voice file only support amr like myvoice.amr"} | |||||
new Object[]{WxConsts.MediaFileType.VOICE, TestConstants.FILE_AMR, "mm.amr"}, | |||||
new Object[]{WxConsts.MediaFileType.VIDEO, TestConstants.FILE_MP4, "mm.mp4"}, | new Object[]{WxConsts.MediaFileType.VIDEO, TestConstants.FILE_MP4, "mm.mp4"}, | ||||
new Object[]{WxConsts.MediaFileType.FILE, TestConstants.FILE_JPG, "mm.jpeg"} | new Object[]{WxConsts.MediaFileType.FILE, TestConstants.FILE_JPG, "mm.jpeg"} | ||||
}; | }; | ||||
@@ -75,4 +76,10 @@ public class WxCpMediaServiceImplTest { | |||||
System.out.println(file); | System.out.println(file); | ||||
} | } | ||||
@Test | |||||
public void testUploadImg() throws WxErrorException { | |||||
URL url = ClassLoader.getSystemResource("mm.jpeg"); | |||||
String res = this.wxService.getMediaService().uploadImg(new File(url.getFile())); | |||||
assertThat(res).isNotEmpty(); | |||||
} | |||||
} | } |
@@ -1,12 +1,20 @@ | |||||
package me.chanjar.weixin.mp.api; | package me.chanjar.weixin.mp.api; | ||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | |||||
import me.chanjar.weixin.common.error.WxErrorException; | |||||
import me.chanjar.weixin.mp.bean.material.*; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | |||||
import me.chanjar.weixin.common.error.WxErrorException; | |||||
import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterial; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialArticleUpdate; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialCountResult; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialFileBatchGetResult; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNewsBatchGetResult; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialVideoInfoResult; | |||||
/** | /** | ||||
* <pre> | * <pre> | ||||
* Created by Binary Wang on 2016/7/21. | * Created by Binary Wang on 2016/7/21. | ||||
@@ -1,9 +1,16 @@ | |||||
package me.chanjar.weixin.mp.api.impl; | package me.chanjar.weixin.mp.api.impl; | ||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import java.util.UUID; | |||||
import me.chanjar.weixin.common.WxType; | import me.chanjar.weixin.common.WxType; | ||||
import me.chanjar.weixin.common.api.WxConsts; | import me.chanjar.weixin.common.api.WxConsts; | ||||
import me.chanjar.weixin.common.error.WxError; | |||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | ||||
import me.chanjar.weixin.common.error.WxError; | |||||
import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
import me.chanjar.weixin.common.util.fs.FileUtils; | import me.chanjar.weixin.common.util.fs.FileUtils; | ||||
import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; | import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; | ||||
@@ -11,17 +18,22 @@ import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; | |||||
import me.chanjar.weixin.common.util.json.WxGsonBuilder; | import me.chanjar.weixin.common.util.json.WxGsonBuilder; | ||||
import me.chanjar.weixin.mp.api.WxMpMaterialService; | import me.chanjar.weixin.mp.api.WxMpMaterialService; | ||||
import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
import me.chanjar.weixin.mp.bean.material.*; | |||||
import me.chanjar.weixin.mp.util.requestexecuter.material.*; | |||||
import me.chanjar.weixin.mp.util.requestexecuter.media.MediaImgUploadRequestExecutor; | |||||
import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterial; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialArticleUpdate; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialCountResult; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialFileBatchGetResult; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNewsBatchGetResult; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult; | |||||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialVideoInfoResult; | |||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | ||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import java.util.UUID; | |||||
import me.chanjar.weixin.mp.util.requestexecuter.material.MaterialDeleteRequestExecutor; | |||||
import me.chanjar.weixin.mp.util.requestexecuter.material.MaterialNewsInfoRequestExecutor; | |||||
import me.chanjar.weixin.mp.util.requestexecuter.material.MaterialUploadRequestExecutor; | |||||
import me.chanjar.weixin.mp.util.requestexecuter.material.MaterialVideoInfoRequestExecutor; | |||||
import me.chanjar.weixin.mp.util.requestexecuter.material.MaterialVoiceAndImageDownloadRequestExecutor; | |||||
import me.chanjar.weixin.mp.util.requestexecuter.media.MediaImgUploadRequestExecutor; | |||||
/** | /** | ||||
* Created by Binary Wang on 2016/7/21. | * Created by Binary Wang on 2016/7/21. | ||||