成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【Node.js 微信公眾號(hào)實(shí)戰(zhàn)】4.Node.js 微信消息管理

lewinlee / 750人閱讀

摘要:消息推送也是微信公眾號(hào)開發(fā)更為有趣的功能,涉及到文本消息圖片消息語音消息視頻消息音樂消息以及圖文消息。在文件中創(chuàng)建文件用于消息的管理。

一、寫在前面的話

??當(dāng)用戶發(fā)送消息給公眾號(hào)時(shí)(或某些特定的用戶操作引發(fā)的事件推送時(shí)),會(huì)產(chǎn)生一個(gè)POST請(qǐng)求,開發(fā)者可以在響應(yīng)包(Get)中返回特定XML結(jié)構(gòu),來對(duì)該消息進(jìn)行響應(yīng)。

??消息推送也是微信公眾號(hào)開發(fā)更為有趣的功能,涉及到文本消息、圖片消息、語音消息、視頻消息、音樂消息以及圖文消息。并且最為有趣的功能當(dāng)屬消息加解密了,當(dāng)然由于篇文章篇幅的原因我會(huì)在下一篇文章中去著重說明。

二、微信消息管理

1.捕獲消息信息

??在文章的第一句話中,為我們指明了微信消息產(chǎn)生的請(qǐng)求方式為 POST,因此首先我們就去對(duì) Node.js 的 Post 請(qǐng)求進(jìn)行監(jiān)聽。

??在我們的 app.js 文件中添加一個(gè)POST監(jiān)聽,并將獲取的結(jié)果輸出:

//用于處理所有進(jìn)入 3000 端口 post 的連接請(qǐng)求
app.post("/",function(req,res){
    var buffer = [];
    //監(jiān)聽 data 事件 用于接收數(shù)據(jù)
    req.on("data",function(data){
        buffer.push(data);
    });
    //監(jiān)聽 end 事件 用于處理接收完成的數(shù)據(jù)
    req.on("end",function(){
    //輸出接收完成的數(shù)據(jù)   
         console.log(Buffer.concat(buffer).toString("utf-8"));
    });
});

??隨后將 Node.js 啟動(dòng)后映射至外網(wǎng),關(guān)注我們的微信公眾號(hào),在控制臺(tái)中則會(huì)看到:

??打開 微信幫助文檔 ,點(diǎn)擊左側(cè)菜單的消息管理,選擇其子菜單 接收事件推送,如圖:

??從上圖我們不難看出,微信 接收事件推送 確實(shí)很多,而我們最終目標(biāo)是要實(shí)現(xiàn),在用戶觸發(fā)事件時(shí)返回其相應(yīng)的回復(fù)消息。因此我們總結(jié)一下我們要實(shí)現(xiàn)的步驟:

解析 XML ,使用 Event 參數(shù)判斷事件類型

返回相應(yīng)的事件信息

總結(jié)完實(shí)現(xiàn)步驟后,我們就開始動(dòng)手實(shí)現(xiàn)第一個(gè)被動(dòng)回復(fù)消息吧。

2.以關(guān)注事件為例,實(shí)現(xiàn)第一個(gè)被動(dòng)回復(fù)

??解析 XML 我這里使用了 第三方的包 xml2js(npm install xml2js ),并在 wechat.js 中引入。

 parseString = require("xml2js").parseString;//引入xml2js包

??為 WeChat 對(duì)象添加一個(gè)消息處理的方法 handleMsg,將 app.js 中捕獲 POST 實(shí)現(xiàn)的寫入在其代碼塊中,并使用 xml2js 解析,代碼如下

/**
 * 微信消息
 */
WeChat.prototype.handleMsg = function(req,res){
    var buffer = [];
    //監(jiān)聽 data 事件 用于接收數(shù)據(jù)
    req.on("data",function(data){
        buffer.push(data);
    });
    //監(jiān)聽 end 事件 用于處理接收完成的數(shù)據(jù)
    req.on("end",function(){
        var msgXml = Buffer.concat(buffer).toString("utf-8");
        //解析xml
        parseString(msgXml,{explicitArray : false},function(err,result){
            if(!err){
                //打印解析結(jié)果
                console.log(result);
            }else{
                 //打印錯(cuò)誤信息
                console.log(err);
            }
        })
    });
}

??在 app.js 中調(diào)用 handleMsg 方法

//用于處理所有進(jìn)入 3000 端口 post 的連接請(qǐng)求
app.post("/",function(req,res){
    wechatApp.handleMsg(req,res);
});

??完成了代碼的編寫后,將公眾號(hào)重新關(guān)注

最后打印為一個(gè) JSON 格式的結(jié)果,也就是預(yù)示著我們第1步工作已經(jīng)完成。下面開始我們的第2步,微信被動(dòng)回復(fù)。

??在文章的第一句話的后邊提到 開發(fā)者可以在響應(yīng)包(Get)中返回特定XML結(jié)構(gòu),那么這個(gè)特定的 XML 結(jié)構(gòu)在哪呢?再次打開微信幫助文檔 ,點(diǎn)擊左側(cè)菜單的消息管理,選擇其子菜單 被動(dòng)回復(fù)消息,如圖:

??直接來到 回復(fù)文本消息:

??拿到回復(fù)文本消息格式后,我們就來為關(guān)注我們公眾號(hào)的同學(xué)打聲招呼吧。在 wechat 文件中 創(chuàng)建 msg.js 文件用于消息的管理。

并在 msg.js 中添加處理文本消息的接口,并在 wechat.js 中引用

"use strict" //設(shè)置為嚴(yán)格模式

//回復(fù)文本消息
exports.txtMsg = function(toUser,fromUser,content){
    var xmlContent =  "";
        xmlContent += "";
        xmlContent += ""+ new Date().getTime() +"";
        xmlContent += "";
        xmlContent += "";
    return xmlContent;
}

修改 wechat.js 中 handleMsg 方法

/**
 * 微信消息
 */
WeChat.prototype.handleMsg = function(req,res){
    var buffer = [];
    //監(jiān)聽 data 事件 用于接收數(shù)據(jù)
    req.on("data",function(data){
        buffer.push(data);
    });
    //監(jiān)聽 end 事件 用于處理接收完成的數(shù)據(jù)
    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;//發(fā)送仿微信
                   //判斷事件類型
                   switch(result.Event.toLowerCase()){
                      case "subscribe":
                             //回復(fù)消息
                             res.send(msg.txtMsg(fromUser,toUser,"歡迎關(guān)注 hvkcoder 公眾號(hào),一起斗圖吧"));
                             break;
                   }
            }else{
                 //打印錯(cuò)誤信息
                console.log(err);
            }
        })
    });
}

?? 沒錯(cuò)就是這么簡單。這里有個(gè)邏輯是這樣的 toUser 表示接收方,也就是咱們的微信公眾號(hào);fromUser 表示發(fā)送方,也就是觸發(fā)事件的用戶。而我們要回復(fù)用戶時(shí),此時(shí) 接收方 就是 觸發(fā)事件的用戶,而發(fā)送方則是 我們的微信公眾號(hào)。這塊比較繞,大家可以慢慢去理解。

??由于我們還沒有對(duì)微信的素材管理進(jìn)行講解,這里我們暫時(shí)跳過 圖片消息、語音消息、視頻消息、以及音樂消息。直接實(shí)現(xiàn)圖文消息的推送。

3.圖文消息

??在 msg.js 文件中添加圖文XML模板

//回復(fù)圖文消息
exports.graphicMsg = function(toUser,fromUser,contentArr){
     var xmlContent =  "";
        xmlContent += "";
        xmlContent += ""+ new Date().getTime() +"";
        xmlContent += "";
        xmlContent += ""+contentArr.length+"";
        xmlContent += "";
        contentArr.map(function(item,index){
            xmlContent+="";
            xmlContent+="<![CDATA["+ item.Title +"]]>";
            xmlContent+="";
            xmlContent+="";
            xmlContent+="";
            xmlContent+="";
        });
        xmlContent += "";
    return xmlContent;
}
}

??更改 wechat.js 文件中的 handleMsg 方法,將圖消息推送響應(yīng)在點(diǎn)擊事件中

  case "click":
                                var contentArr = [
                                    {Title:"Node.js 微信自定義菜單",Description:"使用Node.js實(shí)現(xiàn)自定義微信菜單",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的獲取、存儲(chǔ)及更新",Description:"Node.js access_token的獲取、存儲(chǔ)及更新",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 接入微信公眾平臺(tái)開發(fā)",Description:"Node.js 接入微信公眾平臺(tái)開發(fā)",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"}
                                ];
                               //回復(fù)圖文消息
                               res.send(msg.graphicMsg(fromUser,toUser,contentArr));
                            break;

??點(diǎn)擊菜單下的 今日推薦

??圖文推送就是這么簡單的被我們給實(shí)現(xiàn)了。

4.接收普通消息

??微信除了為我們接收事件推送外,千萬不要忘了微信還能通過發(fā)送文字。而這一節(jié)我們也就來玩玩微信接收普通消息。

??打開 微信幫助文檔 ,點(diǎn)擊左側(cè)菜單的消息管理,選擇其子菜單 接收普通消息,如圖:

??依然如接收事件推送的套路,不同的是參數(shù)發(fā)生了改變,但這并步影響我們的開發(fā),只需要幾步就能夠完美的解決。更改 wechat.js 文件 handleMsg方法,這里我先暫時(shí)只針對(duì)用戶輸入的文本消息做處理,其他的跟其類似。

//判斷消息類型
                   if(result.MsgType.toLowerCase() === "event"){
                        //判斷事件類型
                        switch(result.Event.toLowerCase()){
                            case "subscribe":
                                    //回復(fù)消息
                                    var content = "歡迎關(guān)注 hvkcoder 公眾號(hào),一起斗圖吧?;貜?fù)以下數(shù)字:
";
                                        content += "1.你是誰
";
                                        content += "2.關(guān)于Node.js
";
                                        content += "回復(fù) “文章”  可以得到圖文推送哦~
";
                                    res.send(msg.txtMsg(fromUser,toUser,""));
                                    break;
                            case "click":
                                        var contentArr = [
                                            {Title:"Node.js 微信自定義菜單",Description:"使用Node.js實(shí)現(xiàn)自定義微信菜單",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的獲取、存儲(chǔ)及更新",Description:"Node.js access_token的獲取、存儲(chǔ)及更新",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 接入微信公眾平臺(tái)開發(fā)",Description:"Node.js 接入微信公眾平臺(tái)開發(fā)",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"}
                                        ];
                                    //回復(fù)圖文消息
                                    res.send(msg.graphicMsg(fromUser,toUser,contentArr));
                                    break;
                        }
                   }else{
                       //判斷消息類型為 文本消息
                       if(result.MsgType.toLowerCase() === "text"){
                           //根據(jù)消息內(nèi)容返回消息信息
                           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是一個(gè)開放源代碼、跨平臺(tái)的JavaScript語言運(yùn)行環(huán)境,采用Google開發(fā)的V8運(yùn)行代碼,使用事件驅(qū)動(dòng)、非阻塞和異步輸入輸出模型等技術(shù)來提高性能,可優(yōu)化應(yīng)用程序的傳輸量和規(guī)模。這些技術(shù)通常用于數(shù)據(jù)密集的事實(shí)應(yīng)用程序"));
                                    break;
                               case "文章":
                                      var contentArr = [
                                            {Title:"Node.js 微信自定義菜單",Description:"使用Node.js實(shí)現(xiàn)自定義微信菜單",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的獲取、存儲(chǔ)及更新",Description:"Node.js access_token的獲取、存儲(chǔ)及更新",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 接入微信公眾平臺(tái)開發(fā)",Description:"Node.js 接入微信公眾平臺(tái)開發(fā)",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"}
                                        ];
                                        //回復(fù)圖文消息
                                        res.send(msg.graphicMsg(fromUser,toUser,contentArr));
                                    break;
                                default :
                                         res.send(msg.txtMsg(fromUser,toUser,"沒有這個(gè)選項(xiàng)哦"));
                                    break;
                           }
                       }
                   }

??OK !至此我們就完成了微信消息管理的講解,似乎真的沒有什么難度。預(yù)留了一章,主要想要去細(xì)說一下說消息加解密,因?yàn)樵诰W(wǎng)上涉及 Node.js 微信消息加解密的文章確實(shí)很少,微信幫助文檔給的案例也沒有 Node.js 的詳細(xì)說明。

??最后文章代碼部分,由于網(wǎng)上編輯器的代碼換行做的不是很好可能有些亂,建議可以去我的 github 上查看源碼。

??文章源代碼:https://github.com/SilenceHVK... 。對(duì)文章有不正確之處,請(qǐng)給予糾正。github源代碼請(qǐng)順手給個(gè) Star,最后感謝您的閱讀。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92174.html

相關(guān)文章

  • Node.js 微信公眾號(hào)實(shí)戰(zhàn)】1.Node.js 接入微信公眾平臺(tái)開發(fā)

    摘要:打開中文網(wǎng)文檔打開微信開發(fā)者文檔三接入微信公眾平臺(tái)創(chuàng)建項(xiàng)目首先我們?cè)陔娔X的任意磁盤上創(chuàng)建文件夾,命名隨意,我這命名為隨后在文件夾中創(chuàng)建兩個(gè)文件一個(gè)是,另一個(gè)為。接入驗(yàn)證再次進(jìn)入微信公眾平臺(tái)在左側(cè)菜單點(diǎn)擊基本配置,如圖點(diǎn)擊修改配置。 一、寫在前面的話 ??Node.js是一個(gè)開放源代碼、跨平臺(tái)的JavaScript語言運(yùn)行環(huán)境,采用Google開發(fā)的V8運(yùn)行代碼,使用事件驅(qū)動(dòng)、非阻塞和異...

    winterdawn 評(píng)論0 收藏0
  • 全棧最后一公里 - Node.js 項(xiàng)目的線上服務(wù)器部署與發(fā)布

    摘要:沒有耐心閱讀的同學(xué),可以直接前往學(xué)習(xí)全棧最后一公里。我下面會(huì)羅列一些,我自己錄制過的一些項(xiàng)目,或者其他的我覺得可以按照這個(gè)路線繼續(xù)深入學(xué)習(xí)的項(xiàng)目資源。 showImg(https://segmentfault.com/img/bVMlke?w=833&h=410); 本文技術(shù)軟文,閱讀需謹(jǐn)慎,長約 7000 字,通讀需 5 分鐘 大家好,我是 Scott,本文通過提供給大家學(xué)習(xí)的方法,...

    Nosee 評(píng)論0 收藏0
  • node打造微信個(gè)人號(hào)機(jī)器人

    摘要:是一款開源的微信個(gè)人號(hào),進(jìn)行了一系列的封裝,提供簡單好用的接口,然后開發(fā)者可以在其之上進(jìn)行微信機(jī)器人的開發(fā)。注意這行代碼實(shí)現(xiàn)了登錄微信個(gè)人號(hào)并打印出所收到的消息。大家可以根據(jù)自己的需要定制出強(qiáng)大的個(gè)人微信號(hào)機(jī)器人。 現(xiàn)在,日常生活已經(jīng)離不開微信,本文將會(huì)拋磚引玉演示如何使用wechaty操作微信個(gè)人號(hào)做一些有意思的東西,可以實(shí)現(xiàn)自動(dòng)通過好友請(qǐng)求、關(guān)鍵詞回復(fù)、自動(dòng)拉群等功能。大大提高了社...

    xiaolinbang 評(píng)論0 收藏0
  • Node.js 微信公眾號(hào)實(shí)戰(zhàn)】3.Node.js 自定義微信菜單

    摘要:一寫在前面的話上一篇文章中,我們使用成功的實(shí)現(xiàn)了的獲取存儲(chǔ)以及更新,這篇文章我們來實(shí)現(xiàn)微信的自定義菜單功能。二自定義微信菜單微信文檔步驟在開始碼代碼之前,我們依然是先理清實(shí)現(xiàn)的思路,再開始編寫實(shí)現(xiàn)代碼。 一、寫在前面的話 ??上一篇文章中,我們使用 Node.js 成功的實(shí)現(xiàn)了access_token 的獲取、存儲(chǔ)以及更新,這篇文章我們來實(shí)現(xiàn)微信的自定義菜單功能。showImg(htt...

    Barry_Ng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

lewinlee

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<