之前寫(xiě)了微信開(kāi)發(fā)的配置篇,很多朋友說(shuō)還是不了解微信怎么與后臺(tái)交互的,但是想想寫(xiě)的太深還不如去看微信開(kāi)發(fā)文檔,所以寫(xiě)一個(gè)基礎(chǔ)變介紹下微信與后臺(tái)的交互
一、怎么勾搭上微信
其實(shí)很多人很好奇,我們是怎么實(shí)現(xiàn)與微信建立聯(lián)系的,如果看過(guò)前一篇的朋友都了解,需要一個(gè)配置,但是這個(gè)配置的后臺(tái)怎么寫(xiě)呢?其實(shí)就是一個(gè)相同路徑的post和get請(qǐng)求代碼如下
@RequestMapping(value = "/service", method = RequestMethod.GET)//value可以自定義
@ResponseBody
public void? doGetMethod(HttpServletRequest request, HttpServletResponse response) throws Exception{?
/*String signature = request.getParameter("signature");?
? ? ? // 時(shí)間戳?
? ? ? String timestamp = request.getParameter("timestamp");?
? ? ? // 隨機(jī)數(shù)?
? ? ? String nonce = request.getParameter("nonce");? */
? ? ? // 隨機(jī)字符串?
? ? ? String echostr = request.getParameter("echostr"); //沒(méi)有加密直接返回,加密了詳見(jiàn)開(kāi)發(fā)者文檔
? ? ? PrintWriter out = response.getWriter();?
? ? ? out.print(echostr);
? ? ? out.flush();
? ? ? out.close();
? }?
首先吐槽下自己的代碼,我不知道這個(gè)的里面怎么調(diào)行間距,直接從IDEA 復(fù)制過(guò)來(lái)的
這樣微信在第一次發(fā)動(dòng)過(guò)來(lái)GET信息就得到了想要的驗(yàn)證,等于告訴微信,親~,開(kāi)業(yè)了,你可以來(lái)消費(fèi)了
二、怎么跟微信互通有無(wú)
到這了就有人疑問(wèn)了,微信那后面微信過(guò)來(lái)的消息呢?別急,就像門(mén)店一樣開(kāi)業(yè)只有一次,后面的不會(huì)每次來(lái)都是開(kāi)業(yè)流程了,所以下面用到了PSOT請(qǐng)求的接口
@RequestMapping(value= "/service", method= RequestMethod.POST)
@ResponseBody
? public final void doPostMethod(HttpServletRequest request, HttpServletResponse response){
? // 響應(yīng)消息? 調(diào)用核心業(yè)務(wù)類(lèi)接收消息、處理消息
? ? ? PrintWriter out = null;
? try {
? ? ? // 將請(qǐng)求、響應(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();
}
}
? }?
同樣請(qǐng)忽略掉代碼樣式,在IDEA上代碼樣式很規(guī)范的,╮( ̄▽?zhuān)?)╭?
跟get接口一樣,幾乎是一模一樣,但是注意下面這個(gè)代碼,這就是微信的核心處理類(lèi),同樣你可以隨意命名,返回一個(gè)微信明白的XML字符串就行了
String respMessage =coreService.processWchatMessage(request);
三、怎么知道用戶(hù)要什么,我們?cè)摻o什么
下面看看?processWchatMessage里面都干了些什么
public final String processWchatMessage(HttpServletRequest request) {
? ? ? String respMessage = "success";
? ? ? Map requestMap = MessageUtil.parseXml(request);// xml請(qǐng)求解析
? ? ? String toUserName? ? ? ? = requestMap.get("ToUserName");
? ? ? String fromUserName? ? ? = requestMap.get("FromUserName");
? ? ? String msgType? ? ? ? ? = requestMap.get("MsgType");// 消息類(lèi)型
? ? ? 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)注車(chē)值銷(xiāo)公眾號(hào)!");
? ? ? respMessage = MessageUtil.wxMessageToXml(textMessage);
? ? ? return respMessage;
? }
首先是解析微信發(fā)來(lái)的信息,我是把一個(gè)XML解析成一個(gè)map,當(dāng)然有很多種解析方法,你也可以解析成OBJ,但是公司有一個(gè)既有的XML 解析,就不要再去做過(guò)多的沒(méi)必要的事情了,下面是XML解析方法以供參考,技術(shù)達(dá)人可以忽略
public final static Map parseXml(final HttpServletRequest request){
? ? ? // 將解析結(jié)果存儲(chǔ)在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é)點(diǎn)
? List elementList = root.elements();
? root=null;
? // 遍歷所有子節(jié)點(diǎn)
? 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ù)在公眾號(hào)中的不同操作返回不同的消息類(lèi)型,而XML參數(shù)也有所不同,但是,有幾個(gè)必定會(huì)有的且我們肯定要用到的參數(shù):ToUserName、FromUserName、MsgType
MsgType ?。骸∠㈩?lèi)型
ToUserName : 開(kāi)發(fā)者微信號(hào)
FromUserName?。骸“l(fā)送方帳號(hào)(一個(gè)OpenID)
知道這些參數(shù),那么下步你就可以判斷誰(shuí)在公眾號(hào)做了什么類(lèi)型的操作,這個(gè)類(lèi)型操作的信息是什么,然后你這個(gè)類(lèi)型的這個(gè)消息要給返回什么東西,把你的消息封裝成一個(gè)微信知道的XML 字符串然后返給微信,微信就會(huì)根據(jù)你定義的返回消息的類(lèi)型,然后展示給用戶(hù),這樣就完成了用戶(hù)在微信操作,然后我們返回特定的內(nèi)容,我上面的processWchatMessage就是一個(gè)簡(jiǎn)單的關(guān)注發(fā)送文本消息,取消關(guān)注刪除用戶(hù)信息。
歡迎各路大神留言批評(píng)指正與討論,小程序基礎(chǔ)篇醞釀中