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