摘要:消息推送也是微信公眾號開發更為有趣的功能,涉及到文本消息圖片消息語音消息視頻消息音樂消息以及圖文消息。在文件中創建文件用于消息的管理。
一、寫在前面的話
??當用戶發送消息給公眾號時(或某些特定的用戶操作引發的事件推送時),會產生一個POST請求,開發者可以在響應包(Get)中返回特定XML結構,來對該消息進行響應。
??消息推送也是微信公眾號開發更為有趣的功能,涉及到文本消息、圖片消息、語音消息、視頻消息、音樂消息以及圖文消息。并且最為有趣的功能當屬消息加解密了,當然由于篇文章篇幅的原因我會在下一篇文章中去著重說明。
二、微信消息管理1.捕獲消息信息
??在文章的第一句話中,為我們指明了微信消息產生的請求方式為 POST,因此首先我們就去對 Node.js 的 Post 請求進行監聽。
??在我們的 app.js 文件中添加一個POST監聽,并將獲取的結果輸出:
//用于處理所有進入 3000 端口 post 的連接請求 app.post("/",function(req,res){ var buffer = []; //監聽 data 事件 用于接收數據 req.on("data",function(data){ buffer.push(data); }); //監聽 end 事件 用于處理接收完成的數據 req.on("end",function(){ //輸出接收完成的數據 console.log(Buffer.concat(buffer).toString("utf-8")); }); });
??隨后將 Node.js 啟動后映射至外網,關注我們的微信公眾號,在控制臺中則會看到:
??打開 微信幫助文檔 ,點擊左側菜單的消息管理,選擇其子菜單 接收事件推送,如圖:
??從上圖我們不難看出,微信 接收事件推送 確實很多,而我們最終目標是要實現,在用戶觸發事件時返回其相應的回復消息。因此我們總結一下我們要實現的步驟:
解析 XML ,使用 Event 參數判斷事件類型
返回相應的事件信息
總結完實現步驟后,我們就開始動手實現第一個被動回復消息吧。
2.以關注事件為例,實現第一個被動回復
??解析 XML 我這里使用了 第三方的包 xml2js(npm install xml2js ),并在 wechat.js 中引入。
parseString = require("xml2js").parseString;//引入xml2js包
??為 WeChat 對象添加一個消息處理的方法 handleMsg,將 app.js 中捕獲 POST 實現的寫入在其代碼塊中,并使用 xml2js 解析,代碼如下
/** * 微信消息 */ WeChat.prototype.handleMsg = function(req,res){ var buffer = []; //監聽 data 事件 用于接收數據 req.on("data",function(data){ buffer.push(data); }); //監聽 end 事件 用于處理接收完成的數據 req.on("end",function(){ var msgXml = Buffer.concat(buffer).toString("utf-8"); //解析xml parseString(msgXml,{explicitArray : false},function(err,result){ if(!err){ //打印解析結果 console.log(result); }else{ //打印錯誤信息 console.log(err); } }) }); }
??在 app.js 中調用 handleMsg 方法
//用于處理所有進入 3000 端口 post 的連接請求 app.post("/",function(req,res){ wechatApp.handleMsg(req,res); });
??完成了代碼的編寫后,將公眾號重新關注
最后打印為一個 JSON 格式的結果,也就是預示著我們第1步工作已經完成。下面開始我們的第2步,微信被動回復。
??在文章的第一句話的后邊提到 開發者可以在響應包(Get)中返回特定XML結構,那么這個特定的 XML 結構在哪呢?再次打開微信幫助文檔 ,點擊左側菜單的消息管理,選擇其子菜單 被動回復消息,如圖:
??直接來到 回復文本消息:
??拿到回復文本消息格式后,我們就來為關注我們公眾號的同學打聲招呼吧。在 wechat 文件中 創建 msg.js 文件用于消息的管理。
并在 msg.js 中添加處理文本消息的接口,并在 wechat.js 中引用
"use strict" //設置為嚴格模式 //回復文本消息 exports.txtMsg = function(toUser,fromUser,content){ var xmlContent = ""; return xmlContent; } "; xmlContent += " "; xmlContent += " "+ new Date().getTime() +" "; xmlContent += ""; xmlContent += "
修改 wechat.js 中 handleMsg 方法
/** * 微信消息 */ WeChat.prototype.handleMsg = function(req,res){ var buffer = []; //監聽 data 事件 用于接收數據 req.on("data",function(data){ buffer.push(data); }); //監聽 end 事件 用于處理接收完成的數據 req.on("end",function(){ var msgXml = Buffer.concat(buffer).toString("utf-8"); //解析xml parseString(msgXml,{explicitArray : false},function(err,result){ if(!err){ result = result.xml; var toUser = result.ToUserName; //接收方微信 var fromUser = result.FromUserName;//發送仿微信 //判斷事件類型 switch(result.Event.toLowerCase()){ case "subscribe": //回復消息 res.send(msg.txtMsg(fromUser,toUser,"歡迎關注 hvkcoder 公眾號,一起斗圖吧")); break; } }else{ //打印錯誤信息 console.log(err); } }) }); }
?? 沒錯就是這么簡單。這里有個邏輯是這樣的 toUser 表示接收方,也就是咱們的微信公眾號;fromUser 表示發送方,也就是觸發事件的用戶。而我們要回復用戶時,此時 接收方 就是 觸發事件的用戶,而發送方則是 我們的微信公眾號。這塊比較繞,大家可以慢慢去理解。
??由于我們還沒有對微信的素材管理進行講解,這里我們暫時跳過 圖片消息、語音消息、視頻消息、以及音樂消息。直接實現圖文消息的推送。
3.圖文消息
??在 msg.js 文件中添加圖文XML模板
//回復圖文消息 exports.graphicMsg = function(toUser,fromUser,contentArr){ var xmlContent = ""; return xmlContent; } } "; xmlContent += " "; xmlContent += " "+ new Date().getTime() +" "; xmlContent += ""; xmlContent += " "+contentArr.length+" "; xmlContent += ""; contentArr.map(function(item,index){ xmlContent+=" - "; xmlContent+="
"; }); xmlContent += ""; xmlContent+=" "; xmlContent+=" "; xmlContent+=" "; xmlContent+="
??更改 wechat.js 文件中的 handleMsg 方法,將圖消息推送響應在點擊事件中
case "click": var contentArr = [ {Title:"Node.js 微信自定義菜單",Description:"使用Node.js實現自定義微信菜單",PicUrl:"http://img.blog.csdn.net/20170605162832842?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHZrQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast",Url:"http://blog.csdn.net/hvkcoder/article/details/72868520"}, {Title:"Node.js access_token的獲取、存儲及更新",Description:"Node.js access_token的獲取、存儲及更新",PicUrl:"http://img.blog.csdn.net/20170528151333883?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHZrQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast",Url:"http://blog.csdn.net/hvkcoder/article/details/72783631"}, {Title:"Node.js 接入微信公眾平臺開發",Description:"Node.js 接入微信公眾平臺開發",PicUrl:"http://img.blog.csdn.net/20170605162832842?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHZrQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast",Url:"http://blog.csdn.net/hvkcoder/article/details/72765279"} ]; //回復圖文消息 res.send(msg.graphicMsg(fromUser,toUser,contentArr)); break;
??點擊菜單下的 今日推薦
??圖文推送就是這么簡單的被我們給實現了。
4.接收普通消息
??微信除了為我們接收事件推送外,千萬不要忘了微信還能通過發送文字。而這一節我們也就來玩玩微信接收普通消息。
??打開 微信幫助文檔 ,點擊左側菜單的消息管理,選擇其子菜單 接收普通消息,如圖:
??依然如接收事件推送的套路,不同的是參數發生了改變,但這并步影響我們的開發,只需要幾步就能夠完美的解決。更改 wechat.js 文件 handleMsg方法,這里我先暫時只針對用戶輸入的文本消息做處理,其他的跟其類似。
//判斷消息類型 if(result.MsgType.toLowerCase() === "event"){ //判斷事件類型 switch(result.Event.toLowerCase()){ case "subscribe": //回復消息 var content = "歡迎關注 hvkcoder 公眾號,一起斗圖吧。回復以下數字: "; content += "1.你是誰 "; content += "2.關于Node.js "; content += "回復 “文章” 可以得到圖文推送哦~ "; res.send(msg.txtMsg(fromUser,toUser,"")); break; case "click": var contentArr = [ {Title:"Node.js 微信自定義菜單",Description:"使用Node.js實現自定義微信菜單",PicUrl:"http://img.blog.csdn.net/20170605162832842?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHZrQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast",Url:"http://blog.csdn.net/hvkcoder/article/details/72868520"}, {Title:"Node.js access_token的獲取、存儲及更新",Description:"Node.js access_token的獲取、存儲及更新",PicUrl:"http://img.blog.csdn.net/20170528151333883?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHZrQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast",Url:"http://blog.csdn.net/hvkcoder/article/details/72783631"}, {Title:"Node.js 接入微信公眾平臺開發",Description:"Node.js 接入微信公眾平臺開發",PicUrl:"http://img.blog.csdn.net/20170605162832842?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHZrQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast",Url:"http://blog.csdn.net/hvkcoder/article/details/72765279"} ]; //回復圖文消息 res.send(msg.graphicMsg(fromUser,toUser,contentArr)); break; } }else{ //判斷消息類型為 文本消息 if(result.MsgType.toLowerCase() === "text"){ //根據消息內容返回消息信息 switch(result.Content){ case "1": res.send(msg.txtMsg(fromUser,toUser,"Hello !我的英文名字叫 H-VK")); break; case "2": res.send(msg.txtMsg(fromUser,toUser,"Node.js是一個開放源代碼、跨平臺的JavaScript語言運行環境,采用Google開發的V8運行代碼,使用事件驅動、非阻塞和異步輸入輸出模型等技術來提高性能,可優化應用程序的傳輸量和規模。這些技術通常用于數據密集的事實應用程序")); break; case "文章": var contentArr = [ {Title:"Node.js 微信自定義菜單",Description:"使用Node.js實現自定義微信菜單",PicUrl:"http://img.blog.csdn.net/20170605162832842?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHZrQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast",Url:"http://blog.csdn.net/hvkcoder/article/details/72868520"}, {Title:"Node.js access_token的獲取、存儲及更新",Description:"Node.js access_token的獲取、存儲及更新",PicUrl:"http://img.blog.csdn.net/20170528151333883?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHZrQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast",Url:"http://blog.csdn.net/hvkcoder/article/details/72783631"}, {Title:"Node.js 接入微信公眾平臺開發",Description:"Node.js 接入微信公眾平臺開發",PicUrl:"http://img.blog.csdn.net/20170605162832842?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHZrQ29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast",Url:"http://blog.csdn.net/hvkcoder/article/details/72765279"} ]; //回復圖文消息 res.send(msg.graphicMsg(fromUser,toUser,contentArr)); break; default : res.send(msg.txtMsg(fromUser,toUser,"沒有這個選項哦")); break; } } }
??OK !至此我們就完成了微信消息管理的講解,似乎真的沒有什么難度。預留了一章,主要想要去細說一下說消息加解密,因為在網上涉及 Node.js 微信消息加解密的文章確實很少,微信幫助文檔給的案例也沒有 Node.js 的詳細說明。
??最后文章代碼部分,由于網上編輯器的代碼換行做的不是很好可能有些亂,建議可以去我的 github 上查看源碼。
??文章源代碼:https://github.com/SilenceHVK... 。對文章有不正確之處,請給予糾正。github源代碼請順手給個 Star,最后感謝您的閱讀。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92174.html
摘要:打開中文網文檔打開微信開發者文檔三接入微信公眾平臺創建項目首先我們在電腦的任意磁盤上創建文件夾,命名隨意,我這命名為隨后在文件夾中創建兩個文件一個是,另一個為。接入驗證再次進入微信公眾平臺在左側菜單點擊基本配置,如圖點擊修改配置。 一、寫在前面的話 ??Node.js是一個開放源代碼、跨平臺的JavaScript語言運行環境,采用Google開發的V8運行代碼,使用事件驅動、非阻塞和異...
摘要:沒有耐心閱讀的同學,可以直接前往學習全棧最后一公里。我下面會羅列一些,我自己錄制過的一些項目,或者其他的我覺得可以按照這個路線繼續深入學習的項目資源。 showImg(https://segmentfault.com/img/bVMlke?w=833&h=410); 本文技術軟文,閱讀需謹慎,長約 7000 字,通讀需 5 分鐘 大家好,我是 Scott,本文通過提供給大家學習的方法,...
摘要:是一款開源的微信個人號,進行了一系列的封裝,提供簡單好用的接口,然后開發者可以在其之上進行微信機器人的開發。注意這行代碼實現了登錄微信個人號并打印出所收到的消息。大家可以根據自己的需要定制出強大的個人微信號機器人。 現在,日常生活已經離不開微信,本文將會拋磚引玉演示如何使用wechaty操作微信個人號做一些有意思的東西,可以實現自動通過好友請求、關鍵詞回復、自動拉群等功能。大大提高了社...
摘要:一寫在前面的話上一篇文章中,我們使用成功的實現了的獲取存儲以及更新,這篇文章我們來實現微信的自定義菜單功能。二自定義微信菜單微信文檔步驟在開始碼代碼之前,我們依然是先理清實現的思路,再開始編寫實現代碼。 一、寫在前面的話 ??上一篇文章中,我們使用 Node.js 成功的實現了access_token 的獲取、存儲以及更新,這篇文章我們來實現微信的自定義菜單功能。showImg(htt...
閱讀 2083·2023-04-26 02:41
閱讀 2146·2021-09-24 09:47
閱讀 1546·2019-08-30 15:53
閱讀 1205·2019-08-30 13:01
閱讀 1885·2019-08-29 11:27
閱讀 2857·2019-08-28 17:55
閱讀 1740·2019-08-26 14:00
閱讀 3377·2019-08-26 10:18