入門到放棄node系列之公衆號開發實戰二(Express篇)

續節

本文首發公衆號【一名打字員】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   # 工程依賴配置文件

如今相信你們對整個項目已經有了基本的認識了,接下來咱們就開始對微信公衆號的集成了。微信公衆平臺

集成微信公衆號

關於微信公衆平臺的開發文檔能夠去 官網 獲取,裏面有很詳細的介紹,如下配圖步驟均來自官方文檔:
從文檔裏面咱們能夠知道,首先咱們必需要在本身公衆號的後臺進行服務器的配置。工具

clipboard.png

而後填上咱們的服務器配置,因爲咱們暫時尚未寫,因此這裏暫時先寫上 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 ,它提供了不少便捷的方法如支付以及模版消息等模塊的支持,有興趣的朋友能夠自行研究一下。

相關文章
相關標籤/搜索