使用NodeJs 開發公眾號(三)事件互動執行個體,nodejs執行個體
公眾號有個規則,一旦開啟了開發人員模式,其他的常規功能就都必須通過介面調用完成。比如說自訂菜單功能,必須通過發送post請求的方式產生。本章就通過關注到取消追蹤的整個過程來談一談nodejs是怎麼樣與互動的。這些功能的入口就是你在測試公眾號裡面填寫的URL(以下用/login/wechat代替)。
事件互動
掃碼關注公眾號後,會調用你的介面/login/wechat,並且附帶一段xml資訊,首先你需要擷取一些簽名,通過加密、排序比對是否與你填寫的TOKEN一致,如果一致則進行xml的解析。node解析xml時必須先引用模組。所以,先引入xml解析模組
//xml解析模組var XMLJS = require('xml2js');//解析,將xml解析為jsonvar parser = new XMLJS.Parser();//重組,將json重組為xmlvar builder = new XMLJS.Builder();
通過req的監聽data,來擷取發送過來的xml包。以下是某個新使用者關注公眾號後向你的後台介面(上一篇中提到的/yourapi)發送的xml包資料,經過解析後,他的結構如下:
tousername:收信人【此處為公眾號】
fromusername:發信人【此處為使用者openid】
createTime:發送時間
msgtype:訊息類型【event(響應事件)、text(推送訊息)、image(推送圖文訊息)等】
event:訊息名稱【此處為關注】
eventkey:自訂的key,在設定網頁時可以自訂後文中會講到
以上就是當一個使用者關注後往你介面發送的資料包。上面對我們有用的是fromusername,即關注人的openid,我們在關注時擷取了使用者的該openid後可以通過提供的特定介面(https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN)擷取使用者的頭像,性別,暱稱等資訊,為你的app建立一個可靠的資料庫。
代碼實現
//事件推送的入口app.post('/yourapi', function(req, res, next) {//擷取參數var query = req.query; //簽名var signature = query.signature; //輸出的字元,你填寫的TOKEN var echostr = query.echostr; //時間戳記var timestamp = query['timestamp']; //隨機字串var nonce = query.nonce; var oriArray = new Array(); oriArray[] = nonce; oriArray[] = timestamp; oriArray[] = appConfig.token;//排序參數oriArray.sort(); var original = oriArray[]+oriArray[]+oriArray[]; //加密var scyptoString = sha(original); //判斷是否與你填寫TOKEN相等if (signature == scyptoString) {//擷取xml資料req.on("data", function(data) {//將xml解析parser.parseString(data.toString(), function(err, result) {var body = result.xml;var messageType = body.MsgType[];//使用者點擊菜單響應事件if(messageType === 'event') {var eventName = body.Event[];(EventFunction[eventName]||function(){})(body, req, res);//自動回複訊息}else if(messageType === 'text') {EventFunction.responseNews(body, res);//第一次填寫URL時確認介面是否有效}else {res.send(echostr);}});});} else { //認證失敗,非法操作res.send("Bad Token!"); }});//用戶端各類回調用介面var EventFunction = {//關注subscribe: function(result, req, res) {//存入openid 通過的介面擷取使用者的資訊同時存入資料庫。},//登出unsubscribe: function(openid, req, res) {//刪除對應id},//開啟某個網頁VIEW: function() {//根據需求,處理不同的業務},//自動回複responseNews: function(body, res) {//組裝需要的jsonvar xml = {xml: {ToUserName: body.FromUserName,FromUserName: body.ToUserName,CreateTime: + new Date(),MsgType: 'text',Content: '編輯@+您想說的話,我們可以收到'}};var reciviMessage = body.Content[]if(/^\@.*/.test(reciviMessage)) {xml.xml.Content = '已經收到您的建議,會及時處理!'}<br>//將json轉為xmlxml = builder.buildObject(xml);<br>//發送給res.send(xml);}}
此處,適合採用JS設計模式中的策略模式,在subscribe方法裡面寫上你自己的業務,通過發送帶openid參數的請求,可以在使用者關注號的時候將其幾本資料存入資料庫,並且建立會話。這樣在使用者接下來開啟你的網頁的時候就無需再次認證,只需要比對openid然後查詢資料庫就行了。
您可能感興趣的文章:
- 使用Nodejs開發公眾號後台服務執行個體
- node.js公眾平台開發教程