View Javadoc
1   package com.foxinmy.weixin4j.mp;
2   
3   import java.io.InputStream;
4   import java.util.Date;
5   import java.util.List;
6   
7   import com.alibaba.fastjson.JSONObject;
8   import com.foxinmy.weixin4j.cache.CacheStorager;
9   import com.foxinmy.weixin4j.cache.FileCacheStorager;
10  import com.foxinmy.weixin4j.exception.WeixinException;
11  import com.foxinmy.weixin4j.http.weixin.ApiResult;
12  import com.foxinmy.weixin4j.model.Button;
13  import com.foxinmy.weixin4j.model.Token;
14  import com.foxinmy.weixin4j.model.WeixinAccount;
15  import com.foxinmy.weixin4j.model.card.*;
16  import com.foxinmy.weixin4j.model.media.MediaCounter;
17  import com.foxinmy.weixin4j.model.media.MediaDownloadResult;
18  import com.foxinmy.weixin4j.model.media.MediaItem;
19  import com.foxinmy.weixin4j.model.media.MediaRecord;
20  import com.foxinmy.weixin4j.model.media.MediaUploadResult;
21  import com.foxinmy.weixin4j.model.paging.Pageable;
22  import com.foxinmy.weixin4j.model.paging.Pagedata;
23  import com.foxinmy.weixin4j.model.qr.QRParameter;
24  import com.foxinmy.weixin4j.model.qr.QRResult;
25  import com.foxinmy.weixin4j.mp.api.CardApi;
26  import com.foxinmy.weixin4j.mp.api.CommentApi;
27  import com.foxinmy.weixin4j.mp.api.CustomApi;
28  import com.foxinmy.weixin4j.mp.api.DataApi;
29  import com.foxinmy.weixin4j.mp.api.GroupApi;
30  import com.foxinmy.weixin4j.mp.api.HelperApi;
31  import com.foxinmy.weixin4j.mp.api.MassApi;
32  import com.foxinmy.weixin4j.mp.api.MediaApi;
33  import com.foxinmy.weixin4j.mp.api.MenuApi;
34  import com.foxinmy.weixin4j.mp.api.NotifyApi;
35  import com.foxinmy.weixin4j.mp.api.OauthApi;
36  import com.foxinmy.weixin4j.mp.api.QrApi;
37  import com.foxinmy.weixin4j.mp.api.TagApi;
38  import com.foxinmy.weixin4j.mp.api.TmplApi;
39  import com.foxinmy.weixin4j.mp.api.UserApi;
40  import com.foxinmy.weixin4j.mp.component.WeixinTokenComponentCreator;
41  import com.foxinmy.weixin4j.mp.message.NotifyMessage;
42  import com.foxinmy.weixin4j.mp.message.TemplateMessage;
43  import com.foxinmy.weixin4j.mp.model.ArticleComment;
44  import com.foxinmy.weixin4j.mp.model.ArticleComment.ArticleCommentType;
45  import com.foxinmy.weixin4j.mp.model.AutoReplySetting;
46  import com.foxinmy.weixin4j.mp.model.Following;
47  import com.foxinmy.weixin4j.mp.model.Group;
48  import com.foxinmy.weixin4j.mp.model.KfAccount;
49  import com.foxinmy.weixin4j.mp.model.KfChatRecord;
50  import com.foxinmy.weixin4j.mp.model.KfOnlineAccount;
51  import com.foxinmy.weixin4j.mp.model.KfSession;
52  import com.foxinmy.weixin4j.mp.model.KfSession.KfSessionCounter;
53  import com.foxinmy.weixin4j.mp.model.Menu;
54  import com.foxinmy.weixin4j.mp.model.MenuMatchRule;
55  import com.foxinmy.weixin4j.mp.model.MenuSetting;
56  import com.foxinmy.weixin4j.mp.model.SemQuery;
57  import com.foxinmy.weixin4j.mp.model.SemResult;
58  import com.foxinmy.weixin4j.mp.model.Tag;
59  import com.foxinmy.weixin4j.mp.model.TemplateMessageInfo;
60  import com.foxinmy.weixin4j.mp.model.User;
61  import com.foxinmy.weixin4j.mp.model.ChangeOpenidResult;
62  import com.foxinmy.weixin4j.mp.token.WeixinTicketCreator;
63  import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator;
64  import com.foxinmy.weixin4j.mp.type.DatacubeType;
65  import com.foxinmy.weixin4j.mp.type.IndustryType;
66  import com.foxinmy.weixin4j.mp.type.Lang;
67  import com.foxinmy.weixin4j.token.PerTicketManager;
68  import com.foxinmy.weixin4j.token.TokenCreator;
69  import com.foxinmy.weixin4j.token.TokenManager;
70  import com.foxinmy.weixin4j.tuple.MassTuple;
71  import com.foxinmy.weixin4j.tuple.MpArticle;
72  import com.foxinmy.weixin4j.tuple.MpVideo;
73  import com.foxinmy.weixin4j.type.MediaType;
74  import com.foxinmy.weixin4j.type.TicketType;
75  import com.foxinmy.weixin4j.util.Consts;
76  import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
77  
78  /**
79   * 微信公众平台接口实现
80   *
81   * @className WeixinProxy
82   * @author jinyu(foxinmy@gmail.com)
83   * @date 2014年3月23日
84   * @since JDK 1.6
85   * @see <a href="http://mp.weixin.qq.com/wiki/index.php">api文档</a>
86   */
87  public class WeixinProxy {
88  	/**
89  	 * 授权API
90  	 */
91  	private final OauthApi oauthApi;
92  	/**
93  	 * 媒体素材API
94  	 */
95  	private final MediaApi mediaApi;
96  	/**
97  	 * 客服消息API
98  	 */
99  	private final NotifyApi notifyApi;
100 	/**
101 	 * 多客服API
102 	 */
103 	private final CustomApi customApi;
104 	/**
105 	 * 群发消息API
106 	 */
107 	private final MassApi massApi;
108 	/**
109 	 * 用户API
110 	 */
111 	private final UserApi userApi;
112 	/**
113 	 * 分组API
114 	 */
115 	private final GroupApi groupApi;
116 	/**
117 	 * 菜单API
118 	 */
119 	private final MenuApi menuApi;
120 	/**
121 	 * 二维码API
122 	 */
123 	private final QrApi qrApi;
124 	/**
125 	 * 模板消息API
126 	 */
127 	private final TmplApi tmplApi;
128 	/**
129 	 * 辅助API
130 	 */
131 	private final HelperApi helperApi;
132 	/**
133 	 * 数据统计API
134 	 */
135 	private final DataApi dataApi;
136 	/**
137 	 * 标签API
138 	 */
139 	private final TagApi tagApi;
140 	/**
141 	 * 卡券API
142 	 */
143 	private final CardApi cardApi;
144 	/**
145 	 * 文章评论API
146 	 */
147 	private final CommentApi commentApi;
148 	/**
149 	 * token管理
150 	 */
151 	private final TokenManager tokenManager;
152 	/**
153 	 * 账号信息
154 	 */
155 	private final WeixinAccount weixinAccount;
156 	/**
157 	 * token存储
158 	 */
159 	private final CacheStorager<Token> cacheStorager;
160 
161 	/**
162 	 * 微信接口实现(使用weixin4j.properties配置的account账号信息,
163 	 * 使用FileCacheStorager文件方式缓存TOKEN)
164 	 */
165 	public WeixinProxy() {
166 		this(new FileCacheStorager<Token>());
167 	}
168 
169 	/**
170 	 * 微信接口实现(使用weixin4j.properties配置的account账号信息)
171 	 *
172 	 * @param cacheStorager
173 	 *            token管理
174 	 */
175 	public WeixinProxy(CacheStorager<Token> cacheStorager) {
176 		this(Weixin4jConfigUtil.getWeixinAccount(), cacheStorager);
177 	}
178 
179 	/**
180 	 * 微信接口实现
181 	 *
182 	 * @param weixinAccount
183 	 *            账号信息
184 	 * @param cacheStorager
185 	 *            token管理
186 	 */
187 	public WeixinProxy(WeixinAccount weixinAccount, CacheStorager<Token> cacheStorager) {
188 		this(weixinAccount, new WeixinTokenCreator(weixinAccount.getId(), weixinAccount.getSecret()), cacheStorager);
189 	}
190 
191 	/**
192 	 * 第三方组件方式创建微信接口实现(永久刷新令牌机制)
193 	 *
194 	 * @param perTicketManager
195 	 *            第三方组件永久刷新token
196 	 * @param componentTokenManager
197 	 *            第三方组件凭证token
198 	 * @see com.foxinmy.weixin4j.mp.api.ComponentApi
199 	 * @see com.foxinmy.weixin4j.mp.api.ComponentApi#getPreCodeManager
200 	 * @see com.foxinmy.weixin4j.mp.api.ComponentApi#getTokenManager
201 	 */
202 	public WeixinProxy(PerTicketManager perTicketManager, TokenManager componentTokenManager) {
203 		this(new WeixinAccount(perTicketManager.getThirdId(), perTicketManager.getThirdSecret()),
204 				new WeixinTokenComponentCreator(perTicketManager, componentTokenManager),
205 				perTicketManager.getCacheStorager());
206 	}
207 
208 	/**
209 	 * 微信接口实现
210 	 *
211 	 * @param weixinAccount
212 	 *            微信账号
213 	 * @param tokenCreator
214 	 *            token的创建
215 	 * @param cacheStorager
216 	 *            token的存储
217 	 */
218 	private WeixinProxy(WeixinAccount weixinAccount, TokenCreator tokenCreator, CacheStorager<Token> cacheStorager) {
219 		if (weixinAccount == null) {
220 			throw new IllegalArgumentException("weixinAccount must not be empty");
221 		}
222 		if (tokenCreator == null) {
223 			throw new IllegalArgumentException("tokenCreator must not be empty");
224 		}
225 		if (cacheStorager == null) {
226 			throw new IllegalArgumentException("cacheStorager must not be empty");
227 		}
228 		this.tokenManager = new TokenManager(tokenCreator, cacheStorager);
229 		this.weixinAccount = weixinAccount;
230 		this.cacheStorager = cacheStorager;
231 		this.oauthApi = new OauthApi(weixinAccount);
232 		this.mediaApi = new MediaApi(tokenManager);
233 		this.notifyApi = new NotifyApi(tokenManager);
234 		this.customApi = new CustomApi(tokenManager);
235 		this.massApi = new MassApi(tokenManager);
236 		this.userApi = new UserApi(tokenManager);
237 		this.groupApi = new GroupApi(tokenManager);
238 		this.menuApi = new MenuApi(tokenManager);
239 		this.qrApi = new QrApi(tokenManager);
240 		this.tmplApi = new TmplApi(tokenManager);
241 		this.helperApi = new HelperApi(tokenManager);
242 		this.dataApi = new DataApi(tokenManager);
243 		this.tagApi = new TagApi(tokenManager);
244 		this.cardApi = new CardApi(tokenManager);
245 		this.commentApi = new CommentApi(tokenManager);
246 	}
247 
248 	/**
249 	 * 获取微信账号信息
250 	 *
251 	 * @return
252 	 */
253 	public WeixinAccount getWeixinAccount() {
254 		return weixinAccount;
255 	}
256 
257 	/**
258 	 * token管理
259 	 *
260 	 * @return
261 	 */
262 	public TokenManager getTokenManager() {
263 		return this.tokenManager;
264 	}
265 
266 	/**
267 	 * 获取oauth授权API
268 	 *
269 	 * @see com.foxinmy.weixin4j.mp.api.OauthApi
270 	 * @return
271 	 */
272 	public OauthApi getOauthApi() {
273 		return oauthApi;
274 	}
275 
276 	/**
277 	 * 获取JSSDK Ticket的tokenManager
278 	 *
279 	 * @param ticketType
280 	 *            票据类型
281 	 * @return
282 	 */
283 	public TokenManager getTicketManager(TicketType ticketType) {
284 		return new TokenManager(new WeixinTicketCreator(ticketType, this.tokenManager), this.cacheStorager);
285 	}
286 
287 	/**
288 	 * 上传图文消息内的图片获取URL
289 	 * 请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。
290 	 *
291 	 * @param is
292 	 *            图片数据流
293 	 * @param fileName
294 	 *            文件名 为空时将自动生成
295 	 * @return 图片URL 可用于后续群发中,放置到图文消息中
296 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
297 	 * @throws WeixinException
298 	 */
299 	public String uploadImage(InputStream is, String fileName) throws WeixinException {
300 		return mediaApi.uploadImage(is, fileName);
301 	}
302 
303 	/**
304 	 * 上传群发中的视频素材
305 	 *
306 	 * @param is
307 	 *            图片数据流
308 	 * @param fileName
309 	 *            文件名 为空时将自动生成
310 	 * @param title
311 	 *            视频标题 非空
312 	 * @param description
313 	 *            视频描述 可为空
314 	 * @return 群发视频消息对象
315 	 * @throws WeixinException
316 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
317 	 * @see <a href=
318 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
319 	 *      高级群发</a>
320 	 * @see com.foxinmy.weixin4j.tuple.MpVideo
321 	 */
322 	public MpVideo uploadVideo(InputStream is, String fileName, String title, String description)
323 			throws WeixinException {
324 		return mediaApi.uploadVideo(is, fileName, title, description);
325 	}
326 
327 	/**
328 	 * 上传媒体文件 </br>
329 	 * <font color="red">此接口只包含图片、语音、缩略图、视频(临时)四种媒体类型的上传</font>
330 	 * </p>
331 	 *
332 	 * @param isMaterial
333 	 *            是否永久上传
334 	 * @param is
335 	 *            媒体数据流
336 	 * @param fileName
337 	 *            文件名 为空时将自动生成
338 	 * @return 上传到微信服务器返回的媒体标识
339 	 * @see <a href=
340 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738726&token=&lang=zh_CN">
341 	 *      上传临时素材</a>
342 	 * @see <a href=
343 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729&token=&lang=zh_CN">
344 	 *      上传永久素材</a>
345 	 * @see com.foxinmy.weixin4j.model.media.MediaUploadResult
346 	 * @see com.foxinmy.weixin4j.type.MediaType
347 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
348 	 * @throws WeixinException
349 	 */
350 	public MediaUploadResult uploadMedia(boolean isMaterial, InputStream is, String fileName) throws WeixinException {
351 		return mediaApi.uploadMedia(isMaterial, is, fileName);
352 	}
353 
354 	/**
355 	 * 下载媒体文件
356 	 *
357 	 * @param mediaId
358 	 *            媒体ID
359 	 * @param isMaterial
360 	 *            是否永久素材
361 	 * @return 媒体文件下载结果
362 	 * @throws WeixinException
363 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
364 	 * @see com.foxinmy.weixin4j.model.media.MediaDownloadResult
365 	 * @see <a href=
366 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738727&token=&lang=zh_CN">
367 	 *      下载临时媒体素材</a>
368 	 * @see <a href=
369 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738730&token=&lang=zh_CN">
370 	 *      下载永久媒体素材</a>
371 	 */
372 	public MediaDownloadResult downloadMedia(String mediaId, boolean isMaterial) throws WeixinException {
373 		return mediaApi.downloadMedia(mediaId, isMaterial);
374 	}
375 
376 	/**
377 	 * 上传永久图文素材
378 	 * <p>
379 	 * 、新增的永久素材也可以在公众平台官网素材管理模块中看到,永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,
380 	 * 其他类型为1000
381 	 * </P>
382 	 *
383 	 * @param articles
384 	 *            图文列表
385 	 * @return 上传到微信服务器返回的媒体标识
386 	 * @throws WeixinException
387 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
388 	 * @see com.foxinmy.weixin4j.tuple.MpArticle
389 	 * @see <a href=
390 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729&token=&lang=zh_CN">
391 	 *      上传永久媒体素材</a>
392 	 */
393 	public String uploadMaterialArticle(List<MpArticle> articles) throws WeixinException {
394 		return mediaApi.uploadMaterialArticle(articles);
395 	}
396 
397 	/**
398 	 * 下载永久图文素材
399 	 *
400 	 * @param mediaId
401 	 *            媒体ID
402 	 * @return 图文列表
403 	 * @throws WeixinException
404 	 * @see {@link #downloadMedia(String, boolean)}
405 	 * @see com.foxinmy.weixin4j.tuple.MpArticle
406 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
407 	 */
408 	public List<MpArticle> downloadArticle(String mediaId) throws WeixinException {
409 		return mediaApi.downloadArticle(mediaId);
410 	}
411 
412 	/**
413 	 * 更新永久图文素材
414 	 *
415 	 * @param mediaId
416 	 *            要修改的图文消息的id
417 	 * @param index
418 	 *            要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0
419 	 * @param article
420 	 *            图文对象
421 	 * @return 处理结果
422 	 * @throws WeixinException
423 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
424 	 * @see com.foxinmy.weixin4j.tuple.MpArticle
425 	 * @see <a href=
426 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738732&token=&lang=zh_CN">
427 	 *      更新永久图文素材</a>
428 	 */
429 	public ApiResult updateMaterialArticle(String mediaId, int index, MpArticle article) throws WeixinException {
430 		return mediaApi.updateMaterialArticle(mediaId, index, article);
431 	}
432 
433 	/**
434 	 * 删除永久媒体素材
435 	 *
436 	 * @param mediaId
437 	 *            媒体素材的media_id
438 	 * @return 处理结果
439 	 * @throws WeixinException
440 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
441 	 * @see <a href=
442 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738731&token=&lang=zh_CN">
443 	 *      删除永久媒体素材</a>
444 	 */
445 	public ApiResult deleteMaterialMedia(String mediaId) throws WeixinException {
446 		return mediaApi.deleteMaterialMedia(mediaId);
447 	}
448 
449 	/**
450 	 * 上传永久视频素材
451 	 *
452 	 * @param is
453 	 *            大小不超过1M且格式为MP4的视频文件
454 	 * @param fileName
455 	 *            文件名 为空时将自动生成
456 	 * @param title
457 	 *            视频标题
458 	 * @param introduction
459 	 *            视频描述
460 	 * @return 上传到微信服务器返回的媒体标识
461 	 * @see <a href=
462 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729&token=&lang=zh_CN">
463 	 *      上传永久媒体素材</a>
464 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
465 	 * @throws WeixinException
466 	 */
467 	public String uploadMaterialVideo(InputStream is, String fileName, String title, String introduction)
468 			throws WeixinException {
469 		return mediaApi.uploadMaterialVideo(is, fileName, title, introduction);
470 	}
471 
472 	/**
473 	 * 获取永久媒体素材的总数</br>
474 	 * .图片和图文消息素材(包括单图文和多图文)的总数上限为5000,其他素材的总数上限为1000
475 	 *
476 	 * @return 总数对象
477 	 * @throws WeixinException
478 	 * @see com.foxinmy.weixin4j.model.media.MediaCounter
479 	 * @see <a href=
480 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738733&token=&lang=zh_CN">
481 	 *      获取素材总数</a>
482 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
483 	 */
484 	public MediaCounter countMaterialMedia() throws WeixinException {
485 		return mediaApi.countMaterialMedia();
486 	}
487 
488 	/**
489 	 * 获取媒体素材记录列表
490 	 *
491 	 * @param mediaType
492 	 *            素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)
493 	 * @param pageable
494 	 *            分页数据
495 	 * @return 媒体素材的记录对象
496 	 * @throws WeixinException
497 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
498 	 * @see com.foxinmy.weixin4j.model.media.MediaRecord
499 	 * @see com.foxinmy.weixin4j.type.MediaType
500 	 * @see com.foxinmy.weixin4j.model.media.MediaItem
501 	 * @see com.foxinmy.weixin4j.model.paging.Pageable
502 	 * @see com.foxinmy.weixin4j.model.paging.Pagedata
503 	 * @see <a href=
504 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738734&token=&lang=zh_CN">
505 	 *      获取素材列表</a>
506 	 */
507 	public MediaRecord listMaterialMedia(MediaType mediaType, Pageable pageable) throws WeixinException {
508 		return mediaApi.listMaterialMedia(mediaType, pageable);
509 	}
510 
511 	/**
512 	 * 获取全部的媒体素材
513 	 *
514 	 * @param mediaType
515 	 *            媒体类型
516 	 * @return 素材列表
517 	 * @see com.foxinmy.weixin4j.mp.api.MediaApi
518 	 * @see {@link #listMaterialMedia(MediaType, Pageable)}
519 	 * @throws WeixinException
520 	 */
521 	public List<MediaItem> listAllMaterialMedia(MediaType mediaType) throws WeixinException {
522 		return mediaApi.listAllMaterialMedia(mediaType);
523 	}
524 
525 	/**
526 	 * 发送客服消息(在48小时内不限制发送次数)
527 	 *
528 	 * @param notify
529 	 *            客服消息对象
530 	 * @return 处理结果
531 	 * @see {@link #sendNotify(NotifyMessage,String) }
532 	 * @throws WeixinException
533 	 */
534 	public ApiResult sendNotify(NotifyMessage notify) throws WeixinException {
535 		return notifyApi.sendNotify(notify);
536 	}
537 
538 	/**
539 	 * 发送客服消息(在48小时内不限制发送次数)
540 	 *
541 	 * @param notify
542 	 *            客服消息对象
543 	 * @param kfAccount
544 	 *            客服账号 可为空
545 	 * @throws WeixinException
546 	 * @return 处理结果
547 	 * @see <a href=
548 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140547&token=&lang=zh_CN">
549 	 *      发送客服消息</a>
550 	 * @see com.foxinmy.weixin4j.tuple.Text
551 	 * @see com.foxinmy.weixin4j.tuple.Image
552 	 * @see com.foxinmy.weixin4j.tuple.Voice
553 	 * @see com.foxinmy.weixin4j.tuple.Video
554 	 * @see com.foxinmy.weixin4j.tuple.Music
555 	 * @see com.foxinmy.weixin4j.tuple.News
556 	 * @see com.foxinmy.weixin4j.mp.api.NotifyApi
557 	 */
558 	public ApiResult sendNotify(NotifyMessage notify, String kfAccount) throws WeixinException {
559 		return notifyApi.sendNotify(notify, kfAccount);
560 	}
561 
562 	/**
563 	 * 客服聊天记录
564 	 *
565 	 * @param startTime
566 	 *            查询开始时间
567 	 * @param endTime
568 	 *            查询结束时间 每次查询不能跨日查询
569 	 * @param number
570 	 *            最多10000条
571 	 * @see com.foxinmy.weixin4j.mp.model.KfChatRecord
572 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
573 	 * @see <a href="http://dkf.qq.com/document-1_1.html">查询客服聊天记录</a>
574 	 * @see <a href=
575 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044854&token=&lang=zh_CN">
576 	 *      查询客服聊天记录</a>
577 	 * @throws WeixinException
578 	 */
579 	public List<KfChatRecord> getKfChatRecord(Date startTime, Date endTime, int number) throws WeixinException {
580 		return customApi.getKfChatRecord(startTime, endTime, number);
581 	}
582 
583 	/**
584 	 * 获取公众号中所设置的客服基本信息,包括客服工号、客服昵称、客服登录账号
585 	 *
586 	 * @return 多客服信息列表
587 	 * @see com.foxinmy.weixin4j.mp.model.KfAccount
588 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
589 	 * @see <a href=
590 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044813&token=&lang=zh_CN">
591 	 *      获取客服基本信息</a>
592 	 * @throws WeixinException
593 	 */
594 	public List<KfAccount> listKfAccount() throws WeixinException {
595 		return customApi.listKfAccount();
596 	}
597 
598 	/**
599 	 * 获取在线客服在线状态(手机在线、PC客户端在线、手机和PC客户端全都在线)、客服自动接入最大值、 客服当前接待客户数
600 	 *
601 	 * @return 多客服在线信息列表
602 	 * @see com.foxinmy.weixin4j.mp.model.KfOnlineAccount
603 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
604 	 * @see <a href=
605 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044813&token=&lang=zh_CN">
606 	 *      获取客服在线信息</a>
607 	 * @throws WeixinException
608 	 */
609 	public List<KfOnlineAccount> listOnlineKfAccount() throws WeixinException {
610 		return customApi.listOnlineKfAccount();
611 	}
612 
613 	/**
614 	 * 新增客服账号
615 	 *
616 	 * @param id
617 	 *            完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符。如果没有公众号微信号,
618 	 *            请前往微信公众平台设置。
619 	 * @param name
620 	 *            客服昵称,最长6个汉字或12个英文字符
621 	 * @return 处理结果
622 	 * @throws WeixinException
623 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi 客服管理接口返回码</a>
624 	 * @see <a href=
625 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044813&token=&lang=zh_CN">
626 	 *      新增客服账号</a>
627 	 */
628 	public ApiResult createKfAccount(String id, String name) throws WeixinException {
629 		return customApi.createKfAccount(id, name);
630 	}
631 
632 	/**
633 	 * 更新客服账号
634 	 *
635 	 * @param id
636 	 *            完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符。如果没有公众号微信号,
637 	 *            请前往微信公众平台设置。
638 	 * @param name
639 	 *            客服昵称,最长6个汉字或12个英文字符
640 	 * @return 处理结果
641 	 * @throws WeixinException
642 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
643 	 * @see <a href=
644 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044813&token=&lang=zh_CN">
645 	 *      更新客服账号</a>
646 	 */
647 	public ApiResult updateKfAccount(String id, String name) throws WeixinException {
648 		return customApi.updateKfAccount(id, name);
649 	}
650 
651 	/**
652 	 * 邀请绑定客服帐号
653 	 * 新添加的客服帐号是不能直接使用的,只有客服人员用微信号绑定了客服账号后,方可登录Web客服进行操作。此接口发起一个绑定邀请到客服人员微信号
654 	 * ,客服人员需要在微信客户端上用该微信号确认后帐号才可用。尚未绑定微信号的帐号可以进行绑定邀请操作,邀请未失效时不能对该帐号进行再次绑定微信号邀请。
655 	 *
656 	 * @param kfAccount
657 	 *            完整客服帐号,格式为:帐号前缀@公众号微信号
658 	 * @param inviteAccount
659 	 *            接收绑定邀请的客服微信号
660 	 * @return 处理结果
661 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
662 	 * @see <a href=
663 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044813&token=&lang=zh_CN"
664 	 *      >邀请绑定客服帐号<a/>
665 	 * @throws WeixinException
666 	 */
667 	public ApiResult inviteKfAccount(String kfAccount, String inviteAccount) throws WeixinException {
668 		return customApi.inviteKfAccount(kfAccount, inviteAccount);
669 	}
670 
671 	/**
672 	 * 上传客服头像
673 	 *
674 	 * @param accountId
675 	 *            完整客服账号,格式为:账号前缀@公众号微信号
676 	 * @param is
677 	 *            头像图片文件必须是jpg格式,推荐使用640*640大小的图片以达到最佳效果
678 	 * @param fileName
679 	 *            文件名 为空时将自动生成
680 	 * @return 处理结果
681 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
682 	 * @throws WeixinException
683 	 * @see <a href=
684 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044813&token=&lang=zh_CN">
685 	 *      上传客服头像</a>
686 	 */
687 	public ApiResult uploadKfAvatar(String accountId, InputStream is, String fileName) throws WeixinException {
688 		return customApi.uploadKfAvatar(accountId, is, fileName);
689 	}
690 
691 	/**
692 	 * 删除客服账号
693 	 *
694 	 * @param id
695 	 *            完整客服账号,格式为:账号前缀@公众号微信号
696 	 * @return 处理结果
697 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
698 	 * @throws WeixinException
699 	 * @see <a href=
700 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044813&token=&lang=zh_CN">
701 	 *      删除客服账号</a>
702 	 */
703 	public ApiResult deleteKfAccount(String id) throws WeixinException {
704 		return customApi.deleteKfAccount(id);
705 	}
706 
707 	/**
708 	 * 创建客服会话
709 	 * <p>
710 	 * 开发者可以使用本接口,为多客服的客服工号创建会话,将某个客户直接指定给客服工号接待,需要注意此接口不会受客服自动接入数以及自动接入开关限制。
711 	 * 只能为在线的客服(PC客户端在线,或者已绑定多客服助手)创建会话。
712 	 * </p>
713 	 *
714 	 * @param userOpenId
715 	 *            用户的userOpenId
716 	 * @param kfAccount
717 	 *            完整客服账号,格式为:账号前缀@公众号微信号
718 	 * @param text
719 	 *            附加信息,文本会展示在客服人员的多客服客户端
720 	 * @return 处理结果
721 	 * @throws WeixinException
722 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
723 	 * @see <a href=
724 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044813&token=&lang=zh_CN">
725 	 *      创建会话</a>
726 	 */
727 	public ApiResult createKfSession(String userOpenId, String kfAccount, String text) throws WeixinException {
728 		return customApi.createKfSession(userOpenId, kfAccount, text);
729 	}
730 
731 	/**
732 	 * 关闭客服会话
733 	 *
734 	 * @param userOpenId
735 	 *            用户的userOpenId
736 	 * @param kfAccount
737 	 *            完整客服账号,格式为:账号前缀@公众号微信号
738 	 * @param text
739 	 *            附加信息,文本会展示在客服人员的多客服客户端
740 	 * @return 处理结果
741 	 * @throws WeixinException
742 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
743 	 * @see <a href=
744 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044820&token=&lang=zh_CN">
745 	 *      关闭会话</a>
746 	 */
747 	public ApiResult closeKfSession(String userOpenId, String kfAccount, String text) throws WeixinException {
748 		return customApi.closeKfSession(userOpenId, kfAccount, text);
749 	}
750 
751 	/**
752 	 * 获取客户的会话状态:获取客户当前的会话状态。
753 	 *
754 	 * @param userOpenId
755 	 *            用户的openid
756 	 * @return 会话对象
757 	 * @throws WeixinException
758 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
759 	 * @see com.foxinmy.weixin4j.mp.model.KfSession
760 	 * @see <a href=
761 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044820&token=&lang=zh_CN">
762 	 *      获取会话状态</a>
763 	 */
764 	public KfSession getKfSession(String userOpenId) throws WeixinException {
765 		return customApi.getKfSession(userOpenId);
766 	}
767 
768 	/**
769 	 * 获取客服的会话列表:获取某个客服正在接待的会话列表。
770 	 *
771 	 * @param kfAccount
772 	 *            完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符。
773 	 * @return 会话列表
774 	 * @throws WeixinException
775 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
776 	 * @see com.foxinmy.weixin4j.mp.model.KfSession
777 	 * @see <a href=
778 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044820&token=&lang=zh_CN">
779 	 *      获取客服的会话列表</a>
780 	 */
781 	public List<KfSession> listKfSession(String kfAccount) throws WeixinException {
782 		return customApi.listKfSession(kfAccount);
783 	}
784 
785 	/**
786 	 * 获取未接入会话列表:获取当前正在等待队列中的会话列表,此接口最多返回最早进入队列的100个未接入会话
787 	 *
788 	 * @return 会话列表
789 	 * @throws WeixinException
790 	 * @see com.foxinmy.weixin4j.mp.api.CustomApi
791 	 * @see com.foxinmy.weixin4j.mp.model.KfSession
792 	 * @see com.foxinmy.weixin4j.mp.model.KfSession.KfSessionCounter
793 	 * @see <a href=
794 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1458044820&token=&lang=zh_CN">
795 	 *      获取客服的会话列表</a>
796 	 */
797 	public KfSessionCounter listKfWaitSession() throws WeixinException {
798 		return customApi.listKfWaitSession();
799 	}
800 
801 	/**
802 	 * 上传群发的图文消息,一个图文消息支持1到10条图文
803 	 *
804 	 * @param articles
805 	 *            图片消息
806 	 * @return 媒体ID
807 	 * @throws WeixinException
808 	 * @see <a href=
809 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
810 	 *      上传图文素材</a>
811 	 * @see com.foxinmy.weixin4j.tuple.MpArticle
812 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
813 	 */
814 	public String uploadMassArticle(List<MpArticle> articles) throws WeixinException {
815 		return massApi.uploadArticle(articles);
816 	}
817 
818 	/**
819 	 * 群发消息
820 	 * <p>
821 	 * 在返回成功时,意味着群发任务提交成功,并不意味着此时群发已经结束,所以,仍有可能在后续的发送过程中出现异常情况导致用户未收到消息,
822 	 * 如消息有时会进行审核、服务器不稳定等,此外,群发任务一般需要较长的时间才能全部发送完毕
823 	 * </p>
824 	 *
825 	 * @param tuple
826 	 *            消息元件
827 	 * @param isToAll
828 	 *            用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,
829 	 *            选择false可根据group_id发送给指定群组的用户
830 	 * @param groupId
831 	 *            分组ID
832 	 * @return 第一个元素为消息发送任务的ID,第二个元素为消息的数据ID,该字段只有在群发图文消息时,才会出现,可以用于在图文分析数据接口中
833 	 * @throws WeixinException
834 	 * @see com.foxinmy.weixin4j.mp.model.Group
835 	 * @see com.foxinmy.weixin4j.tuple.Text
836 	 * @see com.foxinmy.weixin4j.tuple.Image
837 	 * @see com.foxinmy.weixin4j.tuple.Voice
838 	 * @see com.foxinmy.weixin4j.tuple.MpVideo
839 	 * @see com.foxinmy.weixin4j.tuple.MpNews
840 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
841 	 * @see com.foxinmy.weixin4j.tuple.MassTuple
842 	 * @see {@link #getGroups()}
843 	 * @see <a href=
844 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
845 	 *      根据分组群发</a>
846 	 */
847 	public String[] massByGroupId(MassTuple tuple, boolean isToAll, int groupId) throws WeixinException {
848 		return massApi.massByGroupId(tuple, isToAll, groupId);
849 	}
850 
851 	/**
852 	 * 分组ID群发图文消息
853 	 *
854 	 * @param articles
855 	 *            图文列表
856 	 * @param groupId
857 	 *            分组ID
858 	 * @return 第一个元素为消息发送任务的ID,第二个元素为消息的数据ID,该字段只有在群发图文消息时,才会出现,可以用于在图文分析数据接口中
859 	 * @see {@link #massByGroupId(MassTuple,boolean,int)}
860 	 * @see <a href=
861 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
862 	 *      根据分组群发</a>
863 	 * @see com.foxinmy.weixin4j.tuple.MpArticle
864 	 * @throws WeixinException
865 	 */
866 	public String[] massArticleByGroupId(List<MpArticle> articles, int groupId) throws WeixinException {
867 		return massApi.massArticleByGroupId(articles, groupId);
868 	}
869 
870 	/**
871 	 * 群发消息给所有粉丝
872 	 *
873 	 * @param tuple
874 	 *            消息元件
875 	 * @return 第一个元素为消息发送任务的ID,第二个元素为消息的数据ID,该字段只有在群发图文消息时,才会出现,可以用于在图文分析数据接口中
876 	 * @throws WeixinException
877 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
878 	 * @see <a href=
879 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
880 	 *      根据标签群发</a>
881 	 */
882 	public String[] massToAll(MassTuple tuple) throws WeixinException {
883 		return massApi.massToAll(tuple);
884 	}
885 
886 	/**
887 	 * 标签群发消息
888 	 *
889 	 * @param tuple
890 	 *            消息元件
891 	 * @param tagId
892 	 *            标签ID
893 	 * @return 第一个元素为消息发送任务的ID,第二个元素为消息的数据ID,该字段只有在群发图文消息时,才会出现,可以用于在图文分析数据接口中
894 	 * @throws WeixinException
895 	 * @see Tag
896 	 * @see {@link TagApi#listTags()}
897 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
898 	 * @see <a href=
899 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
900 	 *      根据标签群发</a>
901 	 */
902 	public String[] massByTagId(MassTuple tuple, int tagId) throws WeixinException {
903 		return massApi.massByTagId(tuple, tagId);
904 	}
905 
906 	/**
907 	 * 标签群发图文消息
908 	 *
909 	 * @param articles
910 	 *            图文列表
911 	 * @param tagId
912 	 *            标签ID
913 	 * @param ignoreReprint
914 	 *            图文消息被判定为转载时,是否继续群发
915 	 * @return 第一个元素为消息发送任务的ID,第二个元素为消息的数据ID,该字段只有在群发图文消息时,才会出现。
916 	 * @see <a href=
917 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
918 	 *      根据标签群发</a>
919 	 * @see {@link #massByTagId(MassTuple,int)}
920 	 * @see com.foxinmy.weixin4j.tuple.MpArticle
921 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
922 	 * @throws WeixinException
923 	 */
924 	public String[] massArticleByTagId(List<MpArticle> articles, int tagId, boolean ignoreReprint)
925 			throws WeixinException {
926 		return massApi.massArticleByTagId(articles, tagId, ignoreReprint);
927 	}
928 
929 	/**
930 	 * openId群发消息
931 	 *
932 	 * @param tuple
933 	 *            消息元件
934 	 * @param openIds
935 	 *            openId列表
936 	 * @return 第一个元素为消息发送任务的ID,第二个元素为消息的数据ID,该字段只有在群发图文消息时,才会出现,可以用于在图文分析数据接口中
937 	 * @throws WeixinException
938 	 * @see <a href=
939 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
940 	 *      根据openid群发</a>
941 	 * @see {@link UserApi#getUser(String)}
942 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
943 	 */
944 	public String[] massByOpenIds(MassTuple tuple, String... openIds) throws WeixinException {
945 		return massApi.massByOpenIds(tuple, openIds);
946 	}
947 
948 	/**
949 	 * openid群发图文消息
950 	 *
951 	 * @param articles
952 	 *            图文列表
953 	 * @param ignoreReprint
954 	 *            图文消息被判定为转载时,是否继续群发
955 	 * @param openIds
956 	 *            openId列表
957 	 * @return 第一个元素为消息发送任务的ID,第二个元素为消息的数据ID,该字段只有在群发图文消息时,才会出现,可以用于在图文分析数据接口中.
958 	 * @see <a href=
959 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
960 	 *      根据openid群发</a>
961 	 * @see {@link #massByOpenIds(MassTuple,String...)}
962 	 * @see com.foxinmy.weixin4j.tuple.MpArticle
963 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
964 	 * @throws WeixinException
965 	 */
966 	public String[] massArticleByOpenIds(List<MpArticle> articles, boolean ignoreReprint, String... openIds)
967 			throws WeixinException {
968 		return massApi.massArticleByOpenIds(articles, ignoreReprint, openIds);
969 	}
970 
971 	/**
972 	 * 删除群发消息
973 	 *
974 	 * @param msgid
975 	 *            发送出去的消息ID
976 	 * @throws WeixinException
977 	 * @see <a href=
978 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
979 	 *      删除群发</a>
980 	 * @see #deleteMassNews(String, int)
981 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
982 	 */
983 	public ApiResult deleteMassNews(String msgid) throws WeixinException {
984 		return massApi.deleteMassNews(msgid);
985 	}
986 
987 	/**
988 	 * 删除群发消息
989 	 * <p>
990 	 * 请注意,只有已经发送成功的消息才能删除删除消息只是将消息的图文详情页失效,已经收到的用户,还是能在其本地看到消息卡片
991 	 * </p>
992 	 *
993 	 * @param msgid
994 	 *            发送出去的消息ID
995 	 * @param articleIndex
996 	 *            要删除的文章在图文消息中的位置,第一篇编号为1,该字段不填或填0会删除全部文章
997 	 * @throws WeixinException
998 	 * @see <a href=
999 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
1000 	 *      删除群发</a>
1001 	 * @see {@link #massByTagId(MassTuple, int)}
1002 	 * @see {@link #massByOpenIds(MassTuple, String...)
1003 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
1004 	 */
1005 	public ApiResult deleteMassNews(String msgid, int articleIndex) throws WeixinException {
1006 		return massApi.deleteMassNews(msgid, articleIndex);
1007 	}
1008 
1009 	/**
1010 	 * 预览群发消息</br>
1011 	 * 开发者可通过该接口发送消息给指定用户,在手机端查看消息的样式和排版
1012 	 *
1013 	 * @param toUser
1014 	 *            接收用户的openID
1015 	 * @param toWxName
1016 	 *            接收用户的微信号 towxname和touser同时赋值时,以towxname优先
1017 	 * @param tuple
1018 	 *            消息元件
1019 	 * @return 处理结果
1020 	 * @throws WeixinException
1021 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
1022 	 * @see com.foxinmy.weixin4j.tuple.MassTuple
1023 	 * @see <a href=
1024 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
1025 	 *      预览群发消息</a>
1026 	 */
1027 	public ApiResult previewMassNews(String toUser, String toWxName, MassTuple tuple) throws WeixinException {
1028 		return massApi.previewMassNews(toUser, toWxName, tuple);
1029 	}
1030 
1031 	/**
1032 	 * 查询群发发送状态
1033 	 *
1034 	 * @param msgId
1035 	 *            消息ID
1036 	 * @return 消息发送状态
1037 	 * @throws WeixinException
1038 	 * @see com.foxinmy.weixin4j.mp.api.MassApi
1039 	 * @see <a href=
1040 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN">
1041 	 *      查询群发状态</a>
1042 	 */
1043 	public String getMassNewStatus(String msgId) throws WeixinException {
1044 		return massApi.getMassNewStatus(msgId);
1045 	}
1046 
1047 	/**
1048 	 * 获取用户信息
1049 	 *
1050 	 * @param openId
1051 	 *            用户对应的ID
1052 	 * @return 用户对象
1053 	 * @throws WeixinException
1054 	 * @see <a href=
1055 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN">
1056 	 *      获取用户信息</a>
1057 	 * @see com.foxinmy.weixin4j.mp.model.User
1058 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1059 	 * @see {@link #getUser(String,Lang)}
1060 	 */
1061 	public User getUser(String openId) throws WeixinException {
1062 		return userApi.getUser(openId);
1063 	}
1064 
1065 	/**
1066 	 * 获取用户信息
1067 	 * <p>
1068 	 * 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的,对于不同公众号,
1069 	 * 同一用户的openid不同),公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间
1070 	 * </p>
1071 	 *
1072 	 * @param openId
1073 	 *            用户对应的ID
1074 	 * @param lang
1075 	 *            国家地区语言版本
1076 	 * @return 用户对象
1077 	 * @throws WeixinException
1078 	 * @see <a href=
1079 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN">
1080 	 *      获取用户信息</a>
1081 	 * @see com.foxinmy.weixin4j.mp.type.Lang
1082 	 * @see com.foxinmy.weixin4j.mp.model.User
1083 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1084 	 */
1085 	public User getUser(String openId, Lang lang) throws WeixinException {
1086 		return userApi.getUser(openId, lang);
1087 	}
1088 
1089 	/**
1090 	 * 批量获取用户信息
1091 	 *
1092 	 * @param openIds
1093 	 *            用户ID
1094 	 * @return 用户列表
1095 	 * @see <a href=
1096 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN">
1097 	 *      获取用户信息</a>
1098 	 * @see com.foxinmy.weixin4j.mp.model.User
1099 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1100 	 * @throws WeixinException
1101 	 * @see {@link #getUsers(Lang,String[])}
1102 	 */
1103 	public List<User> getUsers(String... openIds) throws WeixinException {
1104 		return userApi.getUsers(openIds);
1105 	}
1106 
1107 	/**
1108 	 * 批量获取用户信息
1109 	 *
1110 	 * @param lang
1111 	 *            国家地区语言版本
1112 	 * @param openIds
1113 	 *            用户ID
1114 	 * @return 用户列表
1115 	 * @see <a href=
1116 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN">
1117 	 *      获取用户信息</a>
1118 	 * @see com.foxinmy.weixin4j.mp.type.Lang
1119 	 * @see com.foxinmy.weixin4j.mp.model.User
1120 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1121 	 * @throws WeixinException
1122 	 */
1123 	public List<User> getUsers(Lang lang, String... openIds) throws WeixinException {
1124 		return userApi.getUsers(lang, openIds);
1125 	}
1126 
1127 	/**
1128 	 * 获取公众号一定数量(10000)的关注者列表 <font corlor="red">请慎重使用</font>
1129 	 *
1130 	 * @param nextOpenId
1131 	 *            下一次拉取数据的openid 不填写则默认从头开始拉取
1132 	 * @return 关注者信息 <font color="red">包含用户的详细信息</font>
1133 	 * @throws WeixinException
1134 	 * @see <a href=
1135 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN">
1136 	 *      获取关注者列表</a>
1137 	 * @see <a href=
1138 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840&token=&lang=zh_CN">
1139 	 *      批量获取用户信息</a>
1140 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1141 	 * @see com.foxinmy.weixin4j.mp.model.Following
1142 	 * @see com.foxinmy.weixin4j.mp.model.User
1143 	 */
1144 	public Following getFollowing(String nextOpenId) throws WeixinException {
1145 		return userApi.getFollowing(nextOpenId);
1146 	}
1147 
1148 	/**
1149 	 * 获取公众号一定数量(10000)的关注者列表
1150 	 *
1151 	 * @param nextOpenId
1152 	 *            下一次拉取数据的openid 不填写则默认从头开始拉取
1153 	 * @return 关注者信息 <font color="red">不包含用户的详细信息</font>
1154 	 * @throws WeixinException
1155 	 * @see <a href=
1156 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840&token=&lang=zh_CN">
1157 	 *      获取关注者列表</a>
1158 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1159 	 * @see com.foxinmy.weixin4j.mp.model.Following
1160 	 */
1161 	public Following getFollowingOpenIds(String nextOpenId) throws WeixinException {
1162 		return userApi.getFollowingOpenIds(nextOpenId);
1163 	}
1164 
1165 	/**
1166 	 * 获取公众号全部的关注者列表 <font corlor="red">请慎重使用</font>
1167 	 * <p>
1168 	 * 当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求,
1169 	 * 将上一次调用得到的返回中的next_openid值,作为下一次调用中的next_openid值
1170 	 * </p>
1171 	 *
1172 	 * @return 用户对象集合
1173 	 * @throws WeixinException
1174 	 * @see <a href=
1175 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840&token=&lang=zh_CN">
1176 	 *      获取关注者列表</a>
1177 	 * @see <a href=
1178 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN">
1179 	 *      批量获取用户信息</a>
1180 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1181 	 * @see com.foxinmy.weixin4j.mp.model.Following
1182 	 * @see com.foxinmy.weixin4j.mp.model.User
1183 	 * @see #getFollowing(String)
1184 	 */
1185 	public List<User> getAllFollowing() throws WeixinException {
1186 		return userApi.getAllFollowing();
1187 	}
1188 
1189 	/**
1190 	 * 获取公众号全部的关注者列表 <font corlor="red">请慎重使用</font>
1191 	 * <p>
1192 	 * 当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求,
1193 	 * 将上一次调用得到的返回中的next_openid值,作为下一次调用中的next_openid值
1194 	 * </p>
1195 	 *
1196 	 * @return 用户openid集合
1197 	 * @throws WeixinException
1198 	 * @see <a href=
1199 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840&token=&lang=zh_CN">
1200 	 *      获取关注者列表</a>
1201 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1202 	 * @see #getFollowingOpenIds(String)
1203 	 */
1204 	public List<String> getAllFollowingOpenIds() throws WeixinException {
1205 		return userApi.getAllFollowingOpenIds();
1206 	}
1207 
1208 	/**
1209 	 * 设置用户备注名
1210 	 *
1211 	 * @param openId
1212 	 *            用户ID
1213 	 * @param remark
1214 	 *            备注名
1215 	 * @throws WeixinException
1216 	 * @see <a href=
1217 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140838&token=&lang=zh_CN">
1218 	 *      设置用户备注名</a>
1219 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1220 	 */
1221 	public ApiResult remarkUserName(String openId, String remark) throws WeixinException {
1222 		return userApi.remarkUserName(openId, remark);
1223 	}
1224 
1225 	/**
1226 	 * 公众号迁移批量转换openid
1227 	 *
1228 	 * @param fromAppid 原账号ID
1229 	 * @param openIds 原账号openid列表,最多不能超过100个
1230 	 * @return 转换后的openid
1231 	 * @throws WeixinException
1232 	 * @see <a href="https://kf.qq.com/faq/1901177NrqMr190117nqYJze.html">openid转换</a>
1233 	 * @see com.foxinmy.weixin4j.mp.model.ChangeOpenidResult
1234 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1235 	 */
1236 	public List<ChangeOpenidResult> batchChangeOpenid(String fromAppid, List<String> openIds) throws WeixinException {
1237 		return userApi.batchChangeOpenid(fromAppid,openIds);
1238 	}
1239 
1240 	/**
1241 	 * 公众号迁移转换所有openid
1242 	 *
1243 	 * @param fromAppid 新appid
1244 	 * @return 转换后的openid
1245 	 * @throws WeixinException
1246 	 * @see <a href="https://kf.qq.com/faq/1901177NrqMr190117nqYJze.html">openid转换</a>
1247 	 * @see com.foxinmy.weixin4j.mp.model.ChangeOpenidResult
1248 	 * @see com.foxinmy.weixin4j.mp.api.UserApi
1249 	 */
1250 	public List<ChangeOpenidResult> changeAllOpenid(String fromAppid) throws WeixinException {
1251 		return userApi.changeAllOpenid(fromAppid);
1252 	}
1253 
1254 	/**
1255 	 * 创建分组
1256 	 *
1257 	 * @param name
1258 	 *            组名称
1259 	 * @return group对象
1260 	 * @throws WeixinException
1261 	 * @see <a href=
1262 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1263 	 *      创建分组</a>
1264 	 * @see com.foxinmy.weixin4j.mp.model.Group
1265 	 * @see com.foxinmy.weixin4j.mp.model.Group#toCreateJson()
1266 	 * @see com.foxinmy.weixin4j.mp.api.GroupApi
1267 	 */
1268 	public Group createGroup(String name) throws WeixinException {
1269 		return groupApi.createGroup(name);
1270 	}
1271 
1272 	/**
1273 	 * 查询所有分组
1274 	 *
1275 	 * @return 组集合
1276 	 * @throws WeixinException
1277 	 * @see <a href=
1278 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1279 	 *      查询所有分组</a>
1280 	 * @see com.foxinmy.weixin4j.mp.model.Group
1281 	 * @see com.foxinmy.weixin4j.mp.api.GroupApi
1282 	 */
1283 	public List<Group> getGroups() throws WeixinException {
1284 		return groupApi.getGroups();
1285 	}
1286 
1287 	/**
1288 	 * 查询用户所在分组
1289 	 *
1290 	 * @param openId
1291 	 *            用户对应的ID
1292 	 * @return 组ID
1293 	 * @throws WeixinException
1294 	 * @see <a href=
1295 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1296 	 *      查询用户所在分组</a>
1297 	 * @see com.foxinmy.weixin4j.mp.model.Group
1298 	 * @see com.foxinmy.weixin4j.mp.api.GroupApi
1299 	 */
1300 	public int getGroupByOpenId(String openId) throws WeixinException {
1301 		return groupApi.getGroupByOpenId(openId);
1302 	}
1303 
1304 	/**
1305 	 * 修改分组名
1306 	 *
1307 	 * @param groupId
1308 	 *            组ID
1309 	 * @param name
1310 	 *            组名称
1311 	 * @throws WeixinException
1312 	 * @see <a href=
1313 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1314 	 *      修改分组名</a>
1315 	 * @see com.foxinmy.weixin4j.mp.model.Group
1316 	 * @see com.foxinmy.weixin4j.mp.api.GroupApi
1317 	 */
1318 	public ApiResult modifyGroup(int groupId, String name) throws WeixinException {
1319 		return groupApi.modifyGroup(groupId, name);
1320 	}
1321 
1322 	/**
1323 	 * 移动用户到分组
1324 	 *
1325 	 * @param groupId
1326 	 *            组ID
1327 	 * @param openId
1328 	 *            用户对应的ID
1329 	 * @throws WeixinException
1330 	 * @see <a href=
1331 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN4">
1332 	 *      移动分组</a>
1333 	 * @see com.foxinmy.weixin4j.mp.model.Group
1334 	 * @see com.foxinmy.weixin4j.mp.api.GroupApi
1335 	 */
1336 	public ApiResult moveGroup(int groupId, String openId) throws WeixinException {
1337 		return groupApi.moveGroup(groupId, openId);
1338 	}
1339 
1340 	/**
1341 	 * 批量移动分组
1342 	 *
1343 	 * @param groupId
1344 	 *            组ID
1345 	 * @param openIds
1346 	 *            用户ID列表(不能超过50个)
1347 	 * @throws WeixinException
1348 	 * @see <a href=
1349 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1350 	 *      批量移动分组</a>
1351 	 * @see com.foxinmy.weixin4j.mp.model.Group
1352 	 * @see com.foxinmy.weixin4j.mp.api.GroupApi
1353 	 */
1354 	public ApiResult moveGroup(int groupId, String... openIds) throws WeixinException {
1355 		return groupApi.moveGroup(groupId, openIds);
1356 	}
1357 
1358 	/**
1359 	 * 删除用户分组,所有该分组内的用户自动进入默认分组.
1360 	 *
1361 	 * @param groupId
1362 	 *            组ID
1363 	 * @throws WeixinException
1364 	 * @see <a href=
1365 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1366 	 *      删除用户分组</a>
1367 	 * @see com.foxinmy.weixin4j.mp.model.Group
1368 	 * @see com.foxinmy.weixin4j.mp.api.GroupApi
1369 	 */
1370 	public ApiResult deleteGroup(int groupId) throws WeixinException {
1371 		return groupApi.deleteGroup(groupId);
1372 	}
1373 
1374 	/**
1375 	 * 自定义菜单
1376 	 *
1377 	 * @param buttons
1378 	 *            菜单列表
1379 	 * @throws WeixinException
1380 	 * @see <a href=
1381 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013&token=&lang=zh_CN">
1382 	 *      创建自定义菜单</a>
1383 	 * @see com.foxinmy.weixin4j.model.Button
1384 	 * @see com.foxinmy.weixin4j.type.ButtonType
1385 	 * @see com.foxinmy.weixin4j.mp.api.MenuApi
1386 	 */
1387 	public ApiResult createMenu(List<Button> buttons) throws WeixinException {
1388 		return menuApi.createMenu(buttons);
1389 	}
1390 
1391 	/**
1392 	 * 查询菜单
1393 	 *
1394 	 * @return 菜单集合
1395 	 * @throws WeixinException
1396 	 * @see <a href=
1397 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141014&token=&lang=zh_CN">
1398 	 *      查询菜单</a>
1399 	 * @see com.foxinmy.weixin4j.model.Button
1400 	 * @see com.foxinmy.weixin4j.mp.api.MenuApi
1401 	 */
1402 	public List<Button> getMenu() throws WeixinException {
1403 		return menuApi.getMenu();
1404 	}
1405 
1406 	/**
1407 	 * 查询全部菜单(包含个性化菜单)
1408 	 *
1409 	 * @return 菜单集合
1410 	 * @throws WeixinException
1411 	 * @see <a href=
1412 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141014&token=&lang=zh_CN">
1413 	 *      普通菜单</a>
1414 	 * @see <a href=
1415 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455782296&token=&lang=zh_CN">
1416 	 *      个性化菜单</a>
1417 	 * @see com.foxinmy.weixin4j.model.Button
1418 	 * @see com.foxinmy.weixin4j.mp.model.Menu
1419 	 * @see com.foxinmy.weixin4j.mp.api.MenuApi
1420 	 */
1421 	public List<Menu> getAllMenu() throws WeixinException {
1422 		return menuApi.getAllMenu();
1423 	}
1424 
1425 	/**
1426 	 * 删除菜单
1427 	 *
1428 	 * @throws WeixinException
1429 	 * @see <a href=
1430 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141015&token=&lang=zh_CN">
1431 	 *      删除菜单</a>
1432 	 * @see com.foxinmy.weixin4j.mp.api.MenuApi
1433 	 * @return 处理结果
1434 	 */
1435 	public ApiResult deleteMenu() throws WeixinException {
1436 		return menuApi.deleteMenu();
1437 	}
1438 
1439 	/**
1440 	 * 创建个性化菜单
1441 	 *
1442 	 * @param buttons
1443 	 *            菜单列表
1444 	 * @param matchRule
1445 	 *            匹配规则 至少要有一个匹配信息是不为空
1446 	 * @return 菜单ID
1447 	 * @throws WeixinException
1448 	 * @see <a href=
1449 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455782296&token=&lang=zh_CN">
1450 	 *      创建个性化菜单</a>
1451 	 * @see com.foxinmy.weixin4j.mp.api.MenuApi
1452 	 * @see com.foxinmy.weixin4j.model.Button
1453 	 */
1454 	public String createCustomMenu(List<Button> buttons, MenuMatchRule matchRule) throws WeixinException {
1455 		return menuApi.createCustomMenu(buttons, matchRule);
1456 	}
1457 
1458 	/**
1459 	 * 删除个性化菜单
1460 	 *
1461 	 * @throws WeixinException
1462 	 * @see <a href=
1463 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455782296&token=&lang=zh_CN">
1464 	 *      删除个性化菜单</a>
1465 	 * @see com.foxinmy.weixin4j.mp.api.MenuApi
1466 	 * @return 处理结果
1467 	 */
1468 	public ApiResult deleteCustomMenu(String menuId) throws WeixinException {
1469 		return menuApi.deleteCustomMenu(menuId);
1470 	}
1471 
1472 	/**
1473 	 * 测试个性化菜单匹配结果
1474 	 *
1475 	 * @param userId
1476 	 *            可以是粉丝的OpenID,也可以是粉丝的微信号。
1477 	 * @see <a href=
1478 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455782296&token=&lang=zh_CN">
1479 	 *      测试个性化菜单</a>
1480 	 * @see com.foxinmy.weixin4j.model.Button
1481 	 * @see com.foxinmy.weixin4j.mp.api.MenuApi
1482 	 * @throws WeixinException
1483 	 * @return 匹配到的菜单配置
1484 	 */
1485 	public List<Button> matchCustomMenu(String userId) throws WeixinException {
1486 		return menuApi.matchCustomMenu(userId);
1487 	}
1488 
1489 	/**
1490 	 * 生成带参数的二维码
1491 	 *
1492 	 * @param parameter
1493 	 *            二维码参数
1494 	 * @return 二维码结果对象
1495 	 * @throws WeixinException
1496 	 * @see com.foxinmy.weixin4j.model.qr.QRResult
1497 	 * @see com.foxinmy.weixin4j.model.qr.QRParameter
1498 	 * @see com.foxinmy.weixin4j.mp.api.QrApi
1499 	 * @see <a href=
1500 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542&token=&lang=zh_CN">
1501 	 *      生成二维码</a>
1502 	 */
1503 	public QRResult createQR(QRParameter parameter) throws WeixinException {
1504 		return qrApi.createQR(parameter);
1505 	}
1506 
1507 	/**
1508 	 * 设置所属行业(每月可修改行业1次,账号仅可使用所属行业中相关的模板)
1509 	 *
1510 	 * @param industryTypes
1511 	 *            所处行业 目前不超过两个
1512 	 * @return 操作结果
1513 	 * @throws WeixinException
1514 	 * @see com.foxinmy.weixin4j.mp.type.IndustryType
1515 	 * @see com.foxinmy.weixin4j.mp.api.TmplApi
1516 	 * @see <a href=
1517 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN">
1518 	 *      设置所处行业</a>
1519 	 */
1520 	public ApiResult setTmplIndustry(IndustryType... industryTypes) throws WeixinException {
1521 		return tmplApi.setTmplIndustry(industryTypes);
1522 	}
1523 
1524 	/**
1525 	 * 获取模板ID
1526 	 *
1527 	 * @param shortId
1528 	 *            模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式
1529 	 * @return 模板ID
1530 	 * @throws WeixinException
1531 	 * @see <a href=
1532 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN">
1533 	 *      获得模板ID</a>
1534 	 * @see com.foxinmy.weixin4j.mp.api.TmplApi
1535 	 */
1536 	public String getTemplateId(String shortId) throws WeixinException {
1537 		return tmplApi.getTemplateId(shortId);
1538 	}
1539 
1540 	/**
1541 	 * 获取模板列表
1542 	 *
1543 	 * @return 模板列表
1544 	 * @see com.foxinmy.weixin4j.mp.model.TemplateMessageInfo
1545 	 * @see <a href=
1546 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN">
1547 	 *      获取模板列表</a>
1548 	 * @see com.foxinmy.weixin4j.mp.api.TmplApi
1549 	 * @throws WeixinException
1550 	 */
1551 	public List<TemplateMessageInfo> getAllTemplates() throws WeixinException {
1552 		return tmplApi.getAllTemplates();
1553 	}
1554 
1555 	/**
1556 	 * 删除模板
1557 	 *
1558 	 * @param templateId
1559 	 *            公众帐号下模板消息ID
1560 	 * @return 处理结果
1561 	 * @see <a href=
1562 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN">
1563 	 *      删除模板</a>
1564 	 * @see com.foxinmy.weixin4j.mp.api.TmplApi
1565 	 * @throws WeixinException
1566 	 */
1567 	public ApiResult deleteTemplate(String templateId) throws WeixinException {
1568 		return tmplApi.deleteTemplate(templateId);
1569 	}
1570 
1571 	/**
1572 	 * 发送模板消息
1573 	 *
1574 	 * @param tplMessage
1575 	 *            模板消息主体
1576 	 * @return 发送的消息ID
1577 	 * @throws WeixinException
1578 	 * @see <a href=
1579 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN">
1580 	 *      模板消息</a>
1581 	 * @see <a href=
1582 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751288&token=&lang=zh_CN"
1583 	 *      >运营规范</a>
1584 	 * @see com.foxinmy.weixin4j.mp.message.TemplateMessage
1585 	 * @seee com.foxinmy.weixin4j.msg.event.TemplatesendjobfinishMessage
1586 	 * @see com.foxinmy.weixin4j.mp.api.TmplApi
1587 	 */
1588 	public String sendTmplMessage(TemplateMessage tplMessage) throws WeixinException {
1589 		return tmplApi.sendTmplMessage(tplMessage);
1590 	}
1591 
1592 	/**
1593 	 * 长链接转短链接
1594 	 *
1595 	 * @param url
1596 	 *            待转换的链接
1597 	 * @return 短链接
1598 	 * @throws WeixinException
1599 	 * @see <a href=
1600 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433600&token=&lang=zh_CN">
1601 	 *      长链接转短链接</a>
1602 	 * @see com.foxinmy.weixin4j.mp.api.HelperApi
1603 	 */
1604 	public String getShorturl(String url) throws WeixinException {
1605 		return helperApi.getShorturl(url);
1606 	}
1607 
1608 	/**
1609 	 * 语义理解
1610 	 *
1611 	 * @param semQuery
1612 	 *            语义理解协议
1613 	 * @return 语义理解结果
1614 	 * @see com.foxinmy.weixin4j.mp.model.SemQuery
1615 	 * @see com.foxinmy.weixin4j.mp.model.SemResult
1616 	 * @see <a href=
1617 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141241&token=&lang=zh_CN">
1618 	 *      语义理解</a>
1619 	 * @see com.foxinmy.weixin4j.mp.api.HelperApi
1620 	 * @throws WeixinException
1621 	 */
1622 	public SemResult semantic(SemQuery semQuery) throws WeixinException {
1623 		return helperApi.semantic(semQuery);
1624 	}
1625 
1626 	/**
1627 	 * 获取微信服务器IP地址
1628 	 *
1629 	 * @return IP地址
1630 	 * @see <a href=
1631 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140187&token=&lang=zh_CN">
1632 	 *      获取IP地址</a>
1633 	 * @see com.foxinmy.weixin4j.mp.api.HelperApi
1634 	 * @throws WeixinException
1635 	 */
1636 	public List<String> getWechatServerIp() throws WeixinException {
1637 		return helperApi.getWechatServerIp();
1638 	}
1639 
1640 	/**
1641 	 * 接口调用次数调用清零:公众号调用接口并不是无限制的。为了防止公众号的程序错误而引发微信服务器负载异常,默认情况下,
1642 	 * 每个公众号调用接口都不能超过一定限制 ,当超过一定限制时,调用对应接口会收到{"errcode":45009,"errmsg":"api freq
1643 	 * out of limit" }错误返回码。
1644 	 *
1645 	 * @see <a href=
1646 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433744592&token=&lang=zh_CN">
1647 	 *      接口清零</a>
1648 	 * @see com.foxinmy.weixin4j.mp.api.HelperApi
1649 	 * @return 操作结果
1650 	 * @throws WeixinException
1651 	 */
1652 	public ApiResult clearQuota() throws WeixinException {
1653 		return helperApi.clearQuota(weixinAccount.getId());
1654 	}
1655 
1656 	/**
1657 	 * 获取公众号当前使用的自定义菜单的配置,如果公众号是通过API调用设置的菜单,则返回菜单的开发配置,
1658 	 * 而如果公众号是在公众平台官网通过网站功能发布菜单,则本接口返回运营者设置的菜单配置。
1659 	 *
1660 	 * @return 菜单集合
1661 	 * @see {@link #getMenu()}
1662 	 * @see <a href=
1663 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1434698695&token=&lang=zh_CN">
1664 	 *      获取自定义菜单配置</a>
1665 	 * @see com.foxinmy.weixin4j.model.Button
1666 	 * @se com.foxinmy.weixin4j.mp.model.MenuSetting
1667 	 * @see com.foxinmy.weixin4j.tuple.MpArticle
1668 	 * @see com.foxinmy.weixin4j.mp.api.HelperApi
1669 	 * @throws WeixinException
1670 	 */
1671 	public MenuSetting getMenuSetting() throws WeixinException {
1672 		return helperApi.getMenuSetting();
1673 	}
1674 
1675 	/**
1676 	 * 获取公众号当前使用的自动回复规则,包括关注后自动回复、消息自动回复(60分钟内触发一次)、关键词自动回复。
1677 	 *
1678 	 * @see com.foxinmy.weixin4j.mp.model.AutoReplySetting
1679 	 * @see com.foxinmy.weixin4j.mp.api.HelperApi
1680 	 * @see <a href=
1681 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751299&token=&lang=zh_CN">
1682 	 *      获取自动回复规则</a>
1683 	 * @throws WeixinException
1684 	 */
1685 	public AutoReplySetting getAutoReplySetting() throws WeixinException {
1686 		return helperApi.getAutoReplySetting();
1687 	}
1688 
1689 	/**
1690 	 * 数据统计
1691 	 *
1692 	 * @param datacubeType
1693 	 *            数据统计类型
1694 	 * @param beginDate
1695 	 *            获取数据的起始日期,begin_date和end_date的差值需小于“最大时间跨度”(比如最大时间跨度为1时,
1696 	 *            begin_date和end_date的差值只能为0,才能小于1),否则会报错
1697 	 * @param endDate
1698 	 *            获取数据的结束日期,end_date允许设置的最大值为昨日
1699 	 * @see com.foxinmy.weixin4j.mp.api.DataApi
1700 	 * @see com.foxinmy.weixin4j.mp.datacube.UserSummary
1701 	 * @see com.foxinmy.weixin4j.mp.datacube.ArticleSummary
1702 	 * @see com.foxinmy.weixin4j.mp.datacube.ArticleTotal
1703 	 * @see com.foxinmy.weixin4j.mp.datacube.ArticleDatacubeShare
1704 	 * @see com.foxinmy.weixin4j.mp.datacube.UpstreamMsg
1705 	 * @see com.foxinmy.weixin4j.mp.datacube.UpstreamMsgDist
1706 	 * @see com.foxinmy.weixin4j.mp.datacube.InterfaceSummary
1707 	 * @return 统计结果
1708 	 * @see <a href=
1709 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141082&token=&lang=zh_CN">
1710 	 *      用户分析</a>
1711 	 * @see <a href=
1712 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141084&token=&lang=zh_CN">
1713 	 *      图文分析</a>
1714 	 * @see <a href=
1715 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141085&token=&lang=zh_CN">
1716 	 *      消息分析</a>
1717 	 * @see <a href=
1718 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141086&token=&lang=zh_CN">
1719 	 *      接口分析</a>
1720 	 * @throws WeixinException
1721 	 */
1722 	public List<?> datacube(DatacubeType datacubeType, Date beginDate, Date endDate) throws WeixinException {
1723 		return dataApi.datacube(datacubeType, beginDate, endDate);
1724 	}
1725 
1726 	/**
1727 	 * 数据统计
1728 	 *
1729 	 * @param datacubeType
1730 	 *            统计类型
1731 	 * @param beginDate
1732 	 *            开始日期
1733 	 * @param offset
1734 	 *            增量 表示向前几天 比如 offset=1 则查询 beginDate的后一天之间的数据
1735 	 * @see {@link #datacube(DatacubeType, Date,Date)}
1736 	 * @see com.foxinmy.weixin4j.mp.api.DataApi
1737 	 * @throws WeixinException
1738 	 */
1739 	public List<?> datacube(DatacubeType datacubeType, Date beginDate, int offset) throws WeixinException {
1740 		return dataApi.datacube(datacubeType, beginDate, offset);
1741 	}
1742 
1743 	/**
1744 	 * 数据统计
1745 	 *
1746 	 * @param datacubeType
1747 	 *            统计类型
1748 	 * @param offset
1749 	 *            增量 表示向后几天 比如 offset=1 则查询 beginDate的前一天之间的数据
1750 	 * @param endDate
1751 	 *            截至日期
1752 	 * @see {@link #datacube(DatacubeType, Date,Date)}
1753 	 * @see com.foxinmy.weixin4j.mp.api.DataApi
1754 	 * @throws WeixinException
1755 	 */
1756 	public List<?> datacube(DatacubeType datacubeType, int offset, Date endDate) throws WeixinException {
1757 		return dataApi.datacube(datacubeType, offset, endDate);
1758 	}
1759 
1760 	/**
1761 	 * 查询日期跨度为0的统计数据(当天)
1762 	 *
1763 	 * @param datacubeType
1764 	 *            统计类型
1765 	 * @param date
1766 	 *            统计日期
1767 	 * @see {@link #datacube(DatacubeType, Date,Date)}
1768 	 * @see com.foxinmy.weixin4j.mp.api.DataApi
1769 	 * @throws WeixinException
1770 	 */
1771 	public List<?> datacube(DatacubeType datacubeType, Date date) throws WeixinException {
1772 		return dataApi.datacube(datacubeType, date);
1773 	}
1774 
1775 	/**
1776 	 * 创建标签
1777 	 *
1778 	 * @param name
1779 	 *            标签名(30个字符以内)
1780 	 * @return 标签对象
1781 	 * @throws WeixinException
1782 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1783 	 * @see com.foxinmy.weixin4j.mp.model.Tag
1784 	 * @see <a href=
1785 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1786 	 *      创建标签</a>
1787 	 */
1788 	public Tag createTag(String name) throws WeixinException {
1789 		return tagApi.createTag(name);
1790 	}
1791 
1792 	/**
1793 	 * 获取标签
1794 	 *
1795 	 * @return 标签列表
1796 	 * @throws WeixinException
1797 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1798 	 * @see com.foxinmy.weixin4j.mp.model.Tag
1799 	 * @see <a href=
1800 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1801 	 *      获取标签</a>
1802 	 */
1803 	public List<Tag> listTags() throws WeixinException {
1804 		return tagApi.listTags();
1805 	}
1806 
1807 	/**
1808 	 * 更新标签
1809 	 *
1810 	 * @param tag
1811 	 *            标签对象
1812 	 * @return 操作结果
1813 	 * @throws WeixinException
1814 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1815 	 * @see com.foxinmy.weixin4j.mp.model.Tag
1816 	 * @see <a href=
1817 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1818 	 *      更新标签</a>
1819 	 */
1820 	public ApiResult updateTag(Tag tag) throws WeixinException {
1821 		return tagApi.updateTag(tag);
1822 	}
1823 
1824 	/**
1825 	 * 删除标签
1826 	 *
1827 	 * @param tagId
1828 	 *            标签id
1829 	 * @return 操作结果
1830 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1831 	 * @throws WeixinException
1832 	 * @see <a href=
1833 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1834 	 *      删除标签</a>
1835 	 */
1836 	public ApiResult deleteTag(int tagId) throws WeixinException {
1837 		return tagApi.deleteTag(tagId);
1838 	}
1839 
1840 	/**
1841 	 * 批量为用户打标签:标签功能目前支持公众号为用户打上最多三个标签
1842 	 *
1843 	 * @param tagId
1844 	 *            标签ID
1845 	 * @param openIds
1846 	 *            用户ID
1847 	 * @return 操作结果
1848 	 * @throws WeixinException
1849 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1850 	 * @see <a href=
1851 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1852 	 *      批量为用户打标签</a>
1853 	 */
1854 	public ApiResult taggingUsers(int tagId, String... openIds) throws WeixinException {
1855 		return tagApi.taggingUsers(tagId, openIds);
1856 	}
1857 
1858 	/**
1859 	 * 批量为用户取消标签
1860 	 *
1861 	 * @param tagId
1862 	 *            标签ID
1863 	 * @param openIds
1864 	 *            用户ID
1865 	 * @return 操作结果
1866 	 * @throws WeixinException
1867 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1868 	 * @see <a href=
1869 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1870 	 *      批量为用户取消标签</a>
1871 	 */
1872 	public ApiResult untaggingUsers(int tagId, String... openIds) throws WeixinException {
1873 		return tagApi.untaggingUsers(tagId, openIds);
1874 	}
1875 
1876 	/**
1877 	 * 获取标签下粉丝列表
1878 	 *
1879 	 * @param tagId
1880 	 *            标签ID
1881 	 * @param nextOpenId
1882 	 *            第一个拉取的OPENID,不填默认从头开始拉取
1883 	 * @return 用户openid列表
1884 	 * @throws WeixinException
1885 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1886 	 * @see <a href=
1887 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1888 	 *      获取标签下粉丝列表</a>
1889 	 */
1890 	public Following getTagFollowingOpenIds(int tagId, String nextOpenId) throws WeixinException {
1891 		return tagApi.getTagFollowingOpenIds(tagId, nextOpenId);
1892 	}
1893 
1894 	/**
1895 	 * 获取标签下粉丝列表 <font corlor="red">请慎重使用</font>
1896 	 *
1897 	 * @param tagId
1898 	 *            标签ID
1899 	 * @param nextOpenId
1900 	 *            第一个拉取的OPENID,不填默认从头开始拉取
1901 	 * @return 被打标签者信息 <font color="red">包含用户的详细信息</font>
1902 	 * @throws WeixinException
1903 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1904 	 * @see <a href=
1905 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1906 	 *      获取标签下粉丝列表</a>
1907 	 */
1908 	public Following getTagFollowing(int tagId, String nextOpenId) throws WeixinException {
1909 		return tagApi.getTagFollowing(tagId, nextOpenId);
1910 	}
1911 
1912 	/**
1913 	 * 获取标签下全部的粉丝列表 <font corlor="red">请慎重使用</font>
1914 	 *
1915 	 * @param tagId
1916 	 *            标签ID
1917 	 * @return 用户openid列表
1918 	 * @throws WeixinException
1919 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1920 	 * @see #getTagFollowingOpenIds(int,String)
1921 	 * @see <a href=
1922 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1923 	 *      获取标签下粉丝列表</a>
1924 	 */
1925 	public List<String> getAllTagFollowingOpenIds(int tagId) throws WeixinException {
1926 		return tagApi.getAllTagFollowingOpenIds(tagId);
1927 	}
1928 
1929 	/**
1930 	 * 获取标签下全部的粉丝列表 <font corlor="red">请慎重使用</font>
1931 	 *
1932 	 * @param tagId
1933 	 *            标签ID
1934 	 * @return 被打标签者信息 <font color="red">包含用户的详细信息</font>
1935 	 * @throws WeixinException
1936 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1937 	 * @see #getTagFollowing(int,String)
1938 	 * @see <a href=
1939 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1940 	 *      获取标签下粉丝列表</a>
1941 	 */
1942 	public List<User> getAllTagFollowing(int tagId) throws WeixinException {
1943 		return tagApi.getAllTagFollowing(tagId);
1944 	}
1945 
1946 	/**
1947 	 * 获取用户身上的标签列表
1948 	 *
1949 	 * @param openId
1950 	 *            用户ID
1951 	 * @return 标签ID集合
1952 	 * @throws WeixinException
1953 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1954 	 * @see <a href=
1955 	 *      "http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">
1956 	 *      获取用户身上的标签列表</a>
1957 	 */
1958 	public Integer[] getUserTags(String openId) throws WeixinException {
1959 		return tagApi.getUserTags(openId);
1960 	}
1961 
1962 	/**
1963 	 * 获取公众号的黑名单列表
1964 	 *
1965 	 * @param nextOpenId
1966 	 *            下一次拉取数据的openid 不填写则默认从头开始拉取
1967 	 * @return 拉黑用户列表 <font color="red">不包含用户的详细信息</font>
1968 	 * @see <a href=
1969 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN"
1970 	 *      >获取黑名单列表</a>
1971 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1972 	 * @see com.foxinmy.weixin4j.mp.model.Following
1973 	 * @throws WeixinException
1974 	 */
1975 	public Following getBalcklistOpenIds(String nextOpenId) throws WeixinException {
1976 		return tagApi.getBalcklistOpenIds(nextOpenId);
1977 	}
1978 
1979 	/**
1980 	 * 获取公众号全部的黑名单列表 <font corlor="red">请慎重使用</font>
1981 	 * <p>
1982 	 * 当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求,
1983 	 * 将上一次调用得到的返回中的next_openid值,作为下一次调用中的next_openid值
1984 	 * </p>
1985 	 *
1986 	 * @return 用户openid集合
1987 	 * @throws WeixinException
1988 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
1989 	 * @see <a href=
1990 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN">
1991 	 *      获取黑名单列表</a>
1992 	 * @see #getFollowingOpenIds(String)
1993 	 */
1994 	public List<String> getAllBalcklistOpenIds() throws WeixinException {
1995 		return tagApi.getAllBalcklistOpenIds();
1996 	}
1997 
1998 	/**
1999 	 * 黑名单操作
2000 	 *
2001 	 * @param blacklist
2002 	 *            true=拉黑用户,false=取消拉黑用户
2003 	 * @param openIds
2004 	 *            用户ID列表
2005 	 * @return 操作结果
2006 	 * @see com.foxinmy.weixin4j.mp.api.TagApi
2007 	 * @see <a href=
2008 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN">
2009 	 *      黑名单操作</a>
2010 	 * @throws WeixinException
2011 	 */
2012 	public ApiResult batchBlacklist(boolean blacklist, String... openIds) throws WeixinException {
2013 		return tagApi.batchBlacklist(blacklist, openIds);
2014 	}
2015 
2016 	/**
2017 	 * 创建卡券:创建卡券接口是微信卡券的基础接口,用于创建一类新的卡券,获取card_id,创建成功并通过审核后,
2018 	 * 商家可以通过文档提供的其他接口将卡券下发给用户,每次成功领取,库存数量相应扣除。
2019 	 *
2020 	 * <li>1.需自定义Code码的商家必须在创建卡券时候,设定use_custom_code为true,且在调用投放卡券接口时填入指定的Code码。
2021 	 * 指定OpenID同理。特别注意:在公众平台创建的卡券均为非自定义Code类型。
2022 	 * <li>2.can_share字段指领取卡券原生页面是否可分享,建议指定Code码、指定OpenID等强限制条件的卡券填写false。
2023 	 * <li>3.创建成功后该卡券会自动提交审核
2024 	 * ,审核结果将通过事件通知商户。开发者可调用设置白名单接口设置用户白名单,领取未通过审核的卡券,测试整个卡券的使用流程。
2025 	 *
2026 	 * @param cardCoupon
2027 	 *            卡券对象
2028 	 * @see <a href=
2029 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025056&token=&lang=zh_CN">
2030 	 *      创建卡券</a>
2031 	 * @see CardCoupons
2032 	 * @see MediaApi#uploadImage(java.io.InputStream, String)
2033 	 * @see com.foxinmy.weixin4j.mp.api.CardApi
2034 	 * @return 卡券ID
2035 	 * @throws WeixinException
2036 	 */
2037 	public String createCardCoupon(CardCoupon cardCoupon) throws WeixinException {
2038 		return cardApi.createCardCoupon(cardCoupon);
2039 	}
2040 
2041 	/**
2042 	 * 查询某个card_id的创建信息、审核状态以及库存数量。
2043 	 *
2044 	 * @param cardId
2045 	 * @return
2046 	 * @throws WeixinException
2047 	 */
2048 	public JSONObject getCardInfo(String cardId) throws WeixinException {
2049 		return cardApi.getCardInfo(cardId);
2050 	}
2051 
2052 	/**
2053 	 * 设置卡券买单:创建卡券之后,开发者可以通过设置微信买单接口设置该card_id支持微信买单功能。值得开发者注意的是,
2054 	 * 设置买单的card_id必须已经配置了门店,否则会报错。
2055 	 *
2056 	 * @param cardId
2057 	 *            卡券ID
2058 	 * @param isOpen
2059 	 *            是否开启买单功能,填true/false
2060 	 * @see #createCardCoupon(CardCoupon)
2061 	 * @see com.foxinmy.weixin4j.mp.api.CardApi
2062 	 * @return 操作结果
2063 	 * @throws WeixinException
2064 	 */
2065 	public ApiResult setCardPayCell(String cardId, boolean isOpen) throws WeixinException {
2066 		return cardApi.setCardPayCell(cardId, isOpen);
2067 	}
2068 
2069 	/**
2070 	 * 设置自助核销:创建卡券之后,开发者可以通过设置微信买单接口设置该card_id支持自助核销功能。值得开发者注意的是,
2071 	 * 设置自助核销的card_id必须已经配置了门店,否则会报错。
2072 	 *
2073 	 * @param cardId
2074 	 *            卡券ID
2075 	 * @param isOpen
2076 	 *            是否开启买单功能,填true/false
2077 	 * @see #createCardCoupon(CardCoupon)
2078 	 * @see com.foxinmy.weixin4j.mp.api.CardApi
2079 	 * @return 操作结果
2080 	 * @throws WeixinException
2081 	 */
2082 	public ApiResult setCardSelfConsumeCell(String cardId, boolean isOpen) throws WeixinException {
2083 		return cardApi.setCardSelfConsumeCell(cardId, isOpen);
2084 	}
2085 
2086 	/**
2087 	 * 创建卡券二维码: 开发者可调用该接口生成一张卡券二维码供用户扫码后添加卡券到卡包。
2088 	 *
2089 	 * @param expireSeconds
2090 	 *            指定二维码的有效时间,范围是60 ~ 1800秒。不填默认为365天有效
2091 	 * @param cardQRs
2092 	 *            二维码参数:二维码领取单张卡券/多张卡券
2093 	 * @return 二维码结果对象
2094 	 * @see com.foxinmy.weixin4j.model.qr.QRResult
2095 	 * @see com.foxinmy.weixin4j.model.qr.QRParameter
2096 	 * @see com.foxinmy.weixin4j.mp.api.CardApi
2097 	 * @see <a href=
2098 	 *      "https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025062&token=&lang=zh_CN">
2099 	 *      投放卡券</a>
2100 	 * @throws WeixinException
2101 	 */
2102 	public QRResult createCardQR(Integer expireSeconds, CardQR... cardQRs) throws WeixinException {
2103 		return cardApi.createCardQR(expireSeconds, cardQRs);
2104 	}
2105 
2106 	/**
2107 	 * 微信礼品卡货架创建接口,开发者可以通过该接口创建一个礼品卡货架并且用于公众号、门店的礼品卡售卖。
2108 	 *
2109 	 * @param page
2110 	 * 			货架对象
2111 	 * @return 货架ID
2112 	 * @throws WeixinException
2113 	 * @see <a href="https://mp.weixin.qq.com/wiki?action=doc&id=215143440770UT7Y&t=0.7237731395289302">微信礼品卡</a>
2114 	 */
2115 	public String addGiftCardPage(GiftCardPage page) throws WeixinException {
2116 		return cardApi.addGiftCardPage(page);
2117 	}
2118 
2119 	/**
2120 	 * 查询礼品卡货架信息接口
2121 	 *
2122 	 * @param pageId
2123 	 * 			货架ID
2124 	 * @return
2125 	 * @throws WeixinException
2126 	 */
2127 	public JSONObject getGiftCardPage(String pageId) throws WeixinException {
2128 		return cardApi.getGiftCardPage(pageId);
2129 	}
2130 
2131 	/**
2132 	 * 下架一个礼品卡货架
2133 	 *
2134 	 * @param pageId
2135 	 * @return
2136 	 * @throws WeixinException
2137 	 */
2138 	public ApiResult maintainGiftCardPage(String pageId) throws WeixinException {
2139 		return cardApi.maintainGiftCardPage(pageId);
2140 	}
2141 
2142 	/**
2143 	 * 下架所有礼品卡货架
2144 	 *
2145 	 * @return
2146 	 * @throws WeixinException
2147 	 */
2148 	public ApiResult maintainAllGiftCardPage() throws WeixinException {
2149 		return cardApi.maintainAllGiftCardPage();
2150 	}
2151 
2152 	/**
2153 	 * 查询当前商户下所有的礼品卡货架id
2154 	 *
2155 	 * @return
2156 	 * @throws WeixinException
2157 	 */
2158 	public String[] getGiftCardPageIdList() throws WeixinException {
2159 		return cardApi.getGiftCardPageIdList();
2160 	}
2161 
2162 	/**
2163 	 * 修改礼品卡货架信息接口
2164 	 *
2165 	 * @param page
2166 	 * 			货架对象
2167 	 * @return
2168 	 * @throws WeixinException
2169 	 */
2170 	public ApiResult updateGiftCardPage(GiftCardPage page) throws WeixinException {
2171 		return cardApi.updateGiftCardPage(page);
2172 	}
2173 
2174 	/**
2175 	 * 申请礼品卡的微信支付权限
2176 	 * @param subMchId
2177 	 * 			子商户号
2178 	 * @return	微信支付商户平台确认地址
2179 	 * @throws WeixinException
2180 	 */
2181 	public String addGiftCardPayWhitelist(String subMchId) throws WeixinException {
2182 		return cardApi.addGiftCardPayWhitelist(subMchId);
2183 	}
2184 
2185 	/**
2186 	 * 绑定商户号到礼品卡小程序
2187 	 *
2188 	 * @param wxaAppid
2189 	 * 			微信小程序ID
2190 	 * @param subMchId
2191 	 * 			微信支付商户号
2192 	 * @return
2193 	 * @throws WeixinException
2194 	 */
2195 	public ApiResult bindGiftCardPaySubMch(String wxaAppid, String subMchId) throws WeixinException {
2196 		return cardApi.bindGiftCardPaySubMch(wxaAppid, subMchId);
2197 	}
2198 
2199 	/**
2200 	 * 上传礼品卡小程序代码
2201 	 *(提供小程序APPID及货架ID,由微信平台为你小程序帐号上传一套现成的礼品卡小程序,直接用于礼品卡售卖)
2202 	 *
2203 	 * @param wxaAppid
2204 	 * 			微信小程序APPID
2205 	 * @param pageId
2206 	 * 			礼品卡货架ID
2207 	 * @return
2208 	 * @throws WeixinException
2209 	 */
2210 	public ApiResult setGiftCardWxaCode(String wxaAppid, String pageId) throws WeixinException {
2211 		return cardApi.setGiftCardWxaCode(wxaAppid, pageId);
2212 	}
2213 
2214 	/**
2215 	 * 当礼品卡被使用完毕或者发生转存、绑定等操作后,开发者可以通过该接口核销用户的礼品卡,使礼品卡在列表中沉底并不再被使用。
2216 	 * 注意:需在礼品卡核销前调用,否则会报40099 已核销的错误
2217 	 *
2218 	 * @param code
2219 	 *          卡券Code码。
2220 	 * @param cardId
2221 	 *          卡券ID,自定义code卡券必填,否则非必填。
2222 	 * @return
2223 	 * @throws WeixinException
2224 	 */
2225 	public ApiResult consumeGiftCard(String code, String cardId) throws WeixinException {
2226 		return cardApi.consumeGiftCard(code, cardId);
2227 	}
2228 
2229 	/**
2230 	 * 开发者可以通过该接口查询到code对应的信息,如余额、有效期、订单号等,主要用于防止在交易完成后丢单的情况下,用于核销/余额变动时兜底处理。
2231 	 *
2232 	 * @param code
2233 	 * 			卡券Code码
2234 	 * @param cardId
2235 	 * 			卡券ID,自定义code卡券必填,否则非必填。
2236 	 * @return
2237 	 * @throws WeixinException
2238 	 */
2239 	public JSONObject getGiftCardInfo(String code, String cardId) throws WeixinException {
2240 		return cardApi.getGiftCardInfo(code, cardId);
2241 	}
2242 
2243 	/**
2244 	 * 查询某个订单号对应的订单详情
2245 	 *
2246 	 * @param orderId
2247 	 *          礼品卡订单号,商户可以通过购买成功的事件推送或者批量查询订单接口获得
2248 	 * @return
2249 	 * @throws WeixinException
2250 	 */
2251 	public JSONObject getGiftCardOrderInfo(String orderId) throws WeixinException {
2252 		return cardApi.getOrderInfo(orderId);
2253 	}
2254 
2255 	/**
2256 	 * 批量查询礼品卡订单信息接口
2257 	 *
2258 	 * @param beginTime
2259 	 * 			查询的时间起点,十位时间戳(utc+8)
2260 	 * @param endTime
2261 	 * 			查询的时间终点,十位时间戳(utc+8)
2262 	 * @param sortType
2263 	 * 			填"ASC" / "DESC",表示对订单创建时间进行“升 / 降”排序
2264 	 * @param offset
2265 	 * 			查询的订单偏移量,如填写100则表示从第100个订单开始拉取
2266 	 * @param limit
2267 	 * 			查询订单的数量,如offset填写100,count填写10,则表示查询第100个到第110个订单
2268 	 * @return
2269 	 * @throws WeixinException
2270 	 */
2271 	public JSONObject getGiftCardOrders(long beginTime, long endTime, String sortType, int offset, int limit) throws WeixinException
2272 	{
2273 		return cardApi.getOrders(beginTime, endTime, sortType, offset, limit);
2274 	}
2275 
2276 	/**
2277 	 * 更新用户礼品卡信息
2278 	 * 当礼品卡被使用后,可以通过该接口变更某个礼品卡的余额信息。
2279 	 *
2280 	 * @param cardInfo
2281 	 * @return
2282 	 * @throws WeixinException
2283 	 */
2284 	public JSONObject updateGiftCardUserBalance(CardInfo cardInfo) throws WeixinException {
2285 		return cardApi.updateGiftCardUserBalance(cardInfo);
2286 	}
2287 
2288 	/**
2289 	 * 对一笔礼品卡订单操作退款
2290 	 *
2291 	 * @param orderId
2292 	 * 			订单ID
2293 	 * @return
2294 	 * @throws WeixinException
2295 	 */
2296 	public ApiResult giftCardOrderRefund(String orderId) throws WeixinException {
2297 		return cardApi.orderRefund(orderId);
2298 	}
2299 
2300 	/**
2301 	 * 打开/关闭已群发文章评论
2302 	 *
2303 	 * @param open
2304 	 *            true为打开,false为关闭
2305 	 * @param msgid
2306 	 *            群发返回的msg_data_id
2307 	 * @param index
2308 	 *            多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文
2309 	 * @return 操作结果
2310 	 * @see com.foxinmy.weixin4j.mp.api.ComponentApi
2311 	 * @see {@link MassApi#massByTagId(com.foxinmy.weixin4j.tuple.MassTuple, int)}
2312 	 * @see {@link MassApi#massByOpenIds(com.foxinmy.weixin4j.tuple.MassTuple, String...)}
2313 	 * @throws WeixinException
2314 	 */
2315 	public ApiResult openComment(boolean open, String msgid, int index) throws WeixinException {
2316 		return commentApi.openComment(open, msgid, index);
2317 	}
2318 
2319 	/**
2320 	 * 获取评论列表
2321 	 *
2322 	 * @param page
2323 	 *            分页信息
2324 	 * @param commentType
2325 	 *            评论类型 为空获取全部类型
2326 	 * @param msgid
2327 	 *            群发返回的msg_data_id
2328 	 * @param index
2329 	 *            多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文
2330 	 * @return 分页数据
2331 	 * @see ArticleComment
2332 	 * @see ArticleCommentType
2333 	 * @see com.foxinmy.weixin4j.mp.api.ComponentApi
2334 	 * @see {@link MassApi#massByTagId(com.foxinmy.weixin4j.tuple.MassTuple, int)}
2335 	 * @see {@link MassApi#massByOpenIds(com.foxinmy.weixin4j.tuple.MassTuple, String...)}
2336 	 * @throws WeixinException
2337 	 */
2338 	public Pagedata<ArticleComment> listArticleComments(Pageable page, ArticleCommentType commentType, String msgid,
2339 			int index) throws WeixinException {
2340 		return commentApi.listArticleComments(page, commentType, msgid, index);
2341 	}
2342 
2343 	/**
2344 	 * 获取评论列表
2345 	 *
2346 	 * @param commentType
2347 	 *            评论类型 为空获取全部类型
2348 	 * @param msgid
2349 	 *            群发返回的msg_data_id
2350 	 * @param index
2351 	 *            多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文
2352 	 * @return 分页数据
2353 	 * @see com.foxinmy.weixin4j.mp.api.ComponentApi
2354 	 * @see #listArticleComments(Pageable, ArticleCommentType, String, int)
2355 	 * @throws WeixinException
2356 	 */
2357 	public List<ArticleComment> listAllArticleComments(ArticleCommentType commentType, String msgid, int index)
2358 			throws WeixinException {
2359 		return commentApi.listAllArticleComments(commentType, msgid, index);
2360 	}
2361 
2362 	/**
2363 	 * 评论标记/取消精选
2364 	 *
2365 	 * @param markelect
2366 	 *            true为标记,false为取消
2367 	 * @param msgid
2368 	 *            群发返回的msg_data_id
2369 	 * @param index
2370 	 *            多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文
2371 	 * @param commentId
2372 	 *            用户评论ID
2373 	 * @return 操作结果
2374 	 * @see com.foxinmy.weixin4j.mp.api.ComponentApi
2375 	 * @see #listArticleComments(Pageable, ArticleCommentType, String, int)
2376 	 * @throws WeixinException
2377 	 */
2378 	public ApiResult markelectComment(boolean markelect, String msgid, int index, String commentId)
2379 			throws WeixinException {
2380 		return commentApi.markelectComment(markelect, msgid, index, commentId);
2381 	}
2382 
2383 	/**
2384 	 * 删除评论
2385 	 *
2386 	 * @param msgid
2387 	 *            群发返回的msg_data_id
2388 	 * @param index
2389 	 *            多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文
2390 	 * @param commentId
2391 	 *            用户评论ID
2392 	 * @return 操作结果
2393 	 * @see com.foxinmy.weixin4j.mp.api.ComponentApi
2394 	 * @see #listArticleComments(Pageable, ArticleCommentType, String, int)
2395 	 * @throws WeixinException
2396 	 */
2397 	public ApiResult deleteComment(String msgid, int index, String commentId) throws WeixinException {
2398 		return commentApi.deleteComment(msgid, index, commentId);
2399 	}
2400 
2401 	/**
2402 	 * 回复评论
2403 	 *
2404 	 * @param msgid
2405 	 *            群发返回的msg_data_id
2406 	 * @param index
2407 	 *            多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文
2408 	 * @param commentId
2409 	 *            用户评论ID
2410 	 * @param content
2411 	 *            回复内容
2412 	 * @return 操作结果
2413 	 * @see com.foxinmy.weixin4j.mp.api.ComponentApi
2414 	 * @see #listArticleComments(Pageable, ArticleCommentType, String, int)
2415 	 * @throws WeixinException
2416 	 */
2417 	public ApiResult replyComment(String msgid, int index, String commentId, String content) throws WeixinException {
2418 		return commentApi.replyComment(msgid, index, commentId, content);
2419 	}
2420 
2421 	/**
2422 	 * 删除回复
2423 	 *
2424 	 * @param msgid
2425 	 *            群发返回的msg_data_id
2426 	 * @param index
2427 	 *            多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文
2428 	 * @param commentId
2429 	 *            用户评论ID
2430 	 * @return 操作结果
2431 	 * @see com.foxinmy.weixin4j.mp.api.ComponentApi
2432 	 * @see #listArticleComments(Pageable, ArticleCommentType, String, int)
2433 	 * @throws WeixinException
2434 	 */
2435 	public ApiResult deleteCommentReply(String msgid, int index, String commentId) throws WeixinException {
2436 		return commentApi.deleteCommentReply(msgid, index, commentId);
2437 	}
2438 
2439 	public final static String VERSION = Consts.VERSION;
2440 }