欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解nodejs微信公眾號開發(fā)——2.自動回復

 更新時間:2017年04月10日 10:15:49   作者:芒果屋里的貓  
這篇文章主要介紹了詳解nodejs微信公眾號開發(fā)——2.自動回復,非常具有實用價值,需要的朋友可以參考下

上一篇文章:nodejs微信公眾號開發(fā)(1)接入微信公眾號,本篇文章將在此基礎上實現(xiàn)簡單的回復功能。

1. 接入代碼的優(yōu)化

之前我們簡單粗暴的實現(xiàn)了微信公眾號的接入,接入的代碼直接寫在了app.js文件里面,從項目開發(fā)的角度而言,不便于日后代碼的維護,所以將這部分代碼獨立出來,按照koa的風格,寫成一個中間件。

在根目錄下新建wechat文件夾,新建generator.js文件,

var sha1 = require('sha1');

module.exports = function(opts){
  return function *(next){
    var token = opts.token;
    var signature = this.query.signature;
    var nonce = this.query.nonce;
    var timestamp = this.query.timestamp;
    var echostr = this.query.echostr;
    var str = [token,timestamp,nonce].sort().join('');
    var sha = sha1(str);
    this.body = (sha === signature) ? echostr + '' : 'failed';
  };
}

此時app.js的內(nèi)容變成:

'use strict'

var Koa = require('koa');
var wechat = require('./wechat/generator');

var config = {
  wechat:{
    appID:'...',
    appSecret:'...',
    token:'...'
  }
};

var app = new Koa();
app.use(wechat(config.wechat));
app.listen(8080);
console.log('Listening 8080...')

2. 獲取access_token

access_token是開發(fā)程序與wexin公眾平臺交互的一把鑰匙,調(diào)用絕大部分接口都需要用到access_token。

access_token的特點:

  1. 有效期為2小時(7200s),過期自動失效,需要重新獲??;
  2. 只要更新了access_token,之前的access_token自動失效;

解決方案:

  1. 系統(tǒng)每隔2小時自動去獲取一下access_token的值,確保access_token始終是有效的;
  2. 為了方便頻繁調(diào)用,將access_token存儲在唯一的一個地方(數(shù)據(jù)庫、文件等),所有子系統(tǒng)都能訪問。

程序中采用構(gòu)造函數(shù)的方式,在生成實例,完成初始化工作的的過程中,讀取存儲在config/wechat.txt文件中的票據(jù),判斷是否為空且是否過期,選擇性的重新獲取數(shù)字并且保存在原文件里面,關于獲取access_token的官方文檔介紹可見:獲取access_token。

function Wechat(opts){   //構(gòu)造函數(shù),用以生成實例,完成初始化工作,讀寫票據(jù)
  var that = this;
  this.appID = opts.appID;
  this.appSecret = opts.appSecret;
  this.getAccessToken = opts.getAccessToken;
  this.saveAccessToken = opts.saveAccessToken;

  this.getAccessToken().then(function(data){
    try{
      data = JSON.parse(data);
    }catch(e){
      return that.updateAccessToken();
    }
    if(that.isvalidAccessToken(data)){
      Promise.resolve(data);
    }else{
      return that.updateAccessToken();
    }
  }).then(function(data){
    that.access_token = data.access_token;
    that.expires_in = data.expires_in;
    that.saveAccessToken(JSON.stringify(data));
  });
}

我們在moudle.exports中實例化一個Wechat

var wechat = new Wechat(opts);

這樣確保了每次程序啟動都會獲取對access_token的有效性進行檢驗,并且每個一段時間會自動獲取一個新的access_token。

3. 處理微信消息的步驟

無論是事件推送還是消息推送,微信服務器都是以post的方式發(fā)送請求,推送的數(shù)據(jù)類型不是json而是xml,處理推送消息一般分為五個步驟:

  1. 處理POST類型的控制邏輯,接收xml數(shù)據(jù)包;
  2. 解析數(shù)據(jù)包,獲取數(shù)據(jù)包的消息類型或數(shù)據(jù)類型;
  3. 拼裝自定義的消息;
  4. 包裝成xml格式;
  5. 在5秒鐘內(nèi)返回消息。

3.1 接收xml數(shù)據(jù)

通過raw-body模塊可以獲取http模塊中的request對象,并且可以對數(shù)據(jù)進行拼裝,從而拿到一個buffer的xml對象

var data = yield rawBody(this.req,{
        length:this.length,
        limit:'1mb',
        encoding:this.charset
      });
console.log('data:'+data);

3.2 解析xml數(shù)據(jù)

使用xml2js模塊,將xml數(shù)據(jù)解析成對象格式

var content = yield util.parseXMLAsync(data);
util中的parseXMLAsync方法:

exports.parseXMLAsync = function(xml){
  return new Promise(function(resolve,reject){
    xml2js.parseString(xml,{trim:true},function(err,content){
      err ? reject(err) : resolve(content);
    })
  });
}

3.3 格式化xml數(shù)據(jù)

從解析的xml數(shù)據(jù)來看,數(shù)據(jù)雖然已經(jīng)呈現(xiàn)鍵值對的形式,但是其值是數(shù)組的形式,需要進行扁平化處理:

var message = util.formatMessage(content.xml);

其本質(zhì)就是遍歷數(shù)組中的值,因為在多圖文的消息中存在嵌套的情況:

function formatMessage(result){
  var message = {};
  if(typeof result === 'object'){
    var keys = Object.keys(result);
    for(var i=0;i<keys.length;i++){
      var key = keys[i];
      var item = result[key];
      if(!(item instanceof Array) || item.length === 0) continue;
      if (item.length === 1){
        var val = item[0];
        if (typeof val === 'object') message[key] = formatMessage(val);
        else message[key] = (val || '').trim();
      }else{
        message[key] = [];
        for(var j=0,k=item.length;j<k;j++) message[key].push(formatMessage(item[j]));
      }
    }
  }
  return message;
}

3.4 判斷消息類型并回復

這里針對subscribe事件,新關注后自動回復文本消息終于等到你,還好我沒放棄

if(message.MsgType === 'event'){
  if(message.Event === 'subscribe'){
    var createTime = new Date().getTime();
    that.status = 200;
    that.type = 'application/xml';
    that.body = '<xml>'+
          '<ToUserName><![CDATA['+ message.FromUserName +']]></ToUserName>'+
          '<FromUserName><![CDATA['+ message.ToUserName +']]></FromUserName>'+
          '<CreateTime>'+createTime+'</CreateTime>'+
          '<MsgType><![CDATA[text]]></MsgType>'+
          '<Content><![CDATA[終于等到你,還好我沒放棄]]></Content>'+
          '</xml>'
    return;
  }
}

注:這里只是簡單地實現(xiàn)一下自動回復功能,這種拼接字符串的方式還是很不方便的,后面會封裝成接口。

使用手機微信掃描測試賬號的二維碼,即可關注,同時接收到測試公眾號推送的消息!

啦啦,一個簡單的關注回復就完成了。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Node中解決接口跨域問題詳解

    Node中解決接口跨域問題詳解

    在 Node 中編寫接口時,我們常常會遇到跨域問題,通過本篇文章,我們來聊聊如何解決 Node 中接口的跨域問題,文中代碼示例介紹了非常詳細,需要的朋友可以借鑒一下
    2023-04-04
  • Nest.js使用multer實現(xiàn)文件上傳功能

    Nest.js使用multer實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了Nest.js鵝湖使用multer實現(xiàn)文件上傳功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • Node.js服務器開啟Gzip壓縮教程

    Node.js服務器開啟Gzip壓縮教程

    開啟網(wǎng)站的 gzip 壓縮功能,通??梢愿哌_70%,也就是說,如果你的網(wǎng)頁有30K,壓縮之后就變成9K, 對于大部分網(wǎng)站,顯然可以明顯提高瀏覽速度(注:需要瀏覽器支持)。
    2017-08-08
  • node操作mysql數(shù)據(jù)庫實例詳解

    node操作mysql數(shù)據(jù)庫實例詳解

    這篇文章主要介紹了node操作mysql數(shù)據(jù)庫,結(jié)合實例形式較為詳細的分析了node操作數(shù)據(jù)庫的連接、增刪改查、事務處理及錯誤處理相關操作技巧,需要的朋友可以參考下
    2017-03-03
  • nvm管理node無法正常切換node版本問題的解決方法

    nvm管理node無法正常切換node版本問題的解決方法

    相信一定會有存在一些小伙伴 明明都已經(jīng)按著操作卸載node 和安裝nvm 了但是 依舊無法正常通過nvm管理node,本文將給大家介紹nvm管理node無法正常切換node版本問題的解決方法,需要的朋友可以參考下
    2024-01-01
  • node koa2 ssr項目搭建的方法步驟

    node koa2 ssr項目搭建的方法步驟

    這篇文章主要介紹了node koa2 ssr項目搭建的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 150行Node.js實現(xiàn)的dns代理工具

    150行Node.js實現(xiàn)的dns代理工具

    這篇文章主要介紹了150行Node.js實現(xiàn)的dns代理工具,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 究竟什么是Node.js?Node.js有什么好處?

    究竟什么是Node.js?Node.js有什么好處?

    這篇文章主要介紹了究竟什么是Node.js?Node.js有什么好處?,為試圖解釋什么是 Node.js,本文將簡要介紹一些背景信息:它要解決的問題,它如何工作,如何運行一個簡單應用程序,最后,Node 在什么情況下是一個好的解決方案,需要的朋友可以參考下
    2015-05-05
  • node快速搭建后臺的實現(xiàn)步驟

    node快速搭建后臺的實現(xiàn)步驟

    本文主要介紹了node快速搭建后臺,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Windows系統(tǒng)下Node.js的簡單入門教程

    Windows系統(tǒng)下Node.js的簡單入門教程

    這篇文章主要介紹了Windows系統(tǒng)下Node.js的簡單入門教程,Node.js是用于后端編程的JavaScript框架,需要的朋友可以參考下
    2015-06-06

最新評論