這篇文章主要介紹了使用NodeJs 開發(fā)微信公眾號(hào)微信事件交互實(shí)例的相關(guān)資料,需要的朋友可以參考下
微信公眾號(hào)有個(gè)規(guī)則,一旦開啟了開發(fā)者模式,其他的常規(guī)功能就都必須透過(guò)介面呼叫完成。比如說(shuō)自訂選單功能,必須透過(guò)發(fā)送post請(qǐng)求的方式產(chǎn)生。本章就透過(guò)關(guān)注到取消關(guān)注的整個(gè)過(guò)程來(lái)談一談nodejs是怎麼樣與微信互動(dòng)的。這些功能的入口就是你在測(cè)試公眾號(hào)裡面填寫的URL(以下用/login/wechat代替)。
事件互動(dòng)
#掃碼專注在微信公眾號(hào)後,微信會(huì)呼叫你的介面/login/wechat ,並且附帶一段xml信息,首先你需要獲取一些簽名,透過(guò)加密、排序比對(duì)是否與你填寫的TOKEN一致,如果一致則進(jìn)行xml的解析。 node解析xml時(shí)必須先引用模組。所以,先引入xml解析模組
//xml解析模塊 var XMLJS = require('xml2js'); //解析,將xml解析為json var parser = new XMLJS.Parser(); //重組,將json重組為xml var builder = new XMLJS.Builder();
透過(guò)req的監(jiān)聽data,來(lái)取得微信發(fā)送過(guò)來(lái)的xml包。以下是某個(gè)新用戶關(guān)注公眾號(hào)後微信向你的後臺(tái)接口(上一篇中提到的/yourapi)發(fā)送的xml包數(shù)據(jù),經(jīng)過(guò)解析後,他的結(jié)構(gòu)如下:
tousername:收信者【此處為公眾微訊號(hào)】
fromusername:寄信者【此處為使用者openid】
#createTime:傳送時(shí)間
msgtype:訊息類型【event(回應(yīng)事件)、text(推播訊息)、image(推播圖文訊息)等】
event :訊息名稱【此處為關(guān)注】
eventkey:自訂的key,在設(shè)定網(wǎng)頁(yè)時(shí)可以自訂後文中會(huì)講到
程式碼實(shí)作
//微信事件推送的入口 app.post('/yourapi', function(req, res, next) { //獲取參數(shù) var query = req.query; //簽名 var signature = query.signature; //輸出的字符,你填寫的TOKEN var echostr = query.echostr; //時(shí)間戳 var timestamp = query['timestamp']; //隨機(jī)字符串 var nonce = query.nonce; var oriArray = new Array(); oriArray[] = nonce; oriArray[] = timestamp; oriArray[] = appConfig.token; //排序參數(shù) oriArray.sort(); var original = oriArray[]+oriArray[]+oriArray[]; //加密 var scyptoString = sha(original); //判斷是否與你填寫TOKEN相等 if (signature == scyptoString) { //獲取xml數(shù)據(jù) req.on("data", function(data) { //將xml解析 parser.parseString(data.toString(), function(err, result) { var body = result.xml; var messageType = body.MsgType[]; //用戶點(diǎn)擊菜單響應(yīng)事件 if(messageType === 'event') { var eventName = body.Event[]; (EventFunction[eventName]||function(){})(body, req, res); //自動(dòng)回復(fù)消息 }else if(messageType === 'text') { EventFunction.responseNews(body, res); //第一次填寫URL時(shí)確認(rèn)接口是否有效 }else { res.send(echostr); } }); }); } else { //認(rèn)證失敗,非法操作 res.send("Bad Token!"); } }); //微信客戶端各類回調(diào)用接口 var EventFunction = { //關(guān)注 subscribe: function(result, req, res) { //存入openid 通過(guò)微信的接口獲取用戶的信息同時(shí)存入數(shù)據(jù)庫(kù)。 }, //注銷 unsubscribe: function(openid, req, res) { //刪除對(duì)應(yīng)id }, //打開某個(gè)網(wǎng)頁(yè) VIEW: function() { //根據(jù)需求,處理不同的業(yè)務(wù) }, //自動(dòng)回復(fù) responseNews: function(body, res) { //組裝微信需要的json var xml = {xml: { ToUserName: body.FromUserName, FromUserName: body.ToUserName, CreateTime: + new Date(), MsgType: 'text', Content: '編輯@+您想說(shuō)的話,我們可以收到' }}; var reciviMessage = body.Content[] if(/^\@.*/.test(reciviMessage)) { xml.xml.Content = '已經(jīng)收到您的建議,會(huì)及時(shí)處理!' }<br>//將json轉(zhuǎn)為xml xml = builder.buildObject(xml);<br>//發(fā)送給微信 res.send(xml); } }此處,適合採(cǎi)用JS
設(shè)計(jì)模式中的策略模式,在subscribe方法裡面寫上你自己的業(yè)務(wù),透過(guò)發(fā)送帶有openid參數(shù)的請(qǐng)求,可以在使用者關(guān)注微訊號(hào)的時(shí)候?qū)⑵鋷妆举Y料存入資料庫(kù),並且建立會(huì)話。這樣在使用者接下來(lái)打開你的網(wǎng)頁(yè)的時(shí)候就不需要再認(rèn)證,只需要比對(duì)openid然後查詢資料庫(kù)就行了。
以上是NodeJs開發(fā)微信公眾號(hào)微信事件互動(dòng)實(shí)例代碼的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)