From 95519f9717ece52ed3d4b3fcea8321c1426d5fc9 Mon Sep 17 00:00:00 2001 From: "jy.hu" Date: Tue, 16 Dec 2014 16:14:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=96=B9=E6=B3=95=E4=B8=8A@s?= =?UTF-8?q?ee=E6=B3=A8=E8=A7=A3=E7=9A=84=E6=96=87=E6=A1=A3=E9=93=BE?= =?UTF-8?q?=E6=8E=A5,=E6=96=B0=E5=A2=9E=E7=BE=A4=E5=8F=91=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=8A=B6=E6=80=81=E6=9F=A5=E7=9C=8B=E3=80=81=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E6=8E=A5=E5=8F=A3,=E6=96=B0=E5=A2=9E=E5=A4=9A?= =?UTF-8?q?=E5=AE=A2=E6=9C=8D=E7=9A=84=E8=B4=A6=E5=8F=B7=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E3=80=81=E5=88=A0=E9=99=A4=E3=80=81=E6=9B=B4=E6=96=B0=E3=80=81?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A4=B4=E5=83=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +- .../foxinmy/weixin4j/http/HttpRequest.java | 20 +- .../com/foxinmy/weixin4j/http/JsonResult.java | 2 +- .../com/foxinmy/weixin4j/http/Response.java | 2 +- .../java/com/foxinmy/weixin4j/http/error.xml | 34 ++- .../com/foxinmy/weixin4j/model/Token.java | 2 +- .../foxinmy/weixin4j/msg/ImageMessage.java | 2 +- .../com/foxinmy/weixin4j/msg/LinkMessage.java | 2 +- .../foxinmy/weixin4j/msg/LocationMessage.java | 2 +- .../com/foxinmy/weixin4j/msg/TextMessage.java | 2 +- .../foxinmy/weixin4j/msg/VideoMessage.java | 2 +- .../foxinmy/weixin4j/msg/VoiceMessage.java | 2 +- .../weixin4j/msg/event/EventMessage.java | 2 +- .../msg/event/LocationEventMessage.java | 2 +- .../weixin4j/msg/event/MassEventMessage.java | 56 ++++- .../weixin4j/msg/event/ScanEventMessage.java | 2 +- .../msg/event/ScribeEventMessage.java | 2 +- .../event/TemplatesendjobfinishMessage.java | 2 +- .../msg/event/menu/MenuEventMessage.java | 2 +- .../event/menu/MenuLocationEventMessage.java | 5 +- .../msg/event/menu/MenuPhotoEventMessage.java | 5 +- .../msg/event/menu/MenuScanEventMessage.java | 2 +- .../foxinmy/weixin4j/msg/model/MpArticle.java | 2 - .../weixin4j/response/ResponseMessage.java | 2 +- .../weixin4j/token/FileTokenHolder.java | 2 +- .../weixin4j/token/RedisTokenHolder.java | 2 +- .../com/foxinmy/weixin4j/type/ButtonType.java | 2 +- .../com/foxinmy/weixin4j/type/EventType.java | 2 +- .../foxinmy/weixin4j/util/MessageUtil.java | 8 +- weixin4j-mp/README.md | 10 +- weixin4j-mp/weixin4j-mp-api/README.md | 10 +- .../com/foxinmy/weixin4j/mp/WeixinProxy.java | 237 +++++++++++++++--- .../foxinmy/weixin4j/mp/api/CustomApi.java | 127 +++++++++- .../com/foxinmy/weixin4j/mp/api/GroupApi.java | 17 +- .../foxinmy/weixin4j/mp/api/HelperApi.java | 6 +- .../com/foxinmy/weixin4j/mp/api/MassApi.java | 73 +++++- .../com/foxinmy/weixin4j/mp/api/MediaApi.java | 8 +- .../com/foxinmy/weixin4j/mp/api/MenuApi.java | 6 +- .../foxinmy/weixin4j/mp/api/NotifyApi.java | 4 +- .../com/foxinmy/weixin4j/mp/api/QrApi.java | 8 +- .../com/foxinmy/weixin4j/mp/api/TmplApi.java | 8 +- .../com/foxinmy/weixin4j/mp/api/UserApi.java | 42 +++- .../foxinmy/weixin4j/mp/api/weixin.properties | 19 +- .../weixin4j/mp/model/CustomRecord.java | 2 - .../foxinmy/weixin4j/mp/model/Following.java | 3 - .../com/foxinmy/weixin4j/mp/model/Group.java | 2 - .../foxinmy/weixin4j/mp/model/KfAccount.java | 10 + .../weixin4j/mp/model/QRParameter.java | 2 - .../foxinmy/weixin4j/mp/model/SemResult.java | 2 +- .../com/foxinmy/weixin4j/mp/model/User.java | 4 +- .../weixin4j/mp/test/msg/CustomTest.java | 30 +++ .../weixin4j/mp/test/msg/MassMsgTest.java | 26 +- .../mp/action/event/MassSendAction.java | 2 +- .../mp/server/WeixinMessageDecoder.java | 2 +- .../mp/server/WeixinMessageEncoder.java | 2 +- .../qy/action/event/MassSendAction.java | 2 +- 56 files changed, 696 insertions(+), 156 deletions(-) diff --git a/README.md b/README.md index 4e0bf105..6d088d2b 100644 --- a/README.md +++ b/README.md @@ -176,13 +176,21 @@ netty的代码没有放到maven中心仓库,也没什么意义,因为最终需 * 2014-12-15 - + 修改某些函数在注释上的参数描述错误 + + **weixin4j-mp**: 修改某些函数在注释上的参数描述错误 - + 调整PayUtil类中`createPayJsRequestJsonV3`的形参位置,`notify_url`与`spbill_create_ip`对换与V2保持一致 + + **weixin4j-mp**: 调整PayUtil类中`createPayJsRequestJsonV3`的形参位置,`notify_url`与`spbill_create_ip`对换与V2保持一致 - + 在PayUtil类中新增paySign重载版本函数,避免在某些地方产生歧义造成签名错误(appid,appKey) + + **weixin4j-mp**: 在PayUtil类中新增paySign重载版本函数,避免在某些地方产生歧义造成签名错误(appid,appKey) - + 修正V3版本JSAPI接口支付签名错误bug(坑) + + **weixin4j-mp**: 修正V3版本JSAPI接口支付签名错误bug(坑) + +* 2014-12-16 + + + **weixin4j-mp**: 调整方法上@see注解的文档说明接口url + + + **weixin4j-mp**: 新增群发消息预览、状态查询接口 + + + **weixin4j-mp**: 新增多客服添加账号、更新账号、上传头像、删除账号接口 接下来 ------ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java index 43bf1316..2efe3eea 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java @@ -196,6 +196,18 @@ public class HttpRequest { if (contentType.getValue().contains( ContentType.TEXT_HTML.getMimeType())) { response.setText(new String(data, "gbk")); + try { + checkJson(response); + return response; + } catch (JSONException e) { + ; + } + try { + checkXml(response); + return response; + } catch (CannotResolveClassException ex) { + ; + } throw new WeixinException(response.getAsString()); } else if (contentType.getValue().contains( ContentType.APPLICATION_JSON.getMimeType())) { @@ -211,7 +223,13 @@ public class HttpRequest { } catch (JSONException e) { ; } - checkXml(response); + try { + checkXml(response); + return response; + } catch (CannotResolveClassException ex) { + ; + } + throw new WeixinException(response.getAsString()); } } catch (IOException e) { throw new WeixinException("-1", e.getMessage()); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java index 50388e61..b3db5d73 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java @@ -12,7 +12,7 @@ import com.alibaba.fastjson.annotation.JSONField; * @date 2014年9月24日 * @since JDK 1.7 * @see 公众平台全局返回码说明 + * href="http://mp.weixin.qq.com/wiki/17/fa4e1434e57290788bde25603fa2fcbd.html">公众平台全局返回码说明 * @see 企业号全局返回码说明 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java index 440b7123..2b50792a 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java @@ -68,7 +68,7 @@ public class Response { /** * 全局返回码 {"errcode":45009,"errmsg":"api freq out of limit"} * * @return diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/error.xml b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/error.xml index a52d7985..51b39be7 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/error.xml +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/error.xml @@ -1,5 +1,6 @@ - + + 0 @@ -577,11 +578,41 @@ 48002 Api禁用 + + + 61451 + 参数错误(invalid parameter) + + + 61452 + 无效客服账号(invalid kf_account) + + + 61453 + 账号已存在(kf_account exsited) + + + 61454 + 账号名长度超过限制(前缀10个英文字符)(invalid kf_acount length) + + + 61455 + 账号名包含非法字符(英文+数字)(illegal character in kf_account) + + + 61456 + 账号个数超过限制(10个客服账号)(kf_account count exceeded) + + + 61457 + 无效头像文件类型(invalid file type) + 50001 api/redirect_uri unauthorized 接口未授权 + 50002 员工不在权限范围 @@ -598,7 +629,6 @@ 50005 企业已禁用 - 60001 部门长度不符合限制 diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java index 7c785fd4..12456300 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java @@ -14,7 +14,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月5日 * @since JDK 1.7 * @see 微信公众平台获取token + * href="http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html">微信公众平台获取token * @see 微信企业号的主动模式 */ @XStreamAlias("app-token") diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/ImageMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/ImageMessage.java index 660416d8..d556a35c 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/ImageMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/ImageMessage.java @@ -12,7 +12,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月6日 * @since JDK 1.7 * @see 订阅号、服务号的图片消息 + * href="http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html#.E5.9B.BE.E7.89.87.E6.B6.88.E6.81.AF">订阅号、服务号的图片消息 * @see 企业号的图片消息 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LinkMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LinkMessage.java index 1d6e5abb..a94fb3d9 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LinkMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LinkMessage.java @@ -12,7 +12,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月6日 * @since JDK 1.7 * @see 订阅号、服务号的链接消息 + * href="http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html#.E9.93.BE.E6.8E.A5.E6.B6.88.E6.81.AF">订阅号、服务号的链接消息 */ public class LinkMessage extends BaseMsg { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LocationMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LocationMessage.java index 8bb2e8a6..8b7dfcbd 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LocationMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LocationMessage.java @@ -12,7 +12,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月6日 * @since JDK 1.7 * @see 订阅号、服务号的地理位置消息 + * href="http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html#.E5.9C.B0.E7.90.86.E4.BD.8D.E7.BD.AE.E6.B6.88.E6.81.AF">订阅号、服务号的地理位置消息 * @see 企业号的地理位置消息 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/TextMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/TextMessage.java index b3dc6460..5471cbe5 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/TextMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/TextMessage.java @@ -12,7 +12,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月6日 * @since JDK 1.7 * @see 订阅号、服务号的文本消息 + * href="http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html#.E6.96.87.E6.9C.AC.E6.B6.88.E6.81.AF">订阅号、服务号的文本消息 * @see 企业号的文本消息 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VideoMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VideoMessage.java index f0dc27ab..8a6fabbe 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VideoMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VideoMessage.java @@ -12,7 +12,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月6日 * @since JDK 1.7 * @see 订阅号、服务号的视频消息 + * href="http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html#.E8.A7.86.E9.A2.91.E6.B6.88.E6.81.AF">订阅号、服务号的视频消息 * @see 企业号的视频消息 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VoiceMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VoiceMessage.java index 3dd82b80..047e51ec 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VoiceMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VoiceMessage.java @@ -15,7 +15,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月6日 * @since JDK 1.7 * @see 订阅号、服务号的语音消息 + * href="http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html#.E8.AF.AD.E9.9F.B3.E6.B6.88.E6.81.AF">订阅号、服务号的语音消息 * @see 企业号的语音消息 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EventMessage.java index 8c2e980a..419d6d4c 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EventMessage.java @@ -13,7 +13,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月6日 * @since JDK 1.7 * @see 订阅号、服务号的事件推送 + * href="http://mp.weixin.qq.com/wiki/9/981d772286d10d153a3dc4286c1ee5b5.html">订阅号、服务号的事件推送 * @see 企业号的事件消息 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/LocationEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/LocationEventMessage.java index 440337ad..f4b06b0e 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/LocationEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/LocationEventMessage.java @@ -11,7 +11,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月6日 * @since JDK 1.7 * @see 订阅号、服务号的上报地理位置事件 + * href="http://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html#.E4.B8.8A.E6.8A.A5.E5.9C.B0.E7.90.86.E4.BD.8D.E7.BD.AE.E4.BA.8B.E4.BB.B6">订阅号、服务号的上报地理位置事件 * @see 企业号的上报地理位置事件 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/MassEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/MassEventMessage.java index 7212d4f3..0499e745 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/MassEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/MassEventMessage.java @@ -1,7 +1,11 @@ package com.foxinmy.weixin4j.msg.event; +import java.util.HashMap; +import java.util.Map; + import com.foxinmy.weixin4j.type.EventType; import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamOmitField; /** * 群发消息事件推送 @@ -11,14 +15,14 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月27日 * @since JDK 1.7 * @see 群发回调 + * href="http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html#.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81.E7.BE.A4.E5.8F.91.E7.BB.93.E6.9E.9C">群发回调 */ public class MassEventMessage extends EventMessage { private static final long serialVersionUID = -1660543255873723895L; public MassEventMessage() { - super(EventType.massendjobfinish); + super(EventType.masssendjobfinish); } @XStreamAlias("Status") @@ -32,10 +36,58 @@ public class MassEventMessage extends EventMessage { @XStreamAlias("ErrorCount") private int errorCount; + @XStreamOmitField + private final static Map statusMap; + static { + statusMap = new HashMap(); + statusMap.put("sendsuccess", "发送成功"); + statusMap.put("send_success", "发送成功"); + statusMap.put("success", "发送成功"); + statusMap.put("send success", "发送成功"); + statusMap.put("sendfail", "发送失败"); + statusMap.put("send_fail", "发送失败"); + statusMap.put("fail", "发送失败"); + statusMap.put("send fail", "发送失败"); + statusMap.put("err(10001)", "涉嫌广告"); + statusMap.put("err(20001)", "涉嫌政治"); + statusMap.put("err(20004)", "涉嫌社会"); + statusMap.put("err(20006)", "涉嫌违法犯罪"); + statusMap.put("err(20008)", "涉嫌欺诈"); + statusMap.put("err(20013)", "涉嫌版权"); + statusMap.put("err(22000)", "涉嫌互推(互相宣传)"); + statusMap.put("err(21000)", "涉嫌其他"); + } + public String getStatus() { return status; } + /** + * 发送状态描述
+ * err(10001,涉嫌广告) err(20001,涉嫌政治) err(20004,涉嫌社会)
+ * err(20002,涉嫌色情) err(20006,涉嫌违法犯罪) err(20008,涉嫌欺诈)
+ * err(20013,涉嫌版权) err(22000,涉嫌互推(互相宣传) err(21000,涉嫌其他) + * + * @param status + * @return 中文描述 + */ + public String getStatusDesc() { + return statusMap.get(status.toLowerCase()); + } + + /** + * 发送状态描述
+ * err(10001,涉嫌广告) err(20001,涉嫌政治) err(20004,涉嫌社会)
+ * err(20002,涉嫌色情) err(20006,涉嫌违法犯罪) err(20008,涉嫌欺诈)
+ * err(20013,涉嫌版权) err(22000,涉嫌互推(互相宣传) err(21000,涉嫌其他) + * + * @param status + * @return 中文描述 + */ + public static String getStatusDesc(String status) { + return statusMap.get(status.toLowerCase()); + } + public int getTotalCount() { return totalCount; } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScanEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScanEventMessage.java index db272e9a..b4fd1238 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScanEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScanEventMessage.java @@ -11,7 +11,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月6日 * @since JDK 1.7 * @see 扫描二维码事件 + * href="http://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html#.E6.89.AB.E6.8F.8F.E5.B8.A6.E5.8F.82.E6.95.B0.E4.BA.8C.E7.BB.B4.E7.A0.81.E4.BA.8B.E4.BB.B6">扫描二维码事件 */ public class ScanEventMessage extends EventMessage { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScribeEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScribeEventMessage.java index 08a9f793..b913ce34 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScribeEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScribeEventMessage.java @@ -10,7 +10,7 @@ import com.foxinmy.weixin4j.type.EventType; * @date 2014年4月6日 * @since JDK 1.7 * @see 订阅号、服务号的关注/取消关注事件 + * href="http://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html#.E5.85.B3.E6.B3.A8.2F.E5.8F.96.E6.B6.88.E5.85.B3.E6.B3.A8.E4.BA.8B.E4.BB.B6">订阅号、服务号的关注/取消关注事件 * @see 企业号的关注/取消关注 diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java index 056efd34..08f6314e 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java @@ -11,7 +11,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年9月19日 * @since JDK 1.7 * @see 模板消息事件推送 + * href="http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html#.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81">模板消息事件推送 */ public class TemplatesendjobfinishMessage extends EventMessage { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java index 1eaffaa4..cacb2acf 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java @@ -12,7 +12,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年4月6日 * @since JDK 1.7 * @see 订阅号、服务号的菜单事件 + * href="http://mp.weixin.qq.com/wiki/9/981d772286d10d153a3dc4286c1ee5b5.html#.E7.82.B9.E5.87.BB.E8.8F.9C.E5.8D.95.E6.8B.89.E5.8F.96.E6.B6.88.E6.81.AF.E6.97.B6.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81">订阅号、服务号的菜单事件 * @see 企业号的菜单事件 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java index 91902349..c8eda0b3 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java @@ -11,8 +11,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年9月30日 * @since JDK 1.7 * @see 订阅号、服务号的弹出地理位置选择事件推送 - * @see 企业号的弹出地理位置选择事件推送 + * href="http://mp.weixin.qq.com/wiki/9/981d772286d10d153a3dc4286c1ee5b5.html#location_select.EF.BC.9A.E5.BC.B9.E5.87.BA.E5.9C.B0.E7.90.86.E4.BD.8D.E7.BD.AE.E9.80.89.E6.8B.A9.E5.99.A8.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81">订阅号、服务号的弹出地理位置选择事件推送 + * @see 企业号的弹出地理位置选择事件推送 */ public class MenuLocationEventMessage extends MenuEventMessage { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java index 112013fd..7b2daa0d 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java @@ -12,8 +12,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年9月30日 * @since JDK 1.7 * @see 订阅号、服务号的系统发图的事件推送 - * @see 企业号的系统发图的事件推送 + * href="http://mp.weixin.qq.com/wiki/9/981d772286d10d153a3dc4286c1ee5b5.html#pic_sysphoto.EF.BC.9A.E5.BC.B9.E5.87.BA.E7.B3.BB.E7.BB.9F.E6.8B.8D.E7.85.A7.E5.8F.91.E5.9B.BE.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81">订阅号、服务号的系统发图的事件推送 + * @see 企业号的系统发图的事件推送 */ public class MenuPhotoEventMessage extends MenuEventMessage { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java index 6382b29d..7ada3e3b 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java @@ -10,7 +10,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @date 2014年9月30日 * @since JDK 1.7 * @see 订阅号、服务号的扫码推事件 + * href="http://mp.weixin.qq.com/wiki/9/981d772286d10d153a3dc4286c1ee5b5.html#scancode_push.EF.BC.9A.E6.89.AB.E7.A0.81.E6.8E.A8.E4.BA.8B.E4.BB.B6.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81">订阅号、服务号的扫码推事件 * @see 企业号的的扫码推事件 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpArticle.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpArticle.java index e282952f..c2c0c87e 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpArticle.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpArticle.java @@ -10,8 +10,6 @@ import com.alibaba.fastjson.annotation.JSONField; * @author jy.hu * @date 2014年4月26日 * @since JDK 1.7 - * @see 群发消息描述 */ public class MpArticle implements Serializable { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java index 783c86ab..077a1acb 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java @@ -30,7 +30,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @see com.foxinmy.weixin4j.msg.model.News * @see com.foxinmy.weixin4j.msg.model.Trans * @see 订阅号、服务号的被动响应消息 * @see 企业号的被动响应消息 diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java index dad31b48..d0db8c90 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java @@ -25,7 +25,7 @@ import com.foxinmy.weixin4j.xml.XStream; * @date 2014年9月27日 * @since JDK 1.7 * @see 微信公众平台获取token说明 + * href="http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html">微信公众平台获取token说明 * @see 微信企业号获取token说明 * @see com.foxinmy.weixin4j.model.Token diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java index 36652f30..ca26c599 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java @@ -23,7 +23,7 @@ import com.foxinmy.weixin4j.type.AccountType; * @date 2014年9月27日 * @since JDK 1.7 * @see 微信公众平台获取token说明 + * href="http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html">微信公众平台获取token说明 * @see 微信企业号获取token说明 diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/ButtonType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/ButtonType.java index fa3ac00f..dcd6e8ba 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/ButtonType.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/ButtonType.java @@ -11,7 +11,7 @@ package com.foxinmy.weixin4j.type; * @date 2014年9月30日 * @since JDK 1.7 * @see 按钮类型 + * href="http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html">按钮类型 */ public enum ButtonType { /** diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java index bc85ce90..f648b3a2 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java @@ -29,7 +29,7 @@ public enum EventType { MenuPhotoEventMessage.class), pic_weixin( MenuPhotoEventMessage.class), location_select( MenuLocationEventMessage.class), click(MenuEventMessage.class), location( - LocationEventMessage.class), massendjobfinish( + LocationEventMessage.class),masssendjobfinish( MassEventMessage.class), templatesendjobfinish( TemplatesendjobfinishMessage.class); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java index df850c57..794504e9 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java @@ -41,7 +41,7 @@ public class MessageUtil { * @return 开发者通过检验signature对请求进行相关校验。若确认此次GET请求来自微信服务器 * 请原样返回echostr参数内容,则接入生效 成为开发者成功,否则接入失败 * @see 接入指南 + * href="http://mp.weixin.qq.com/wiki/0/61c3a8b9d50ac74f18bdf2e54ddfc4e0.html">接入指南 */ public static String signature(String... para) { Arrays.sort(para); @@ -173,11 +173,11 @@ public class MessageUtil { * @return 消息对象 * @throws DocumentException * @see 验证消息的合法性 + * href="http://mp.weixin.qq.com/wiki/4/2ccadaef44fe1e4b0322355c2312bfa8.html">验证消息的合法性 * @see 普通消息 + * href="http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html">普通消息 * @see 事件触发 + * href="http://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html">事件触发 * @see com.foxinmy.weixin4j.type.MessageType * @see com.feican.weixin.msg.BaeMessage * @see com.foxinmy.weixin4j.msg.TextMessage diff --git a/weixin4j-mp/README.md b/weixin4j-mp/README.md index 9f5bddbb..72373214 100644 --- a/weixin4j-mp/README.md +++ b/weixin4j-mp/README.md @@ -142,4 +142,12 @@ weixin4j-mp * 2014-12-12 - + **weixin4j-mp-api**: 新增设置`模板消息所处行业`、`获取模板消息ID`接口 \ No newline at end of file + + **weixin4j-mp-api**: 新增设置`模板消息所处行业`、`获取模板消息ID`接口 + +* 2014-12-16 + + + **weixin4j-mp-api**: 调整方法上@see注解的文档说明接口url + + + **weixin4j-mp-api**: 新增群发消息预览、状态查询接口 + + + **weixin4j-mp-api**: 新增多客服添加账号、更新账号、上传头像、删除账号接口 \ No newline at end of file diff --git a/weixin4j-mp/weixin4j-mp-api/README.md b/weixin4j-mp/weixin4j-mp-api/README.md index 27d76674..7c881498 100644 --- a/weixin4j-mp/weixin4j-mp-api/README.md +++ b/weixin4j-mp/weixin4j-mp-api/README.md @@ -123,4 +123,12 @@ weixin.properties说明 * 2014-12-12 - + 新增设置`模板消息所处行业`、`获取模板消息ID`接口 \ No newline at end of file + + 新增设置`模板消息所处行业`、`获取模板消息ID`接口 + +* 2014-12-16 + + + 调整方法上@see注解的文档说明接口url + + + 新增群发消息预览、状态查询接口 + + + 新增多客服添加账号、更新账号、上传头像、删除账号接口 \ No newline at end of file diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java index 9ec034b5..80d5b886 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java @@ -40,6 +40,7 @@ import com.foxinmy.weixin4j.mp.payment.v2.Order; import com.foxinmy.weixin4j.mp.type.BillType; import com.foxinmy.weixin4j.mp.type.IdQuery; import com.foxinmy.weixin4j.mp.type.IndustryType; +import com.foxinmy.weixin4j.mp.type.Lang; import com.foxinmy.weixin4j.msg.model.Base; import com.foxinmy.weixin4j.msg.model.MpArticle; import com.foxinmy.weixin4j.msg.model.Video; @@ -92,7 +93,8 @@ public class WeixinProxy { /** * WeixinAccount对象 * - * @param weixinAccount 微信账户 + * @param weixinAccount + * 微信账户 */ public WeixinProxy(WeixinMpAccount weixinAccount) { this(new FileTokenHolder(weixinAccount)); @@ -164,7 +166,7 @@ public class WeixinProxy { * 媒体类型 * @return 上传到微信服务器返回的媒体标识 * @see 上传下载说明 + * href="http://mp.weixin.qq.com/wiki/10/78b15308b053286e2a66b33f0f0f5fb6.html">上传下载说明 * @see com.foxinmy.weixin4j.mp.api.MediaApi * @throws WeixinException */ @@ -187,7 +189,7 @@ public class WeixinProxy { * @throws WeixinException * @throws IOException * @see 上传下载说明 + * href="http://mp.weixin.qq.com/wiki/10/78b15308b053286e2a66b33f0f0f5fb6.html">上传下载说明 * @see com.foxinmy.weixin4j.type.MediaType * @see com.foxinmy.weixin4j.mp.api.MediaApi * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#downloadMedia(String)} @@ -205,6 +207,8 @@ public class WeixinProxy { * @return 二进制数据包 * @throws WeixinException * @see com.foxinmy.weixin4j.mp.api.MediaApi + * @see 上传下载说明 */ public byte[] downloadMedia(String mediaId) throws WeixinException { return mediaApi.downloadMedia(mediaId); @@ -217,7 +221,7 @@ public class WeixinProxy { * 客服消息对象 * @throws WeixinException * @see 发送客服消息 + * href="http://mp.weixin.qq.com/wiki/7/12a5a320ae96fecdf0e15cb06123de9f.html">发送客服消息 * @see com.foxinmy.weixin4j.msg.model.Text * @see com.foxinmy.weixin4j.msg.model.Image * @see com.foxinmy.weixin4j.msg.model.Voice @@ -247,7 +251,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.mp.api.CustomApi * @see 查询客服聊天记录 * @see 查询客服聊天记录 + * href="http://mp.weixin.qq.com/wiki/19/7c129ec71ddfa60923ea9334557e8b23.html">查询客服聊天记录 * @throws WeixinException */ public List getCustomRecord(String openId, Date starttime, @@ -266,7 +270,11 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.mp.model.KfAccount * @see com.foxinmy.weixin4j.mp.api.CustomApi * @see 获取客服基本信息 + * @see 获取客服基本信息 * @see 获取在线客服接待信息 + * @see 获取在线客服接待信息 * @throws WeixinException */ public List getKfAccountList(boolean isOnline) @@ -274,6 +282,90 @@ public class WeixinProxy { return customApi.getKfAccountList(isOnline); } + /** + * 新增客服账号 + * + * @param id + * 完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符。如果没有公众号微信号, + * 请前往微信公众平台设置。 + * @param name + * 客服昵称,最长6个汉字或12个英文字符 + * @param pwd + * 客服账号登录密码 + * @return 处理结果 + * @throws WeixinException + * @see com.foxinmy.weixin4j.mp.api.CustomApi + * @see 客服管理接口返回码 + * @see 新增客服账号 + */ + public JsonResult addAccount(String id, String name, String pwd) + throws WeixinException { + return customApi.addAccount(id, name, pwd); + } + + /** + * 更新客服账号 + * + * @param id + * 完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符。如果没有公众号微信号, + * 请前往微信公众平台设置。 + * @param name + * 客服昵称,最长6个汉字或12个英文字符 + * @param pwd + * 客服账号登录密码 + * @return 处理结果 + * @throws WeixinException + * @see com.foxinmy.weixin4j.mp.api.CustomApi + * @see 客服管理接口返回码 + * @see 新增客服账号 + */ + public JsonResult updateAccount(String id, String name, String pwd) + throws WeixinException { + return customApi.updateAccount(id, name, pwd); + } + + /** + * 上传客服头像 + * + * @param id + * 完整客服账号,格式为:账号前缀@公众号微信号 + * @param headimg + * 头像图片文件必须是jpg格式,推荐使用640*640大小的图片以达到最佳效果 + * @return 处理结果 + * @throws WeixinException + * @throws IOException + * @see com.foxinmy.weixin4j.mp.api.CustomApi + * @see 客服管理接口返回码 + * @see 上传客服头像 + */ + public JsonResult uploadAccountHeadimg(String id, File headimg) + throws WeixinException, IOException { + return customApi.uploadAccountHeadimg(id, headimg); + } + + /** + * 删除客服账号 + * + * @param id + * 完整客服账号,格式为:账号前缀@公众号微信号 + * @return 处理结果 + * @see com.foxinmy.weixin4j.mp.api.CustomApi + * @throws WeixinException + * @see 客服管理接口返回码 + * @see 删除客服账号 + */ + public JsonResult deleteAccount(String id) throws WeixinException { + return customApi.deleteAccount(id); + } + /** * 上传图文消息,一个图文消息支持1到10条图文 * @@ -282,9 +374,7 @@ public class WeixinProxy { * @return 媒体ID * @throws WeixinException * @see 高级群发 - * @see 上传图文消息 + * href="http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html#.E4.B8.8A.E4.BC.A0.E5.9B.BE.E6.96.87.E6.B6.88.E6.81.AF.E7.B4.A0.E6.9D.90.E3.80.90.E8.AE.A2.E9.98.85.E5.8F.B7.E4.B8.8E.E6.9C.8D.E5.8A.A1.E5.8F.B7.E8.AE.A4.E8.AF.81.E5.90.8E.E5.9D.87.E5.8F.AF.E7.94.A8.E3.80.91">上传图文素材 * @see com.foxinmy.weixin4j.msg.model.MpArticle * @see com.foxinmy.weixin4j.mp.api.MassApi */ @@ -302,7 +392,7 @@ public class WeixinProxy { * @throws WeixinException * * @see 高级群发 + * href="http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html">高级群发 * @see com.foxinmy.weixin4j.mp.api.MassApi * @see com.foxinmy.weixin4j.msg.model.Video * @see com.foxinmy.weixin4j.msg.model.MpVideo @@ -328,6 +418,8 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.msg.model.Voice * @see com.foxinmy.weixin4j.msg.model.MpVideo * @see com.foxinmy.weixin4j.msg.model.MpNews + * @see 根据分组群发 * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} * @see {@link com.foxinmy.weixin4j.mp.api.GroupApi#getGroupByOpenId(String)} * @see {@link com.foxinmy.weixin4j.mp.api.GroupApi#getGroups()} @@ -345,6 +437,8 @@ public class WeixinProxy { * 分组ID * @return 群发后的消息ID * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByGroupId(Base,int)} + * @see 根据分组群发 * @throws WeixinException */ public String massArticleByGroupId(List articles, int groupId) @@ -368,6 +462,8 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.msg.model.Voice * @see com.foxinmy.weixin4j.msg.model.MpVideo * @see com.foxinmy.weixin4j.msg.model.MpNews + * @see 根据openid群发 * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} * @see {@link com.foxinmy.weixin4j.mp.api.UserApi#getUser(String)} */ @@ -384,6 +480,8 @@ public class WeixinProxy { * @param openIds * openId列表 * @return 群发后的消息ID + * @see 根据openid群发 * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(Base,String...)} * @throws WeixinException */ @@ -402,25 +500,59 @@ public class WeixinProxy { * 发送出去的消息ID * @throws WeixinException * @see 删除群发 + * href="http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html#.E5.88.A0.E9.99.A4.E7.BE.A4.E5.8F.91.E3.80.90.E8.AE.A2.E9.98.85.E5.8F.B7.E4.B8.8E.E6.9C.8D.E5.8A.A1.E5.8F.B7.E8.AE.A4.E8.AF.81.E5.90.8E.E5.9D.87.E5.8F.AF.E7.94.A8.E3.80.91">删除群发 * @see com.foxinmy.weixin4j.mp.api.MassApi * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByGroupId(Base, int)} - * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(Base, String...) - + * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(Base, String...) */ public JsonResult deleteMassNews(String msgid) throws WeixinException { return massApi.deleteMassNews(msgid); } /** - * 获取token + * 预览群发消息
+ * 开发者可通过该接口发送消息给指定用户,在手机端查看消息的样式和排版 + * + * @param openId + * 接收用户的ID + * @param box + * 消息体 + * @return 处理结果 + * @throws WeixinException + * @see com.foxinmy.weixin4j.mp.api.MassApi + * @see 预览群发消息 + */ + public JsonResult previewMassNews(String openId, Base box) + throws WeixinException { + return massApi.previewMassNews(openId, box); + } + + /** + * 查询群发发送状态 + * + * @param msgId + * 消息ID + * @return 消息发送状态 + * @throws WeixinException + * @see com.foxinmy.weixin4j.mp.api.MassApi + * @see {@link com.foxinmy.weixin4j.msg.event.MassEventMessage#getStatusDesc(String)} + * @see 查询群发状态 + */ + public String getMassNews(String msgId) throws WeixinException { + return massApi.getMassNews(msgId); + } + + /** + * oauth授权code换取token * * @param code * 用户授权后返回的code * @return token对象 * @throws WeixinException * @see 获取用户token + * href="http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html">获取用户token * @see com.foxinmy.weixin4j.mp.model.OauthToken * @see com.foxinmy.weixin4j.mp.api.UserApi */ @@ -429,14 +561,14 @@ public class WeixinProxy { } /** - * 获取用户信息 + * ouath获取用户信息 * * @param token * 授权票据 * @return 用户对象 * @throws WeixinException * @see 拉取用户信息 + * href="http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html">拉取用户信息 * @see com.foxinmy.weixin4j.mp.model.User * @see com.foxinmy.weixin4j.mp.model.OauthToken * @see com.foxinmy.weixin4j.mp.api.UserApi @@ -445,6 +577,23 @@ public class WeixinProxy { return userApi.getUser(token); } + /** + * 获取用户信息 + * + * @param openId + * 用户对应的ID + * @return 用户对象 + * @throws WeixinException + * @see 获取用户信息 + * @see com.foxinmy.weixin4j.mp.model.User + * @see com.foxinmy.weixin4j.mp.api.UserApi + * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#getUser(String,Lang)} + */ + public User getUser(String openId) throws WeixinException { + return userApi.getUser(openId); + } + /** * 获取用户信息 *

@@ -454,26 +603,29 @@ public class WeixinProxy { * * @param openId * 用户对应的ID + * @param lang + * 国家地区语言版本 * @return 用户对象 * @throws WeixinException * @see 获取用户信息 + * href="http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html">获取用户信息 + * @see com.foxinmy.weixin4j.mp.type.Lang * @see com.foxinmy.weixin4j.mp.model.User * @see com.foxinmy.weixin4j.mp.api.UserApi */ - public User getUser(String openId) throws WeixinException { - return userApi.getUser(openId); + public User getUser(String openId, Lang lang) throws WeixinException { + return userApi.getUser(openId, lang); } /** * 获取用户一定数量(10000)的关注者列表 * * @param nextOpenId - * 下一次拉取数据的openid + * 第一个拉取的OPENID,不填默认从头开始拉取 * @return 关注信息 * @throws WeixinException * @see 获取关注者列表 + * href="http://mp.weixin.qq.com/wiki/3/17e6919a39c1c53555185907acf70093.html">获取关注者列表 * @see com.foxinmy.weixin4j.mp.model.Following * @see com.foxinmy.weixin4j.mp.api.UserApi */ @@ -491,7 +643,7 @@ public class WeixinProxy { * @return 用户对象集合 * @throws WeixinException * @see 获取关注者列表 + * href="http://mp.weixin.qq.com/wiki/3/17e6919a39c1c53555185907acf70093.html">获取关注者列表 * @see com.foxinmy.weixin4j.mp.model.Following * @see com.foxinmy.weixin4j.mp.api.UserApi * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#getFollowing(String)} @@ -509,7 +661,7 @@ public class WeixinProxy { * 备注名 * @throws WeixinException * @see 设置用户备注名 + * href="http://mp.weixin.qq.com/wiki/10/bf8f4e3074e1cf91eb6518b6d08d223e.html">设置用户备注名 * @see com.foxinmy.weixin4j.mp.api.UserApi */ public JsonResult remarkUserName(String openId, String remark) @@ -525,7 +677,7 @@ public class WeixinProxy { * @return group对象 * @throws WeixinException * @see 创建分组 + * href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E5.88.9B.E5.BB.BA.E5.88.86.E7.BB.84">创建分组 * @see com.foxinmy.weixin4j.mp.model.Group * @see com.foxinmy.weixin4j.mp.model.Group#toCreateJson() * @see com.foxinmy.weixin4j.mp.api.GroupApi @@ -540,7 +692,7 @@ public class WeixinProxy { * @return 组集合 * @throws WeixinException * @see 查询所有分组 + * href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E6.9F.A5.E8.AF.A2.E6.89.80.E6.9C.89.E5.88.86.E7.BB.84">查询所有分组 * @see com.foxinmy.weixin4j.mp.model.Group * @see com.foxinmy.weixin4j.mp.api.GroupApi */ @@ -556,7 +708,7 @@ public class WeixinProxy { * @return 组ID * @throws WeixinException * @see 查询用户所在分组 + * href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E6.9F.A5.E8.AF.A2.E7.94.A8.E6.88.B7.E6.89.80.E5.9C.A8.E5.88.86.E7.BB.84">查询用户所在分组 * @see com.foxinmy.weixin4j.mp.model.Group * @see com.foxinmy.weixin4j.mp.api.GroupApi */ @@ -573,7 +725,7 @@ public class WeixinProxy { * 组名称 * @throws WeixinException * @see 修改分组名 + * href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E4.BF.AE.E6.94.B9.E5.88.86.E7.BB.84.E5.90.8D">修改分组名 * @see com.foxinmy.weixin4j.mp.model.Group * @see com.foxinmy.weixin4j.mp.model.Group#toModifyJson() * @see com.foxinmy.weixin4j.mp.api.GroupApi @@ -592,7 +744,7 @@ public class WeixinProxy { * 组ID * @throws WeixinException * @see 移动分组 + * href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E7.A7.BB.E5.8A.A8.E7.94.A8.E6.88.B7.E5.88.86.E7.BB.84">移动分组 * @see com.foxinmy.weixin4j.mp.model.Group * @see com.foxinmy.weixin4j.mp.api.GroupApi */ @@ -607,7 +759,7 @@ public class WeixinProxy { * @param btnList * @throws WeixinException * @see 创建自定义菜单 + * href="http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html">创建自定义菜单 * @see com.foxinmy.weixin4j.model.Button * @see com.foxinmy.weixin4j.type.ButtonType * @see com.foxinmy.weixin4j.mp.api.MenuApi @@ -622,7 +774,7 @@ public class WeixinProxy { * @return 菜单集合 * @throws WeixinException * @see 查询菜单 + * href="http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html">查询菜单 * @see com.foxinmy.weixin4j.model.Button * @see com.foxinmy.weixin4j.mp.api.MenuApi */ @@ -635,7 +787,7 @@ public class WeixinProxy { * * @throws WeixinException * @see 删除菜单 + * href="http://mp.weixin.qq.com/wiki/16/8ed41ba931e4845844ad6d1eeb8060c8.html">删除菜单 * @see com.foxinmy.weixin4j.model.Button * @see com.foxinmy.weixin4j.mp.api.MenuApi */ @@ -650,6 +802,8 @@ public class WeixinProxy { * @return byte数据包 * @throws WeixinException * @see com.foxinmy.weixin4j.mp.api.QrApi + * @see 生成二维码 */ public byte[] getQRData(QRParameter parameter) throws WeixinException { return qrApi.getQRData(parameter); @@ -666,6 +820,8 @@ public class WeixinProxy { * @throws WeixinException * @see com.foxinmy.weixin4j.mp.api.QrApi * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#getQR(QRParameter)} + * @see 生成二维码 */ public byte[] getQRData(int sceneId, int expireSeconds) throws WeixinException { @@ -684,7 +840,7 @@ public class WeixinProxy { * @throws WeixinException * @throws IOException * @see 二维码 + * href="mp.weixin.qq.com/wiki/18/28fc21e7ed87bec960651f0ce873ef8a.html">二维码 * @see com.foxinmy.weixin4j.mp.model.QRParameter * @see com.foxinmy.weixin4j.mp.api.QrApi */ @@ -702,10 +858,8 @@ public class WeixinProxy { * @throws WeixinException * @see com.foxinmy.weixin4j.mp.type.IndustryType * @see com.foxinmy.weixin4j.mp.api.TmplApi - * @see 设置所处行业 + * @see 设置所处行业 */ public JsonResult setTmplIndustry(IndustryType... industryType) throws WeixinException { @@ -730,11 +884,12 @@ public class WeixinProxy { /** * 发送模板消息 * - * @param tplMessage 模板消息主体 + * @param tplMessage + * 模板消息主体 * @return 发送结果 * @throws WeixinException * @see 模板消息 + * href="http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html#.E5.8F.91.E9.80.81.E6.A8.A1.E6.9D.BF.E6.B6.88.E6.81.AF">模板消息 * @see com.foxinmy.weixin4j.mp.message.TemplateMessage * @seee com.foxinmy.weixin4j.msg.event.TemplatesendjobfinishMessage * @see com.foxinmy.weixin4j.mp.api.TmplApi @@ -751,7 +906,7 @@ public class WeixinProxy { * @return 短链接 * @throws WeixinException * @see 长链接转短链接 + * href="http://mp.weixin.qq.com/wiki/10/165c9b15eddcfbd8699ac12b0bd89ae6.html">长链接转短链接 * @see com.foxinmy.weixin4j.mp.api.HelperApi */ public String getShorturl(String url) throws WeixinException { @@ -956,7 +1111,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.mp.model.SemQuery * @see com.foxinmy.weixin4j.mp.model.SemResult * @see 语义理解 + * href="http://mp.weixin.qq.com/wiki/0/0ce78b3c9524811fee34aba3e33f3448.html">语义理解 * @see com.foxinmy.weixin4j.mp.api.HelperApi * @throws WeixinException */ @@ -969,7 +1124,7 @@ public class WeixinProxy { * * @return IP地址 * @see 获取IP地址 + * href="http://mp.weixin.qq.com/wiki/0/2ad4b6bfd29f30f71d39616c2a0fcedc.html">获取IP地址 * @see com.foxinmy.weixin4j.mp.api.HelperApi * @throws WeixinException */ diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java index 96f3c1c5..df0458dc 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java @@ -1,16 +1,25 @@ package com.foxinmy.weixin4j.mp.api; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.util.Date; import java.util.List; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.http.entity.mime.content.ByteArrayBody; + import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.foxinmy.weixin4j.exception.WeixinException; +import com.foxinmy.weixin4j.http.JsonResult; +import com.foxinmy.weixin4j.http.PartParameter; import com.foxinmy.weixin4j.http.Response; import com.foxinmy.weixin4j.model.Token; import com.foxinmy.weixin4j.mp.model.CustomRecord; import com.foxinmy.weixin4j.mp.model.KfAccount; import com.foxinmy.weixin4j.token.TokenHolder; +import com.foxinmy.weixin4j.util.IOUtil; /** * 多客服API @@ -46,7 +55,7 @@ public class CustomApi extends MpApi { * @see com.foxinmy.weixin4j.mp.model.CustomRecord * @see 查询客服聊天记录 * @see 查询客服聊天记录 + * href="http://mp.weixin.qq.com/wiki/19/7c129ec71ddfa60923ea9334557e8b23.html">查询客服聊天记录 */ public List getCustomRecord(String openId, Date starttime, Date endtime, int pagesize, int pageindex) throws WeixinException { @@ -75,7 +84,11 @@ public class CustomApi extends MpApi { * @return 多客服信息列表 * @see com.foxinmy.weixin4j.mp.model.KfAccount * @see 获取客服基本信息 + * @see 获取客服基本信息 * @see 获取在线客服接待信息 + * @see 获取在线客服接待信息 * @throws WeixinException */ public List getKfAccountList(boolean isOnline) @@ -95,4 +108,116 @@ public class CustomApi extends MpApi { } return JSON.parseArray(text, KfAccount.class); } + + /** + * 新增客服账号 + * + * @param id + * 完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符。如果没有公众号微信号, + * 请前往微信公众平台设置。 + * @param name + * 客服昵称,最长6个汉字或12个英文字符 + * @param pwd + * 客服账号登录密码 + * @return 处理结果 + * @throws WeixinException + * @see 客服管理接口返回码 + * @see 新增客服账号 + */ + public JsonResult addAccount(String id, String name, String pwd) + throws WeixinException { + JSONObject obj = new JSONObject(); + obj.put("kf_account", id); + obj.put("nickname", name); + obj.put("password", DigestUtils.md5Hex(pwd)); + String custom_add_uri = getRequestUri("custom_add_uri"); + Token token = tokenHolder.getToken(); + Response response = request.post( + String.format(custom_add_uri, token.getAccessToken()), + obj.toJSONString()); + return response.getAsJsonResult(); + } + + /** + * 更新客服账号 + * + * @param id + * 完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符。如果没有公众号微信号, + * 请前往微信公众平台设置。 + * @param name + * 客服昵称,最长6个汉字或12个英文字符 + * @param pwd + * 客服账号登录密码 + * @return 处理结果 + * @throws WeixinException + * @see 客服管理接口返回码 + * @see 新增客服账号 + */ + public JsonResult updateAccount(String id, String name, String pwd) + throws WeixinException { + JSONObject obj = new JSONObject(); + obj.put("kf_account", id); + obj.put("nickname", name); + obj.put("password", DigestUtils.md5Hex(pwd)); + String custom_update_uri = getRequestUri("custom_update_uri"); + Token token = tokenHolder.getToken(); + Response response = request.post( + String.format(custom_update_uri, token.getAccessToken()), + obj.toJSONString()); + return response.getAsJsonResult(); + } + + /** + * 上传客服头像 + * + * @param id + * 完整客服账号,格式为:账号前缀@公众号微信号 + * @param headimg + * 头像图片文件必须是jpg格式,推荐使用640*640大小的图片以达到最佳效果 + * @return 处理结果 + * @throws WeixinException + * @throws IOException + * @see 客服管理接口返回码 + * @see 上传客服头像 + */ + public JsonResult uploadAccountHeadimg(String id, File headimg) + throws WeixinException, IOException { + Token token = tokenHolder.getToken(); + String custom_uploadheadimg_uri = getRequestUri("custom_uploadheadimg_uri"); + byte[] bytes = IOUtil.toByteArray(new FileInputStream(headimg)); + Response response = request.post( + String.format(custom_uploadheadimg_uri, token.getAccessToken(), + id), + new PartParameter("media", new ByteArrayBody(bytes, headimg + .getName()))); + + return response.getAsJsonResult(); + } + + /** + * 删除客服账号 + * + * @param id + * 完整客服账号,格式为:账号前缀@公众号微信号 + * @return 处理结果 + * @throws WeixinException + * @see 客服管理接口返回码 + * @see 删除客服账号 + */ + public JsonResult deleteAccount(String id) throws WeixinException { + Token token = tokenHolder.getToken(); + String custom_delete_uri = getRequestUri("custom_delete_uri"); + Response response = request.get(String.format(custom_delete_uri, + token.getAccessToken(), id)); + + return response.getAsJsonResult(); + } } \ No newline at end of file diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/GroupApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/GroupApi.java index bd4220ed..3a656bb3 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/GroupApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/GroupApi.java @@ -17,13 +17,14 @@ import com.foxinmy.weixin4j.token.TokenHolder; * @author jy.hu * @date 2014年9月25日 * @since JDK 1.7 - * @see 分组接口 + * @see 分组接口 * @see com.foxinmy.weixin4j.mp.model.Group */ public class GroupApi extends MpApi { - + private final TokenHolder tokenHolder; + public GroupApi(TokenHolder tokenHolder) { this.tokenHolder = tokenHolder; } @@ -36,7 +37,7 @@ public class GroupApi extends MpApi { * @return group对象 * @throws WeixinException * @see 创建分组 + * href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E5.88.9B.E5.BB.BA.E5.88.86.E7.BB.84">创建分组 * @see com.foxinmy.weixin4j.mp.model.Group * @see com.foxinmy.weixin4j.mp.model.Group#toCreateJson() */ @@ -57,7 +58,7 @@ public class GroupApi extends MpApi { * @return 组集合 * @throws WeixinException * @see 查询所有分组 + * href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E6.9F.A5.E8.AF.A2.E6.89.80.E6.9C.89.E5.88.86.E7.BB.844">查询所有分组 * @see com.foxinmy.weixin4j.mp.model.Group */ public List getGroups() throws WeixinException { @@ -78,7 +79,7 @@ public class GroupApi extends MpApi { * @return 组ID * @throws WeixinException * @see 查询用户所在分组 + * href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E6.9F.A5.E8.AF.A2.E7.94.A8.E6.88.B7.E6.89.80.E5.9C.A8.E5.88.86.E7.BB.84">查询用户所在分组 * @see com.foxinmy.weixin4j.mp.model.Group */ public int getGroupByOpenId(String openId) throws WeixinException { @@ -100,7 +101,7 @@ public class GroupApi extends MpApi { * 组名称 * @throws WeixinException * @see 修改分组名 + * href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E4.BF.AE.E6.94.B9.E5.88.86.E7.BB.84.E5.90.8D">修改分组名 * @see com.foxinmy.weixin4j.mp.model.Group * @see com.foxinmy.weixin4j.mp.model.Group#toModifyJson() */ @@ -125,7 +126,7 @@ public class GroupApi extends MpApi { * 组ID * @throws WeixinException * @see 移动分组 + * href="http://mp.weixin.qq.com/wiki/13/be5272dc4930300ba561d927aead2569.html#.E7.A7.BB.E5.8A.A8.E7.94.A8.E6.88.B7.E5.88.86.E7.BB.84">移动分组 * @see com.foxinmy.weixin4j.mp.model.Group */ public JsonResult moveGroup(String openId, int groupId) diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/HelperApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/HelperApi.java index b09de179..ec520287 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/HelperApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/HelperApi.java @@ -37,7 +37,7 @@ public class HelperApi extends MpApi { * @return 短链接 * @throws WeixinException * @see 长链接转短链接 + * href="http://mp.weixin.qq.com/wiki/10/165c9b15eddcfbd8699ac12b0bd89ae6.html">长链接转短链接 */ public String getShorturl(String url) throws WeixinException { String shorturl_uri = getRequestUri("shorturl_uri"); @@ -61,7 +61,7 @@ public class HelperApi extends MpApi { * @see com.foxinmy.weixin4j.mp.model.SemQuery * @see com.foxinmy.weixin4j.mp.model.SemResult * @see 语义理解 + * href="http://mp.weixin.qq.com/wiki/0/0ce78b3c9524811fee34aba3e33f3448.html">语义理解 * @throws WeixinException */ public SemResult semantic(SemQuery semQuery) throws WeixinException { @@ -81,7 +81,7 @@ public class HelperApi extends MpApi { * * @return IP地址 * @see 获取IP地址 + * href="http://mp.weixin.qq.com/wiki/0/2ad4b6bfd29f30f71d39616c2a0fcedc.html">获取IP地址 * @throws WeixinException */ public List getcallbackip() throws WeixinException { diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java index eb428d4a..97ec214e 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java @@ -26,7 +26,7 @@ import com.foxinmy.weixin4j.token.TokenHolder; * @date 2014年9月25日 * @since JDK 1.7 * @see 群发接口 + * href="http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html">群发接口 * @see com.foxinmy.weixin4j.msg.model.MpArticle */ public class MassApi extends MpApi { @@ -46,9 +46,7 @@ public class MassApi extends MpApi { * @return 媒体ID * @throws WeixinException * @see 高级群发 - * @see 上传图文消息 + * href="http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html#.E4.B8.8A.E4.BC.A0.E5.9B.BE.E6.96.87.E6.B6.88.E6.81.AF.E7.B4.A0.E6.9D.90.E3.80.90.E8.AE.A2.E9.98.85.E5.8F.B7.E4.B8.8E.E6.9C.8D.E5.8A.A1.E5.8F.B7.E8.AE.A4.E8.AF.81.E5.90.8E.E5.9D.87.E5.8F.AF.E7.94.A8.E3.80.91">上传图文素材 * @see com.foxinmy.weixin4j.msg.model.MpArticle */ public String uploadArticle(List articles) @@ -72,7 +70,7 @@ public class MassApi extends MpApi { * @return 上传后的ID 可用于群发视频消息 * @throws WeixinException * @see 高级群发 + * href="http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html">高级群发 * @see com.foxinmy.weixin4j.msg.model.Video * @see com.foxinmy.weixin4j.msg.model.MpVideo * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} @@ -106,6 +104,8 @@ public class MassApi extends MpApi { * @see com.foxinmy.weixin4j.msg.model.Voice * @see com.foxinmy.weixin4j.msg.model.MpVideo * @see com.foxinmy.weixin4j.msg.model.MpNews + * @see 根据分组群发 * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} * @see {@link com.foxinmy.weixin4j.mp.api.GroupApi#getGroups()} */ @@ -146,6 +146,8 @@ public class MassApi extends MpApi { * @param groupId * 分组ID * @return 群发后的消息ID + * @see 根据分组群发 * @see {@link com.foxinmy.weixin4j.mp.api.MassApi#massByGroupId(Base,int)} * @throws WeixinException */ @@ -170,6 +172,8 @@ public class MassApi extends MpApi { * @see com.foxinmy.weixin4j.msg.model.Voice * @see com.foxinmy.weixin4j.msg.model.MpVideo * @see com.foxinmy.weixin4j.msg.model.MpNews + * @see 根据openid群发 * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} * @see {@link com.foxinmy.weixin4j.mp.api.UserApi#getUser(String)} */ @@ -209,6 +213,8 @@ public class MassApi extends MpApi { * @param openIds * openId列表 * @return 群发后的消息ID + * @see 根据openid群发 * @see {@link com.foxinmy.weixin4j.mp.api.MassApi#massByOpenIds(Base,String...)} * @throws WeixinException */ @@ -228,10 +234,9 @@ public class MassApi extends MpApi { * 发送出去的消息ID * @throws WeixinException * @see 删除群发 + * href="http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html#.E5.88.A0.E9.99.A4.E7.BE.A4.E5.8F.91.E3.80.90.E8.AE.A2.E9.98.85.E5.8F.B7.E4.B8.8E.E6.9C.8D.E5.8A.A1.E5.8F.B7.E8.AE.A4.E8.AF.81.E5.90.8E.E5.9D.87.E5.8F.AF.E7.94.A8.E3.80.91">删除群发 * @see {@link com.foxinmy.weixin4j.mp.api.MassApi#massByGroupId(Base, int)} - * @see {@link com.foxinmy.weixin4j.mp.api.MassApi#massByOpenIds(Base, String...) - + * @see {@link com.foxinmy.weixin4j.mp.api.MassApi#massByOpenIds(Base, String...) */ public JsonResult deleteMassNews(String msgid) throws WeixinException { JSONObject obj = new JSONObject(); @@ -244,4 +249,56 @@ public class MassApi extends MpApi { return response.getAsJsonResult(); } + + /** + * 预览群发消息
+ * 开发者可通过该接口发送消息给指定用户,在手机端查看消息的样式和排版 + * + * @param openId + * 接收用户的ID + * @param box + * 消息体 + * @return 处理结果 + * @throws WeixinException + * @see 预览群发消息 + */ + public JsonResult previewMassNews(String openId, Base box) + throws WeixinException { + String msgtype = box.getMediaType().name(); + JSONObject obj = new JSONObject(); + obj.put("touser", openId); + obj.put(msgtype, JSON.toJSON(box)); + obj.put("msgtype", msgtype); + String mass_preview_uri = getRequestUri("mass_preview_uri"); + Token token = tokenHolder.getToken(); + Response response = request.post( + String.format(mass_preview_uri, token.getAccessToken()), + obj.toJSONString()); + + return response.getAsJsonResult(); + } + + /** + * 查询群发发送状态 + * + * @param msgId + * 消息ID + * @return 消息发送状态 + * @throws WeixinException + * @see {@link com.foxinmy.weixin4j.msg.event.MassEventMessage#getStatusDesc(String)} + * @see 查询群发状态 + */ + public String getMassNews(String msgId) throws WeixinException { + JSONObject obj = new JSONObject(); + obj.put("msg_id", msgId); + String mass_get_uri = getRequestUri("mass_get_uri"); + Token token = tokenHolder.getToken(); + Response response = request.post( + String.format(mass_get_uri, token.getAccessToken()), + obj.toJSONString()); + + return response.getAsJson().getString("msg_status"); + } } diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java index 2856a4e9..41783a55 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java @@ -26,7 +26,7 @@ import com.foxinmy.weixin4j.util.IOUtil; * @date 2014年9月25日 * @since JDK 1.7 * @see 上传多媒体文件 + * href="http://mp.weixin.qq.com/wiki/10/78b15308b053286e2a66b33f0f0f5fb6.html">上传多媒体文件 * @see com.foxinmy.weixin4j.type.MediaType */ public class MediaApi extends MpApi { @@ -90,7 +90,7 @@ public class MediaApi extends MpApi { * 媒体类型 * @return 上传到微信服务器返回的媒体标识 * @see 上传下载说明 + * href="http://mp.weixin.qq.com/wiki/10/78b15308b053286e2a66b33f0f0f5fb6.html">上传下载说明 * @throws WeixinException */ public String uploadMedia(String fileName, byte[] bytes, String mediaType) @@ -118,7 +118,7 @@ public class MediaApi extends MpApi { * @throws WeixinException * @throws IOException * @see 上传下载说明 + * href="http://mp.weixin.qq.com/wiki/10/78b15308b053286e2a66b33f0f0f5fb6.html">上传下载说明 * @see com.foxinmy.weixin4j.type.MediaType * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#downloadMedia(String)} */ @@ -146,7 +146,7 @@ public class MediaApi extends MpApi { * @return 二进制数据包 * @throws WeixinException * @see 上传下载说明 + * href="http://mp.weixin.qq.com/wiki/10/78b15308b053286e2a66b33f0f0f5fb6.html">上传下载说明 */ public byte[] downloadMedia(String mediaId) throws WeixinException { Token token = tokenHolder.getToken(); diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java index d46e6478..f6fe2c9c 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java @@ -34,7 +34,7 @@ public class MenuApi extends MpApi { * @param btnList * @throws WeixinException * @see 创建自定义菜单 + * href="http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html">创建自定义菜单 * @see com.foxinmy.weixin4j.model.Button */ public JsonResult createMenu(List