微信java開發工具集
微信java開發工具集,本項目主要分為兩大塊:微信消息路由器、微信 Java API
特性列表:
-
不基于Servlet、和其他MVC框架,僅作為工具使用,提供更多的靈活性
-
詳盡的單元測試代碼,可以拿來當example用
-
詳盡的javadoc
-
access token過期自動刷新的功能
-
微信服務端繁忙自動重試的功能
-
提供微信錯誤信息的異常處理機制
微信消息路由器
你可以使用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. 開發人員需實現自己的WxMessageHandler和WxMessageInterceptor
2. 配置路由規則時要按照從細到粗的原則,否則可能消息可能會被提前處理
3. 默認情況下消息只會被處理一次,除非使用 Rule.next()
4. 規則的結束必須用Rule.end()或者Rule.next(),否則不會生效
5. 具體使用可以看源代碼中的WxMessageRouterTest單元測試,或者查看Javadoc
微信Java API
使用WxService可以調用微信API。目前已實現除“微信小店”以外的所有功能。
構造WxService
WxService依賴于WxConfigStorage,WxConfigStorage是微信客戶端配置所存儲的地方,本工具提供了默認基于內存的實現: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