微信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