一 實先自動回復功能的邏輯步驟
1 處理POST類型的控制邏輯,接收XML的數據包;
2 解析XML數據包(獲得數據包的消息類型或者是事件類型);
3 拼裝我們定義好的消息;
4 包裝成XML格式;
5 在5秒內返回回去
二 代碼實操
本節代碼參照上節課繼續修改和完善,目錄結構跟之前相同,新引入的模塊raw-body使用npm install安裝一下即可,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 + '&appid=' + appID + '&secret=' + 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); }) })};//向外暴露weChatmodule.exports = weChat;
新聞熱點
疑難解答