本文首發公衆號【一名打字員】java
上回書說到,師徒四人途經獅駝國,獅駝國三位國師對唐僧心懷不軌,要與師徒四人進行鬥法。咳,跑偏了跑偏了。node
你們靜一靜,上一次最後咱們介紹了Express的模板引擎,今天咱們接着上次的繼續。程序員
首先咱們在 package.json
文件中 dependencies
節點增長包:npm
"ejs": "~2.5.2",
執行 npm install
編譯事後,修改 app.js
文件中的模板渲染一行。json
//將jade換成ejs app.set('view engine', 'ejs');
而後將 index.jade
換成 index.ejs
,由於如今咱們已經將模板切換到ejs了。
下面是 index.js
文件內容。服務器
<%include header.ejs %> <p>Wecolme to <%=title%></p> <%include footer.ejs %>
如今java程序員是否是看着順眼了不少呢,這僅僅是我的習慣,僅供參考。微信
如今咱們回顧一下總體工程的目錄結構:app
- bin # 命令文件 - node_modules # 下載的依賴包 - public # 靜態資源目錄 - routes # 路由文件 - views # 視圖模板文件 app.js # 入口文件 package.json # 工程依賴配置文件
如今相信你們對整個項目已經有了基本的認識了,接下來咱們就開始對微信公衆號的集成了。微信公衆平臺
關於微信公衆平臺的開發文檔能夠去 官網 獲取,裏面有很詳細的介紹,如下配圖步驟均來自官方文檔:
從文檔裏面咱們能夠知道,首先咱們必需要在本身公衆號的後臺進行服務器的配置。工具
而後填上咱們的服務器配置,因爲咱們暫時尚未寫,因此這裏暫時先寫上 http://www.dailyguitar.cc/wechat/index
。
接下來咱們就得寫對 /wechat/index
的處理了。
微信會對上面咱們填寫的地址進行有效性的檢測,它會用請求咱們的地址,咱們必須對它請求過來的參數進行解密,而後返回一樣的數據給它,不然將沒法使用公衆平臺的相關接口。
首先咱們在 index.js
中加入以下代碼,
/* 微信校驗 */ var token="weixin"; router.get('/wechat/index', function(req, res, next) { try{ var signature = req.query.signature; var timestamp = req.query.timestamp; var nonce = req.query.nonce; var echostr = req.query.echostr; /* 加密/校驗流程以下: */ //1. 將token、timestamp、nonce三個參數進行字典序排序 var array = new Array(token,timestamp,nonce); array.sort(); var str = array.toString().replace(/,/g,""); //2. 將三個參數字符串拼接成一個字符串進行sha1加密 var sha1Code = crypto.createHash("sha1"); var code = sha1Code.update(str,'utf-8').digest("hex"); //3. 得到加密後的字符串可與signature對比,標識該請求來源於微信 if(code===signature){ res.send(echostr); console.log(""+echostr); }else{ res.send("error"); } }catch(error){ console.log("error:"+error); } });
其中咱們用到了一個加密模塊 crypto
,咱們須要手動引用一下,而後咱們將項目運行起來,因爲微信須要用到域名不然沒法進行調試,這裏本猿推薦兩個內網穿透工具,一個是花生殼一個叫作ngrok,你們能夠本身研究研究。
到這裏其實與微信的對接已經完成了,在微信後臺咱們就能夠配置成功了,記得別忘了咱們的token喲。
當用戶和咱們的公衆號發生操做的時候,微信會發送post請求到咱們配置的URL中,因此咱們只須要接收微信發過來的xml數據進行解析,並以xml的格式返回數據便可完成對消息的回覆。
因此咱們得對 index.js
再增長一個post的捕捉。
/* 微信消息處理 */ router.post('/wechat/index', function(req, res, next) { try{ var bodyData; req.on("data",function(data){ /*微信服務器傳過來的是xml格式的,是buffer類型, 須要經過toString把xml轉換爲字符串*/ bodyData = data.toString("utf-8"); }); req.on("end",function(){ var ToUserName = getXMLNodeValue('ToUserName',bodyData); var FromUserName = getXMLNodeValue('FromUserName',bodyData); var CreateTime = getXMLNodeValue('CreateTime',bodyData); var MsgType = getXMLNodeValue('MsgType',bodyData); var Content = getXMLNodeValue('Content',bodyData); var MsgId = getXMLNodeValue('MsgId',bodyData); console.log(ToUserName); console.log(FromUserName); console.log(CreateTime); console.log(MsgType); console.log(Content); console.log(MsgId); var xml = '<xml><ToUserName>'+FromUserName+'</ToUserName><FromUserName>'+ToUserName+'</FromUserName><CreateTime>'+CreateTime+'</CreateTime><MsgType>'+MsgType+'</MsgType><Content>'+Content+'</Content></xml>'; res.send(xml); }); }catch(error){ console.log("error:"+error); } }); /* 獲取節點 */ function getXMLNodeValue(node_name,xml){ var str = xml.split("<"+node_name+">"); var tempStr = str[1].split("</"+node_name+">"); return tempStr[0]; }
打開應用,對着本身公衆號發送一條消息,很快也會收到一條內容同樣的回覆,大功告成!
本次實戰只爲達到簡單的操做效果,咱們能夠對其進行更深層次的處理和封裝,具體能夠看一看個人開源項目中對微信公衆號模塊的處理。另外node中有一個比較方便公衆號開發的模塊 wechat
,它提供了不少便捷的方法如支付以及模版消息等模塊的支持,有興趣的朋友能夠自行研究一下。