From b6b1fd98ea30ea9e11a64053a0f476d83a8afa1e Mon Sep 17 00:00:00 2001 From: jinyu Date: Fri, 31 Jul 2015 20:59:21 +0800 Subject: [PATCH] =?UTF-8?q?weixin4j-mp:=E6=96=B0=E5=A2=9E=E5=9B=BE?= =?UTF-8?q?=E6=96=87=E6=B6=88=E6=81=AF=E4=B8=AD=E4=B8=8A=E4=BC=A0=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGE.md | 4 +- .../foxinmy/weixin4j/http/weixin/error.xml | 4 ++ weixin4j-mp/CHANGE.md | 6 ++- .../com/foxinmy/weixin4j/mp/WeixinProxy.java | 43 +++++++++++++------ .../com/foxinmy/weixin4j/mp/api/MediaApi.java | 28 ++++++++++++ .../foxinmy/weixin4j/mp/api/weixin.properties | 2 + .../weixin4j/mp/datacube/ArticleSummary.java | 5 ++- .../weixin4j/mp/type/UserSourceType.java | 2 +- 8 files changed, 76 insertions(+), 18 deletions(-) diff --git a/CHANGE.md b/CHANGE.md index 06d30247..f6440fad 100644 --- a/CHANGE.md +++ b/CHANGE.md @@ -399,4 +399,6 @@ + **weixin4j-server**:`WeixinServerBootstrap` 构造函数支持多个公众号 - + **weixin4j-server**:`MessageHandlerAdapter` 声明时限定泛型为`WeixinMessage`的子类 \ No newline at end of file + + **weixin4j-server**:`MessageHandlerAdapter` 声明时限定泛型为`WeixinMessage`的子类 + + + **weixin4j-mp**: 新增图文消息中上传图片接口 \ No newline at end of file diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml index e62f2e22..9ca30e14 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml @@ -317,6 +317,10 @@ 40121 不合法的media_id类型 + + 40137 + 不支持的图片格式 + 41001 access_token missing diff --git a/weixin4j-mp/CHANGE.md b/weixin4j-mp/CHANGE.md index cd008887..654227a8 100644 --- a/weixin4j-mp/CHANGE.md +++ b/weixin4j-mp/CHANGE.md @@ -126,4 +126,8 @@ + 新增二维码结果类[QRResult.java](./src/main/java/com/foxinmy/weixin4j/mp/model/QRResult.java)并将二维码接口[QRApi.java](./weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java)名称变更为createQR和createQRFile - + [Oauth授权](./src/main/java/com/foxinmy/weixin4j/mp/api/OauthApi.java)跳转的uri在配置文件的属性名改为`oauth_redirect_uri` \ No newline at end of file + + [Oauth授权](./src/main/java/com/foxinmy/weixin4j/mp/api/OauthApi.java)跳转的uri在配置文件的属性名改为`oauth_redirect_uri` + +* 2015-07-31 + + + 新增图文消息中上传图片接口 \ No newline at end of file diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java index 19df5ef9..ce1a478e 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java @@ -128,6 +128,23 @@ public class WeixinProxy { return this.tokenHolder; } + /** + * 上传图文消息内的图片获取URL + * 请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。 + * + * @param is + * 图片数据流 + * @param fileName + * 文件名 为空时将自动生成 + * @return 图片URL 可用于后续群发中,放置到图文消息中 + * @see com.foxinmy.weixin4j.mp.api.MediaApi + * @throws WeixinException + */ + public String uploadImage(InputStream is, String fileName) + throws WeixinException { + return mediaApi.uploadImage(is, fileName); + } + /** * 上传媒体文件
此接口只包含图片、语音、缩略图、视频(临时)四种媒体类型的上传 *

@@ -148,7 +165,7 @@ public class WeixinProxy { * href="http://mp.weixin.qq.com/wiki/14/7e6c03263063f4813141c3e17dd4350a.html">上传永久素材 * @see com.foxinmy.weixin4j.model.MediaUploadResult * @see com.foxinmy.weixin4j.type.MediaType - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi * @throws WeixinException */ public MediaUploadResult uploadMedia(boolean isMaterial, InputStream is, @@ -172,7 +189,7 @@ public class WeixinProxy { * @throws WeixinException * @see 上传下载说明 - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi * @see {@link #downloadMedia(String)} */ public File downloadMediaFile(String mediaId, boolean isMaterial) @@ -189,7 +206,7 @@ public class WeixinProxy { * 是否永久素材 * @return 媒体文件下载结果 * @throws WeixinException - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi * @see com.foxinmy.weixin4j.model.MediaDownloadResult * @see 上传下载说明 @@ -210,7 +227,7 @@ public class WeixinProxy { * 图文列表 * @return 上传到微信服务器返回的媒体标识 * @throws WeixinException - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi * @see com.foxinmy.weixin4j.tuple.MpArticle * @see 上传永久媒体素材 @@ -229,7 +246,7 @@ public class WeixinProxy { * @throws WeixinException * @see {@link #downloadMedia(String, boolean)} * @see com.foxinmy.weixin4j.tuple.MpArticle - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi */ public List downloadArticle(String mediaId) throws WeixinException { @@ -247,7 +264,7 @@ public class WeixinProxy { * 图文列表 * @return 处理结果 * @throws WeixinException - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi * @see com.foxinmy.weixin4j.tuple.MpArticle * @see 更新永久图文素材 @@ -264,7 +281,7 @@ public class WeixinProxy { * 媒体素材的media_id * @return 处理结果 * @throws WeixinException - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi * @see 删除永久媒体素材 */ @@ -285,7 +302,7 @@ public class WeixinProxy { * @return 上传到微信服务器返回的媒体标识 * @see 上传永久媒体素材 - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi * @throws WeixinException */ public String uploadMaterialVideo(InputStream is, String title, @@ -301,7 +318,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.mp.model.MediaCounter * @see 获取素材总数 - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi */ public MediaCounter countMaterialMedia() throws WeixinException { return mediaApi.countMaterialMedia(); @@ -318,7 +335,7 @@ public class WeixinProxy { * 返回素材的数量,取值在1到20之间 * @return 媒体素材的记录对象 * @throws WeixinException - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi * @see com.foxinmy.weixin4j.mp.model.MediaRecord * @see com.foxinmy.weixin4j.type.MediaType * @see com.foxinmy.weixin4j.mp.model.MediaItem @@ -336,7 +353,7 @@ public class WeixinProxy { * @param mediaType * 媒体类型 * @return 素材列表 - * @see com.com.foxinmy.weixin4j.mp.api.MediaApi + * @see com.foxinmy.weixin4j.mp.api.MediaApi * @see {@link #listMaterialMedia(MediaType, int, int)} * @throws WeixinException */ @@ -636,7 +653,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.mp.api.MassApi * @see com.foxinmy.weixin4j.tuple.Video * @see com.foxinmy.weixin4j.tuple.MpVideo - * @see {@link com.com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} + * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} */ public String uploadMassVideo(Video video) throws WeixinException { return massApi.uploadVideo(video); @@ -718,7 +735,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.tuple.MassTuple * @see 根据openid群发 - * @see {@link com.com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} + * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} * @see {@link com.foxinmy.weixin4j.mp.api.UserApi#getUser(String)} */ public String massByOpenIds(MassTuple tuple, String... openIds) diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java index fe36a8c4..6a0a93ac 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java @@ -64,6 +64,34 @@ public class MediaApi extends MpApi { this.tokenHolder = tokenHolder; } + /** + * 上传图文消息内的图片获取URL + * 请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。 + * + * @param is + * 图片数据流 + * @param fileName + * 文件名 为空时将自动生成 + * @return 图片URL 可用于后续群发中,放置到图文消息中 + * @throws WeixinException + */ + public String uploadImage(InputStream is, String fileName) + throws WeixinException { + if (StringUtil.isBlank(fileName)) { + fileName = ObjectId.get().toHexString(); + } + if (StringUtil.isBlank(FileUtil.getFileExtension(fileName))) { + fileName = String.format("%s.jpg", fileName); + } + String image_upload_uri = getRequestUri("image_upload_uri"); + Token token = tokenHolder.getToken(); + WeixinResponse response = weixinClient.post(String.format( + image_upload_uri, token.getAccessToken()), + new FormBodyPart("media", new InputStreamBody(is, + ContentType.IMAGE_JPG.getMimeType(), fileName))); + return response.getAsJson().getString("url"); + } + /** * 上传媒体文件:图片(image)、语音(voice)、视频(video)和缩略图(thumb)
此接口只包含图片、语音、缩略图、视频(临时)四种媒体类型的上传 diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties index a2688195..5023b6a2 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties @@ -31,6 +31,8 @@ qr_ticket_uri={api_cgi_url}/qrcode/create?access_token=%s qr_image_uri={mp_base_url}/showqrcode?ticket=%s # \u4e0a\u4f20\u5a92\u4f53\u6587\u4ef6 media_upload_uri={file_base_url}/media/upload?access_token=%s&type=%s +# \u4e0a\u4f20\u56fe\u7247 +image_upload_uri={api_cgi_url}/media/uploadimg?access_token=%s # \u4e0b\u8f7d\u5a92\u4f53\u6587\u4ef6 meida_download_uri={file_base_url}/media/get?access_token=%s&media_id=%s # \u53d1\u9001\u5ba2\u670d\u6d88\u606f diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/datacube/ArticleSummary.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/datacube/ArticleSummary.java index fd611fd1..e7622638 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/datacube/ArticleSummary.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/datacube/ArticleSummary.java @@ -26,8 +26,9 @@ public class ArticleSummary extends ArticleDatacube1 { @JSONField(name = "ref_hour") private int refHour; /** - * 这里的msgid实际上是由msgid(图文消息id)和index(消息次序索引)组成, 例如12003_3, - * 其中12003是msgid,即一次群发的id消息的; 3为index,假设该次群发的图文消息共5个文章(因为可能为多图文), 3表示5个中的第3个 + * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)和index(消息次序索引)组成, + * 例如12003_3, 其中12003是msgid,即一次群发的消息的id; + * 3为index,假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个 */ private String msgid; /** diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/UserSourceType.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/UserSourceType.java index eabc0103..e5c68232 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/UserSourceType.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/UserSourceType.java @@ -10,7 +10,7 @@ package com.foxinmy.weixin4j.mp.type; * @see */ public enum UserSourceType { - OTHER("其它"), QRCODE("扫二维码"), CARDSHARE("名片分享"), SONUMBER("搜号码(即微信添加朋友页的搜索)"), SOMPACCOUNT( + OTHER("其它(包括带参数二维码)"), QRCODE("扫二维码"), CARDSHARE("名片分享"), SONUMBER("搜号码(即微信添加朋友页的搜索)"), SOMPACCOUNT( "查询微信公众帐号"), ARTICLEMENU("图文页右上角菜单"); private String desc;