版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:https://blog.csdn.net/qq_31122833。 https://blog.csdn.net/qq_31122833/article/details/83653454
环境有了,接下来就是在java代码中对接环境。
1、新写一个Controller:命名WXController.java
/**
* 接入开发走这个GET
*/
@RequestMapping(value = "/validate", method = RequestMethod.GET)
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
//接收微信用来校验信息的内置规定参数
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
//按微信指定的规则进行校验并做出响应
if(CheckSignatureUtil.checkSignature(signature, timestamp, nonce)){
out.print(echostr);
}
}
/**
* 配置RequestMethod.POST,用于接收处理消息
*/
@RequestMapping(value = "/validate", method = RequestMethod.POST)
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String message = "success";
try {
//把微信返回的xml信息转义成map
Map<String, String> map = XmlUtil.xmlToMap(request);
String fromUserName = map.get("FromUserName");//消息来源用户标识
String toUserName = map.get("ToUserName");//消息目的用户标识
String msgType = map.get("MsgType");//消息类型
String content = map.get("Content");//消息内容
String eventType = map.get("Event");
if(MessageUtil.REQ_MESSAGE_TYPE_EVENT.equals(msgType)){//如果为事件类型
if(MessageUtil.EVENT_TYPE_SUBSCRIBE.equals(eventType)){//处理订阅事件
message = MessageUtil.subscribeForText(toUserName, fromUserName);
}
}
} catch (DocumentException e) {
e.printStackTrace();
}finally{
out.println(message);
if(out!=null){
out.close();
}
}
}
/**
* 获取access_token
* @param appid
* @param secret
* @return
*/
private Token checkToken(String appid,String secret){
Token token = (Token)redisService.getObject(appid);
if (token==null){
token = TokenAPI.token(appid,secret);
if(token!=null){
redisService.setObject(appid,token);
redisService.expire(appid,7100);
}
}else{
logger.info("redis have token,appid ="+appid);
}
return token;
}
其中,这个WXController.java下的validate有两个方法,一个get、一个post,get是判断为微信官方操作调用,post是具体做什么,比如监听到用户订阅你的公众号,那么就回复:感谢你的订阅(或其他消息)
获取token,是调用微信接口时,不可缺少的一步,这个token不是第一篇的token,而是临时令牌,根据你的appid和AppSecret获取,调用微信api获取:获取后微信会帮你存7200秒,你把这个token存进redis,因为这个接口有次数限制的,别老是去重新获取token