dev --- 3.8.0.A版本, openProject引用 ; formao-live --- 3.7.0.B 版本, formallProject引用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Daniel Qian 13a71464dd Update README.md 10 years ago
src modify javadoc 10 years ago
.gitignore 添加客服消息接口 10 years ago
LICENSE Initial commit 10 years ago
README.md Update README.md 10 years ago
pom.xml 重构单元测试代码 10 years ago

README.md

weixin-java-tools

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

本项目的特点:

  1. 不基于Servlet、和其他MVC框架,仅作为工具使用,提供更多的灵活性
  2. 详尽的单元测试代码,可以拿来当example用
  3. 详尽的javadoc
  4. access token过期自动刷新的功能
  5. 微信错误信息的异常处理机制

微信消息路由器

你可以使用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