dev --- 3.8.0.A版本, openProject引用 ; formao-live --- 3.7.0.B 版本, formallProject引用
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
Daniel Qian 464c308c46 修改javadoc, readme, 单元测试代码 pirms 10 gadiem
src 修改javadoc, readme, 单元测试代码 pirms 10 gadiem
.gitignore 添加客服消息接口 pirms 10 gadiem
LICENSE Initial commit pirms 10 gadiem
README.md 修改javadoc, readme, 单元测试代码 pirms 10 gadiem
pom.xml 重构单元测试代码 pirms 10 gadiem

README.md

weixin-java-tools

微信java开发工具,本项目提供了两个主要特性:微信消息路由器、微信Java API

微信消息路由器

你可以使用WxMessageRouter来对微信推送过来的消息、事件进行路由,交给的WxMessageHandler处理。

使用方法:

WxMessageRouter router = new WxMessageRouter();
router
  .rule()
      .msgType("MSG_TYPE")
      .event("EVENT")
      .eventKey("EVENT_KEY")
      .content("CONTENT")
      .interceptor(interceptor).handler(handler)
  .end()
  .rule()
      .msgType("MSG_TYPE")
      .handler(handler)
  .end()
;

// 将WxXmlMessage交给消息路由器
WxXmlMessage message = WxXmlMessage.fromXml(xml);
router.route(message);
  1. 开发人员需实现自己的WxMessageHandlerWxMessageInterceptor
  2. 配置路由规则时要按照从细到粗的原则,否则可能消息可能会被提前处理
  3. 默认情况下消息只会被处理一次,除非使用 Rule.next()
  4. 规则的结束必须用Rule.end()或者Rule.next(),否则不会生效
  5. 具体使用可以看源代码中的WxMessageRouterTest单元测试,或者查看Javadoc

微信Java API

使用WxService可以调用微信API。目前实现的功能有:

构造WxService

WxService依赖于WxConfigStorageWxConfigStorage是微信客户端配置所存储的地方,本工具提供了默认的WxInMemoryConfigStorage,这是一个存储在内存中的实现,生产环境中需要开发人员提供自己的实现。

WxConfigStorage config = new WxInMemoryConfigStorage();
config.setAppId(...);
config.setSecret(...);
config.setToken(...);
WxServiceImpl wxService = new WxServiceImpl();
wxService.setWxConfigStorage(config);

验证消息

if(!wxService.checkSignature(timestamp, nonce, signature)) {
   // 验证失败
}

刷新access_token

wxService.accessTokenRefresh();

刷新后的accessToken存在WxConfigStorage中。

多媒体文件

上传多媒体文件

InputStream inputStream = ...;
File file = ...;
WxMediaUploadResult res = wxService.mediaUpload(mediaType, fileType, inputStream);
// 或者
res = wxService.mediaUpload(mediaType, file);
res.getType();
res.getCreated_at();
res.getMedia_id();
res.getThumb_media_id();

下载多媒体文件

// 获得一个在系统临时目录的一个文件
File file = wxService.mediaDownload(media_id);

分组管理

创建分组

WxGroup res = wxService.groupCreate("测试分组1");

获得分组列表

List<WxGroup> groupList = wxService.groupGet();

更新分组名

WxGroup g = new WxGroup();
g.setId(...);
g.setName(...);
wxService.groupUpdate(group);

用户管理

更新用户备注名

wxService.userUpdateRemark(openid, "测试备注名");

获得用户信息

String lang = "zh_CN"; //语言
WxUser user = wxService.userInfo(openid, lang);

获得用户列表

WxUserList wxUserList = wxService.userList(next_openid);

查询用户所在分组

long groupid = wxService.userGetGroup(openid);

将用户移到分组

wxService.userUpdateGroup(openid, to_groupid);

发送客服消息

WxCustomMessage message = new WxCustomMessage();
// 设置消息的内容等信息
wxService.customMessageSend(message);

群发消息

下面用用户列表群发(WxMassOpenIdsMessage)做例子,如果要使用分组群发,则使用WxMassGroupMessage即可。

文本消息

WxMassOpenIdsMessage massMessage = new WxMassOpenIdsMessage();
massMessage.setMsgtype(WxConsts.MASS_MSG_TEXT);
massMessage.setContent("消息内容");
massMessage.getTouser().add(openid);

WxMassSendResult massResult = wxService.massOpenIdsMessageSend(massMessage);

视频消息

WxMediaUploadResult uploadMediaRes = wxService.mediaUpload(WxConsts.MEDIA_VIDEO, WxConsts.FILE_MP4, inputStream);

// 把视频变成可被群发的媒体
WxMassVideo video = new WxMassVideo();
video.setTitle("测试标题");
video.setDescription("测试描述");
video.setMedia_id(uploadMediaRes.getMedia_id());
WxMassUploadResult uploadResult = wxService.massVideoUpload(video);

WxMassOpenIdsMessage massMessage = new WxMassOpenIdsMessage();
massMessage.setMsgtype(WxConsts.MASS_MSG_VIDEO);
massMessage.setMedia_id(uploadResult.getMedia_id());
massMessage.getTouser().add(openid);

WxMassSendResult massResult = wxService.massOpenIdsMessageSend(massMessage);

图片消息

WxMediaUploadResult uploadMediaRes = wxService.mediaUpload(WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, inputStream);

WxMassOpenIdsMessage massMessage = new WxMassOpenIdsMessage();
massMessage.setMsgtype(WxConsts.MASS_MSG_IMAGE);
massMessage.setMedia_id(uploadMediaRes.getMedia_id());
massMessage.getTouser().add(openid);

WxMassSendResult massResult = wxService.massOpenIdsMessageSend(massMessage);

语音消息

WxMediaUploadResult uploadMediaRes = wxService.mediaUpload(WxConsts.MEDIA_VOICE, WxConsts.FILE_MP3, inputStream);

WxMassOpenIdsMessage massMessage = new WxMassOpenIdsMessage();
massMessage.setMsgtype(WxConsts.MASS_MSG_VOICE);
massMessage.setMedia_id(uploadMediaRes.getMedia_id());
massMessage.getTouser().add(openid);

WxMassSendResult massResult = wxService.massOpenIdsMessageSend(massMessage);

图文消息

// 先上传图文消息里需要的图片
WxMediaUploadResult uploadMediaRes = wxService.mediaUpload(WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, inputStream);

WxMassNews news = new WxMassNews();
WxMassNewsArticle article1 = new WxMassNewsArticle();
article1.setTitle("标题1");
article1.setContent("内容1");
article1.setThumb_media_id(uploadMediaRes.getMedia_id());
news.addArticle(article1);

WxMassNewsArticle article2 = new WxMassNewsArticle();
article2.setTitle("标题2");
article2.setContent("内容2");
article2.setThumb_media_id(uploadMediaRes.getMedia_id());
article2.setShow_cover_pic(true);
article2.setAuthor("作者2");
article2.setContent_source_url("www.baidu.com");
article2.setDigest("摘要2");
news.addArticle(article2);

WxMassUploadResult massUploadResult = wxService.massNewsUpload(news);

WxMassOpenIdsMessage massMessage = new WxMassOpenIdsMessage();
massMessage.setMsgtype(WxConsts.MASS_MSG_NEWS);
massMessage.setMedia_id(uploadResult.getMedia_id());
massMessage.getTouser().add(openid);

WxMassSendResult massResult = wxService.massOpenIdsMessageSend(massMessage);

自定义菜单

创建自定义菜单

WxMenu wxMenu = new WxMenu();
// 设置菜单
wxService.menuCreate(wxMenu);

删除自定义菜单

wxService.menuDelete();

获得自定义菜单

WxMenu wxMenu = wxService.menuGet()

二维码

获得二维码ticket

// 临时ticket
WxQrCodeTicket ticket = wxService.qrCodeCreateTmpTicket(scene, expire_seconds);
// 永久ticket
WxQrCodeTicket ticket = wxService.qrCodeCreateLastTicket(scene);

换取二维码图片

WxQrCodeTicket ticket = ...;
// 获得一个在系统临时目录下的文件,是jpg格式的
File file = wxService.qrCodePicture(ticket);

短链接

String shortUrl = wxService.shortUrl("www.baidu.com");

如何执行单元测试

src/test/resources/test-config.sample.xml 改成 test-config.xml 设置appId, secret, accessToken(可选), openId

mvn clean test