搜尋
首頁web前端js教程如何使用NodeJS來實現微信公眾號關注後自動回覆功能的詳細介紹

這篇文章主要為大家詳細介紹了NodeJS實現微信公眾號關注後自動回复功能,具有一定的參考價值,有興趣的小伙伴們可以參考一下

##一實先自動回覆功能的邏輯步驟

  1 處理POST類型的控制邏輯,接收

XML

的封包;

  2 解析XML封包(取得封包的訊息類型或是###事件###類型);######  3 拼裝我們定義好的訊息;######  4 包裝成XML格式;## ####  5 在5秒內回回去#########二程式碼實作#########  本節程式碼參考上節課繼續修改和完善,###目錄結構###跟之前相同,新引入的模組raw-body使用npm inst###all######安裝###一下即可,app.js啟動檔案和util.js不做變動,主要修改一下generator.js文件,以及在generator.js同級目錄下新建wechat.js檔案和tools.js檔案。 ######  wechat.js檔案是將前一節generator.js檔案中票據部分的程式碼抽離出來單獨放在一個檔案中,具體程式碼如下:###
'use strict';
// 引入模块
var Promise = require('bluebird');
var request = Promise.promisify(require('request'));

//增加url配置项
var prefix = 'https://api.weixin.qq.com/cgi-bin/';
var api = {
  accessToken: prefix + 'token?grant_type=client_credential'
};

//利用构造函数生成实例 完成票据存储逻辑
function weChat(opts) {
  var that = this;
  this.appID = opts.appID;
  this.appSecret = opts.appSecret;
  this.getAccessToken = opts.getAccessToken;
  this.saveAccessToken = opts.saveAccessToken;
  //获取票据的方法
  this.getAccessToken()
    .then(function(data) {
      //从静态文件获取票据,JSON化数据,如果有异常,则尝试更新票据
      try {
        data = JSON.parse(data);
      } catch (e) {
        return that.updateAccessToken();
      }
      //判断票据是否在有效期内,如果合法,向下传递票据,如果不合法,更新票据
      if (that.isValidAccessToken(data)) {
        Promise.resolve(data);
      } else {
        return that.updateAccessToken();
      }
    })
    //将拿到的票据信息和有效期信息存储起来
    .then(function(data) {
      //console.log(data);
      that.access_token = data.access_token;
      that.expires_in = data.expires_in;

      that.saveAccessToken(data);
    })
};

//在weChat的原型链上增加验证有效期的方法
weChat.prototype.isValidAccessToken = function(data) {
  //进行判断,如果票据不合法,返回false
  if (!data || !data.access_token || !data.expires_in) {
    return false;
  }
  //拿到票据和过期时间的数据
  var access_token = data.access_token;
  var expires_in = data.expires_in;
  //获取当前时间
  var now = (new Date().getTime());
  //如果当前时间小于票据过期时间,返回true,否则返回false
  if (now < expires_in) {
    return true;
  } else {
    return false;
  };
};

//在weChat的原型链上增加更新票据的方法
weChat.prototype.updateAccessToken = function() {
  var appID = this.appID;
  var appSecret = this.appSecret;
  var url = api.accessToken + &#39;&appid=&#39; + appID + &#39;&secret=&#39; + appSecret;

  return new Promise(function(resolve, reject) {
    //使用request发起请求
    request({
      url: url,
      json: true
    }).then(function(response) {
      var data = response.body;
      var now = (new Date().getTime());
      var expires_in = now + (data.expires_in - 20) * 1000;
      //把新票据的有效时间赋值给data
      data.expires_in = expires_in;
      resolve(data);
    })
  })
};

//向外暴露weChat
module.exports = weChat;
###  generator.js檔案進行精簡後,加入判斷對xml資料的格式化方法以及判斷事件,新增關注事件測試訊息,具體程式碼如下:###
&#39;use strict&#39;;
// 引入模块
var sha1 = require(&#39;sha1&#39;);
var getRawBody = require(&#39;raw-body&#39;);
var weChat = require(&#39;./wechat&#39;);
var tools = require(&#39;./tools&#39;);

// 建立中间件函数并暴露出去
module.exports = function(opts) {
  //实例化weChat()函数
  //var wechat = new weChat(opts);
  return function*(next) {
    //console.log(this.query);
    var that = this;
    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(&#39;&#39;);
    // 进行加密
    var sha = sha1(str);
    //使用this.method对请求方法进行判断
    if (this.method === &#39;GET&#39;) {
      // 如果是get请求 判断加密后的值是否等于签名值
      if (sha === signature) {
        this.body = echostr + &#39;&#39;;
      } else {
        this.body = &#39;wrong&#39;;
      };
    } else if (this.method === &#39;POST&#39;) {
      //如果是post请求 也是先判断签名是否合法 如果不合法 直接返回wrong
      if (sha !== signature) {
        this.body = &#39;wrong&#39;;
        return false;
      };
      //通过raw-body模块 可以把把this上的request对象 也就是http模块中的request对象 去拼装它的数据 最终拿到一个buffer的xml数据
      //通过yield关键字 获取到post过来的原始的XML数据
      var data = yield getRawBody(this.req, {
        length: this.length,
        limit: &#39;1mb&#39;,
        encoding: this.charset
      });
      //console.log(data.toString());打印XML数据(当微信公众号有操作的时候 终端可以看到返回的XML数据)
      //tools为处理XML数据的工具包 使用tools工具包的parseXMLAsync方法 把XML数据转化成数组对象
      var content = yield tools.parseXMLAsync(data);
      //console.log(content);打印转化后的数组对象
      //格式化content数据为json对象
      var message = tools.formatMessage(content.xml);
      console.log(message);
      //打印message
      //判断message的MsgType 如果是event 则是一个事件
      if (message.MsgType === &#39;event&#39;) {
        //如果是订阅事件
        if (message.Event === &#39;subscribe&#39;) {
          //获取当前时间戳
          var now = new Date().getTime();
          //设置回复状态是200
          that.status = 200;
          //设置回复的类型是xml格式
          that.type = &#39;application/xml&#39;;
          //设置回复的主体
          that.body = &#39;<xml>&#39; +
            &#39;<ToUserName><![CDATA[&#39; + message.FromUserName + &#39;]]></ToUserName>&#39; +
            &#39;<FromUserName><![CDATA[&#39; + message.ToUserName + &#39;]]></FromUserName>&#39; +
            &#39;<CreateTime>&#39; + now + &#39;</CreateTime>&#39; +
            &#39;<MsgType><![CDATA[text]]></MsgType>&#39; +
            &#39;<Content><![CDATA[你好,同学!]]></Content>&#39; +
            &#39;</xml>&#39;;
          return;
        }
      }
    }

  }
};
###  tools.js是處理XML資料的工具檔:###
&#39;use strict&#39;;
//引入模块
var xml2js = require(&#39;xml2js&#39;);
var Promise = require(&#39;bluebird&#39;);
//导出解析XML的方法
exports.parseXMLAsync = function(xml) {
  return new Promise(function(resolve, reject) {
    xml2js.parseString(xml, { trim: true }, function(err, content) {
      if (err) {
        reject(err);
      } else {
        resolve(content);
      };
    });
  });
};
//因为value值可能是嵌套多层的 所以先对value值进行遍历
function formatMessage(result) {
  //声明空对象message
  var message = {};
  //对result类型进行判断
  if (typeof result === &#39;object&#39;) {
    //如果是object类型 通过Object.keys()方法拿到result所有的key 并存入keys变量中
    var keys = Object.keys(result);
    //对keys进行循环遍历
    for (var i = 0; i < keys.length; i++) {
      //拿到每个key对应的value值
      var item = result[keys[i]];
      //拿到key
      var key = keys[i];
      //判断item是否为数组或者长度是否为0
      if (!(item instanceof Array) || item.length === 0) {
        //如果item不是数组或者长度为0 则跳过继续向下解析
        continue;
      }
      //如果长度为1
      if (item.length === 1) {
        //拿到value值存入val变量
        var val = item[0];
        //判断val是否为对象
        if (typeof val === &#39;object&#39;) {
          //如果val为对象 则进一步进行遍历
          message[key] = formatMessage(val);
        } else {
          //如果不是对象 就把值赋给当前的key放入message里 并去除收尾空格
          message[key] = (val || &#39;&#39;).trim();
        }
      }
      //如果item的长度既不是0也不是1 则说明它是一个数组
      else {
        //把message的key设置为空数组
        message[key] = [];
        //对数组进行遍历
        for (var j = 0, k = item.length; j < k; j++) {
          message[key].push(formatMessage(item[j]));
        }
      }
    }
  }
  return message;
}

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

exports.formatMessage = formatMessage;
## #  完成這節的程式碼後,當關注微信測試公眾號的時候,會自動回覆『你好,同學! ’的提示訊息。 ###

以上是如何使用NodeJS來實現微信公眾號關注後自動回覆功能的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。