微信開(kāi)發(fā)-基礎(chǔ)篇

之前寫(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ǔ)篇醞釀中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容