之前寫了微信開發(fā)的配置篇,很多朋友說還是不了解微信怎么與后臺交互的审胸,但是想想寫的太深還不如去看微信開發(fā)文檔梭纹,所以寫一個基礎(chǔ)變介紹下微信與后臺的交互
一羹膳、怎么勾搭上微信
其實很多人很好奇向瓷,我們是怎么實現(xiàn)與微信建立聯(lián)系的肠套,如果看過前一篇的朋友都了解,需要一個配置猖任,但是這個配置的后臺怎么寫呢?其實就是一個相同路徑的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");?
? ? ? // 隨機(jī)數(shù)?
? ? ? String nonce = request.getParameter("nonce");? */
? ? ? // 隨機(jī)字符串?
? ? ? String echostr = request.getParameter("echostr"); //沒有加密直接返回,加密了詳見開發(fā)者文檔
? ? ? PrintWriter out = response.getWriter();?
? ? ? out.print(echostr);
? ? ? out.flush();
? ? ? out.close();
? }?
首先吐槽下自己的代碼瓷耙,我不知道這個的里面怎么調(diào)行間距朱躺,直接從IDEA 復(fù)制過來的
這樣微信在第一次發(fā)動過來GET信息就得到了想要的驗證,等于告訴微信搁痛,親~长搀,開業(yè)了,你可以來消費了
二鸡典、怎么跟微信互通有無
到這了就有人疑問了源请,微信那后面微信過來的消息呢?別急,就像門店一樣開業(yè)只有一次谁尸,后面的不會每次來都是開業(yè)流程了舅踪,所以下面用到了PSOT請求的接口
@RequestMapping(value= "/service", method= RequestMethod.POST)
@ResponseBody
? public final void doPostMethod(HttpServletRequest request, HttpServletResponse response){
? // 響應(yīng)消息? 調(diào)用核心業(yè)務(wù)類接收消息、處理消息
? ? ? PrintWriter out = null;
? try {
? ? ? // 將請求良蛮、響應(yīng)的編碼均設(shè)置為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上代碼樣式很規(guī)范的,╮( ̄▽ ̄")╭?
跟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("歡迎關(guān)注車值銷公眾號祷舀!");
? ? ? respMessage = MessageUtil.wxMessageToXml(textMessage);
? ? ? return respMessage;
? }
首先是解析微信發(fā)來的信息,我是把一個XML解析成一個map烹笔,當(dāng)然有很多種解析方法裳扯,你也可以解析成OBJ,但是公司有一個既有的XML 解析谤职,就不要再去做過多的沒必要的事情了饰豺,下面是XML解析方法以供參考,技術(shù)達(dá)人可以忽略
public final static Map parseXml(final HttpServletRequest request){
? ? ? // 將解析結(jié)果存儲在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();
? // 得到根元素的所有子節(jié)點
? List elementList = root.elements();
? root=null;
? // 遍歷所有子節(jié)點
? 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;
? }?
轉(zhuǎn)換成自己定義的格式允蜈,這里微信根據(jù)在公眾號中的不同操作返回不同的消息類型冤吨,而XML參數(shù)也有所不同,但是饶套,有幾個必定會有的且我們肯定要用到的參數(shù):ToUserName漩蟆、FromUserName、MsgType
MsgType 〖寺: 消息類型
ToUserName : 開發(fā)者微信號
FromUserName〉±睢: 發(fā)送方帳號(一個OpenID)
知道這些參數(shù),那么下步你就可以判斷誰在公眾號做了什么類型的操作蛤克,這個類型操作的信息是什么捺癞,然后你這個類型的這個消息要給返回什么東西,把你的消息封裝成一個微信知道的XML 字符串然后返給微信构挤,微信就會根據(jù)你定義的返回消息的類型髓介,然后展示給用戶,這樣就完成了用戶在微信操作筋现,然后我們返回特定的內(nèi)容唐础,我上面的processWchatMessage就是一個簡單的關(guān)注發(fā)送文本消息箱歧,取消關(guān)注刪除用戶信息。
歡迎各路大神留言批評指正與討論一膨,小程序基礎(chǔ)篇醞釀中