之前写了微信开发的配置篇,很多朋友说还是不了解微信怎么与后台交互的,但是想想写的太深还不如去看微信开发文档,所以写一个基础变介绍下微信与后台的交互
一、怎么勾搭上微信
其实很多人很好奇,我们是怎么实现与微信建立联系的,如果看过前一篇的朋友都了解,需要一个配置,但是这个配置的后台怎么写呢?其实就是一个相同路径的post和get请求代码如下
@RequestMapping(value = "/service", method = RequestMethod.GET)//value可以自定义
@ResponseBody
public void doGetMethod(HttpServletRequest request, HttpServletResponse response) throws Exception{
/*String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce"); */
// 随机字符串
String echostr = request.getParameter("echostr"); //没有加密直接返回,加密了详见开发者文档
PrintWriter out = response.getWriter();
out.print(echostr);
out.flush();
out.close();
}
首先吐槽下自己的代码,我不知道这个的里面怎么调行间距,直接从IDEA 复制过来的
这样微信在第一次发动过来GET信息就得到了想要的验证,等于告诉微信,亲~,开业了,你可以来消费了
二、怎么跟微信互通有无
到这了就有人疑问了,微信那后面微信过来的消息呢?别急,就像门店一样开业只有一次,后面的不会每次来都是开业流程了,所以下面用到了PSOT请求的接口
@RequestMapping(value= "/service", method= RequestMethod.POST)
@ResponseBody
public final void doPostMethod(HttpServletRequest request, HttpServletResponse response){
// 响应消息 调用核心业务类接收消息、处理消息
PrintWriter out = null;
try {
// 将请求、响应的编码均设置为UTF-8(防止中文乱码)
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String respMessage =coreService.processWchatMessage(request);
out = response.getWriter();
out.print(respMessage);
out.flush();
} catch (Exception e) {
logger.error("'wechat index' has an exception :"+Thread.currentThread().getId()+"|"+e);
e.printStackTrace();
} finally{
if(out!=null){
out.close();
}
}
}
同样请忽略掉代码样式,在IDEA上代码样式很规范的,╮( ̄▽ ̄")╭
跟get接口一样,几乎是一模一样,但是注意下面这个代码,这就是微信的核心处理类,同样你可以随意命名,返回一个微信明白的XML字符串就行了
String respMessage =coreService.processWchatMessage(request);
三、怎么知道用户要什么,我们该给什么
下面看看 processWchatMessage里面都干了些什么
public final String processWchatMessage(HttpServletRequest request) {
String respMessage = "success";
Map requestMap = MessageUtil.parseXml(request);// xml请求解析
String toUserName = requestMap.get("ToUserName");
String fromUserName = requestMap.get("FromUserName");
String msgType = requestMap.get("MsgType");// 消息类型
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
String eventType = requestMap.get("Event");
if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
redisClient.del(fromUserName);
}
}
TextMessage textMessage = new TextMessage(fromUserName,toUserName);
textMessage.setContent("欢迎关注车值销公众号!");
respMessage = MessageUtil.wxMessageToXml(textMessage);
return respMessage;
}
首先是解析微信发来的信息,我是把一个XML解析成一个map,当然有很多种解析方法,你也可以解析成OBJ,但是公司有一个既有的XML 解析,就不要再去做过多的没必要的事情了,下面是XML解析方法以供参考,技术达人可以忽略
public final static Map parseXml(final HttpServletRequest request){
// 将解析结果存储在HashMap中
Map map = new HashMap();
InputStream inputStream = null;
try {
// 从request中取得输入流
inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
reader=null;
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List elementList = root.elements();
root=null;
// 遍历所有子节点
for (Element e : elementList)
map.put(e.getName(), e.getText());
} catch (Exception e) {
logger.error("wx:ex|parsexml|"+e);
e.printStackTrace();
} finally{
try {
if(inputStream!=null){
inputStream.close();
inputStream = null;
}
} catch (IOException e) {
logger.error("wx:ex|parsexml|"+e);
e.printStackTrace();
}
}
return map;
}
转换成自己定义的格式,这里微信根据在公众号中的不同操作返回不同的消息类型,而XML参数也有所不同,但是,有几个必定会有的且我们肯定要用到的参数:ToUserName、FromUserName、MsgType
MsgType : 消息类型
ToUserName : 开发者微信号
FromUserName : 发送方帐号(一个OpenID)
知道这些参数,那么下步你就可以判断谁在公众号做了什么类型的操作,这个类型操作的信息是什么,然后你这个类型的这个消息要给返回什么东西,把你的消息封装成一个微信知道的XML 字符串然后返给微信,微信就会根据你定义的返回消息的类型,然后展示给用户,这样就完成了用户在微信操作,然后我们返回特定的内容,我上面的processWchatMessage就是一个简单的关注发送文本消息,取消关注删除用户信息。
欢迎各路大神留言批评指正与讨论,小程序基础篇酝酿中
网友评论