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;