访问令牌实体类
package com.tdzh.weixin.Entity;
public class AccessToken {
private String accessToken;
private Long expiresIn;
private AccessToken() {
}
public AccessToken(String accessToken, String expiresIn) {
this.accessToken = accessToken;
this.expiresIn = System.currentTimeMillis() + Integer.parseInt(expiresIn) - 60;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public long getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(long expiresIn) {
this.expiresIn = expiresIn;
}
public boolean isExpired(){
return System.currentTimeMillis() > expiresIn;
}
}
开发所需工具类
package com.tdzh.weixin.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.tdzh.weixin.Entity.AccessToken;
import com.tdzh.weixin.Entity.resp.*;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class WxUtil {
@Value("${WeChat.token}")
private String token;
@Value("${WeChat.appID}")
private String appID;
@Value("${WeChat.appsecret}")
private String appsecret;
private AccessToken accessToken;
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
boolean cdata = true;
@SuppressWarnings("unchecked")
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
}
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
public boolean WxAccess(String signature,String timestamp,String nonce){
String[] args = {token,timestamp,nonce};
Arrays.sort(args);
String str = args[0] + args[1] + args[2];
String sha1 = getSha1(str);
return sha1.equals(signature);
}
public String getSha1(String str){
try {
MessageDigest md = MessageDigest.getInstance("sha1");
byte[] digest = md.digest(str.getBytes());
char[] chars = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
StringBuffer sb = new StringBuffer();
for(byte b : digest){
sb.append(chars[b>>4 & 15]);
sb.append(chars[b & 15]);
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
public void createAccessToken(){
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET".replace("APPID",appID).replace("APPSECRET",appsecret);
Map<String, Object> stringObjectMap = HttpClientUtil.doGet(url);
String content = (String) stringObjectMap.get("content");
JSONObject jsonObject = JSON.parseObject(content);
String access_token = (String) jsonObject.get("access_token");
String expires_in = jsonObject.get("expires_in").toString();
accessToken = new AccessToken(access_token,expires_in);
}
public String getAccessToken(){
if (null == accessToken || accessToken.isExpired()) {
createAccessToken();
}
return accessToken.getAccessToken();
}
public Map<String,Object> parseXml(HttpServletRequest request){
Map<String,Object> resultMap = new HashMap<String,Object>();
InputStream inputStream = null;
try {
inputStream = request.getInputStream();
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
Element root = document.getRootElement();
List<Element> elementList = root.elements();
for (Element e : elementList){
resultMap.put(e.getName(), e.getText());
}
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} finally {
try {
if(null != inputStream){
inputStream.close();
inputStream = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return resultMap;
}
public String textMessageToXml(TextMessageResp textMessageResp){
xstream.alias("xml",textMessageResp.getClass());
return xstream.toXML(textMessageResp);
}
public String imageMessageToXml(ImageMessageResp imageMessageResp) {
xstream.alias("xml",imageMessageResp.getClass());
return xstream.toXML(imageMessageResp);
}
public String voiceMessageToXml(VoiceMessageResp voiceMessageResp) {
xstream.alias("xml",voiceMessageResp.getClass());
return xstream.toXML(voiceMessageResp);
}
public String videoMessageToXml(VideoMessageResp videoMessageResp) {
xstream.alias("xml",videoMessageResp.getClass());
return xstream.toXML(videoMessageResp);
}
public String musicMessageToXml(MusicMessageResp musicMessageResp) {
xstream.alias("xml",musicMessageResp.getClass());
return xstream.toXML(musicMessageResp);
}
public String articleMessageToXml(ArticleMessageResp articleMessageResp) {
xstream.alias("xml",articleMessageResp.getClass());
return xstream.toXML(articleMessageResp);
}
}
微信公众号接入及被动回复图文消息(controller)
package com.tdzh.weixin.controller;
import com.tdzh.weixin.Entity.*;
import com.tdzh.weixin.Entity.resp.*;
import com.tdzh.weixin.util.WxUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@RestController
@RequestMapping("/check")
public class CheckController {
@Autowired
private WxUtil wxUtil;
@GetMapping("/weChat")
public String checkGetRequestFromWeChat(HttpServletRequest request){
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
System.out.println("校验中...");
boolean flag = wxUtil.WxAccess(signature, timestamp, nonce);
if(flag){
System.out.println("校验成功...");
return echostr;
}else{
System.out.println("校验失败...");
return null;
}
}
@PostMapping("/weChat")
public String weChatMessageReceive(HttpServletRequest request){
Map<String, Object> stringObjectMap = wxUtil.parseXml(request);
String returnMessage = null;
String msgType = (String) stringObjectMap.get("MsgType");
switch (msgType){
case "text" :
TextMessageResp textMessageResp = new TextMessageResp(stringObjectMap,"hello ,boy");
returnMessage = wxUtil.textMessageToXml(textMessageResp);
break;
case "image" :
Image image = new Image(mediaId);
ImageMessageResp imageMessageResp = new ImageMessageResp(stringObjectMap,image);
returnMessage = wxUtil.imageMessageToXml(imageMessageResp);
break;
case "voice" :
Voice voice = new Voice(mediaId);
VoiceMessageResp voiceMessageResp = new VoiceMessageResp(stringObjectMap, voice);
returnMessage = wxUtil.voiceMessageToXml(voiceMessageResp);
break;
case "video" :
Video video = new Video(mediaId,"下雨了","雨下的很大");
VideoMessageResp videoMessageResp = new VideoMessageResp(stringObjectMap, video);
returnMessage = wxUtil.videoMessageToXml(videoMessageResp);
break;
case "music" :
Music music = new Music("安河桥","这是一首很棒的民谣","https://music.163.com/outchain/player?type=2&id=566521546&auto=1&height=66","https://music.163.com/outchain/player?type=2&id=566521546&auto=1&height=66","hkbuYI2WOLNLBCwtsOO3KlP6Vaxcc8OMQ1H4pfPzsIk11SgL5wozM72kfkCLFMlw");
MusicMessageResp musicMessageResp = new MusicMessageResp(stringObjectMap,music);
returnMessage = wxUtil.musicMessageToXml(musicMessageResp);
break;
case "news":
Item item = new Item("文章1","这是一篇测试文章","http://pic25.nipic.com/20121112/9252150_150552938000_2.jpg","https://www.baidu.com/");
Articles articles = new Articles(item);
ArticleMessageResp articleMessageResp = new ArticleMessageResp(stringObjectMap,1,articles);
returnMessage = wxUtil.articleMessageToXml(articleMessageResp);
break;
}
return returnMessage;
}
}
controller中使用到的实体类
BaseMessageResp 基础信息响应对象
package com.tdzh.weixin.Entity.resp;
import java.util.Date;
import java.util.Map;
public class BaseMessageResp {
private String ToUserName;
private String FromUserName;
private Long CreateTime;
private String MsgType;
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public Long getCreateTime() {
return CreateTime;
}
public void setCreateTime(Long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public BaseMessageResp(Map<String,Object> requestMap){
this.MsgType = (String) requestMap.get("MsgType");
this.FromUserName = (String) requestMap.get("ToUserName");
this.ToUserName = (String) requestMap.get("FromUserName");
this.CreateTime = new Date().getTime();
}
}
TextMessageResp 文本消息响应
package com.tdzh.weixin.Entity.resp;
import java.util.Map;
public class TextMessageResp extends BaseMessageResp{
private String Content;
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public TextMessageResp(Map<String, Object> requestMap, String content) {
super(requestMap);
this.Content = content;
}
}
ImageMessageResp 图片消息响应
package com.tdzh.weixin.Entity.resp;
import com.tdzh.weixin.Entity.Image;
import java.util.Map;
public class ImageMessageResp extends BaseMessageResp {
private Image Image;
public Image getImage() {
return Image;
}
public void setImage(Image image) {
this.Image = image;
}
public ImageMessageResp(Map<String, Object> requestMap, Image image) {
super(requestMap);
this.Image = image;
}
}
Image 图片
package com.tdzh.weixin.Entity;
public class Image {
private String MediaId;
public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
public Image(String mediaId) {
MediaId = mediaId;
}
}
VoiceMessageResp 语音消息响应
package com.tdzh.weixin.Entity.resp;
import com.tdzh.weixin.Entity.Voice;
import java.util.Map;
public class VoiceMessageResp extends BaseMessageResp{
private Voice Voice;
public VoiceMessageResp(Map<String, Object> requestMap, Voice voice) {
super(requestMap);
this.Voice = voice;
}
public com.tdzh.weixin.Entity.Voice getVoice() {
return Voice;
}
public void setVoice(com.tdzh.weixin.Entity.Voice voice) {
Voice = voice;
}
}
Voice 语音
package com.tdzh.weixin.Entity;
public class Voice {
private String MediaId;
public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
public Voice(String mediaId) {
MediaId = mediaId;
}
}
VideoMessageResp 视频消息响应
package com.tdzh.weixin.Entity.resp;
import com.tdzh.weixin.Entity.Video;
import java.util.Map;
public class VideoMessageResp extends BaseMessageResp {
private Video Video;
public VideoMessageResp(Map<String, Object> requestMap, Video Video) {
super(requestMap);
this.Video = Video;
}
public Video getVideo() {
return Video;
}
public void setVideo(Video Video) {
this.Video = Video;
}
}
Video 视频
package com.tdzh.weixin.Entity;
public class Video {
private String MediaId;
private String Title;
private String Description;
public Video(){
}
public Video(String mediaId, String title, String description) {
this.MediaId = mediaId;
this.Title = title;
this.Description = description;
}
public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
}
MusicMessageResp 音乐消息响应
package com.tdzh.weixin.Entity.resp;
import com.tdzh.weixin.Entity.Music;
import java.util.Map;
public class MusicMessageResp extends BaseMessageResp{
private Music Music;
public MusicMessageResp(Map<String, Object> requestMap,Music Music) {
super(requestMap);
this.Music = Music;
}
public Music getMusic() {
return Music;
}
public void setMusic(Music music) {
this.Music = music;
}
}
Music 音乐
package com.tdzh.weixin.Entity;
public class Music {
private String Title;
private String Description;
private String MusicURL;
private String HQMusicUrl;
private String ThumbMediaId;
public Music(String title, String description, String musicURL, String HQMusicUrl, String thumbMediaId) {
Title = title;
Description = description;
MusicURL = musicURL;
this.HQMusicUrl = HQMusicUrl;
ThumbMediaId = thumbMediaId;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
this.Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
this.Description = description;
}
public String getMusicURL() {
return MusicURL;
}
public void setMusicURL(String musicURL) {
this.MusicURL = musicURL;
}
public String getHQMusicUrl() {
return HQMusicUrl;
}
public void setHQMusicUrl(String HQMusicUrl) {
this.HQMusicUrl = HQMusicUrl;
}
public String getThumbMediaId() {
return ThumbMediaId;
}
public void setThumbMediaId(String thumbMediaId) {
this.ThumbMediaId = thumbMediaId;
}
}
ArticleMessageResp 图文消息响应
package com.tdzh.weixin.Entity.resp;
import com.tdzh.weixin.Entity.Articles;
import java.util.Map;
public class ArticleMessageResp extends BaseMessageResp{
private Integer ArticleCount;
private Articles Articles;
public ArticleMessageResp(Map<String, Object> requestMap, Integer ArticleCount , Articles Articles) {
super(requestMap);
this.ArticleCount = ArticleCount;
this.Articles = Articles;
}
public Integer getArticleCount() {
return ArticleCount;
}
public void setArticleCount(Integer articleCount) {
ArticleCount = articleCount;
}
public com.tdzh.weixin.Entity.Articles getArticles() {
return Articles;
}
public void setArticles(com.tdzh.weixin.Entity.Articles articles) {
Articles = articles;
}
}
Articles 图文消息列表
package com.tdzh.weixin.Entity;
public class Articles {
private Item item;
public Articles(Item item) {
this.item = item;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
}
Item 单个图文
package com.tdzh.weixin.Entity;
public class Item {
private String Title;
private String Description;
private String PicUrl;
private String Url;
public Item(String title, String description, String picUrl, String url) {
this.Title = title;
this.Description = description;
this.PicUrl = picUrl;
this.Url = url;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
this.Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
this.Description = description;
}
public String getPicUrl() {
return PicUrl;
}
public void setPicUrl(String picUrl) {
this.PicUrl = picUrl;
}
public String getUrl() {
return Url;
}
public void setUrl(String url) {
this.Url = url;
}
}