微信公眾號消息接收與回復--微信公眾號開發(二)


  本節主要介紹下在開發公眾號消息消息管理中踩過的坑,有與很久才來寫一次,文筆不是太好。為了讓你發現想要的重點,將以問答的形式進行編寫。

  1.為什么先開發消息管理模塊:

    剛剛開始接觸這個,看了api文檔后第一感覺是亂、多。對應新手來說這么多東西該從那里下手呢?看了下jssdk部分,因為有騰訊的demo,所以為了學習方面可以直接將代碼弄到本地跟着調式就行,主要涉及一些wx.config里面的參數獲取邏輯需要整理下。因為之前已經通過postman測試了自定義菜單了,那干脆就接着做人機交互部分-消息接收和回復。

  2.消息管理這塊可以做什么事情:

    總結了一下,消息管理主要做兩方面的事情。

      第一:與用戶進行交互(包括接收用戶發來的文本、語言、視頻等信息,同時可以對用戶發送的信息進行回復)

      第二:與微信服務器進行交互(對於一些指定的動作,微信會發送信息到后台、部分需要我們的服務器進行回復。比如:新用戶關注公眾號、取消關注公眾號、上報地理位置事件等)

          具體可以參考https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454 中 消息管理->接收事件推送

  3.接收消息要做一些什么:

    第一:在微信管理平台配置URL, 路徑為  開發-》基本配置-》服務器配置(這個要先啟動)

        其中URL為自己后台服務器的一個服務,微信將通過post請求將消息發送到這個地方,同時在配置點確認的時候,微信會發送get請求到這個路徑進行驗證,具體驗證邏輯可以參考我的上一篇文章。

        這個地方特別要注意:一個get請求一個post請求分別有不同的目的

 

    第二:搭建自己的服務器,要保證第一點中的URL能正常接收post請求

  3.開發消息管理后台遇到了什么坑

  第一:晚上很多文章都是別人寫的demo,很多代碼有誤導性。要有自己的思考。同時細看api文檔。

  第二:我用的node(eggjs),所以遇到了異步的問題,當時看網上很多人都是通過req.on()去監聽接收text/xml數據流,然后就直接返回了。在這重申:這些都是坑,及其不負責任,要同步方法。這個異步造成微信根本收不到。

      要將監聽獲取數據流方法同步化。我用了raw-body插件,這個會返回xml格式的字符串,還需要用xml2js轉成json  (這個需要自己promise封裝成同步)即可,接着根據指定格式返回信息給微信

  第三:直接將參數賦值給res.body就可以了,不要想的很復雜。

  第四:新手建議不要用測試賬號,用正式賬號。為什么呢?因為正式賬號可以從管理平台中看到返回給微信的日志,方便查錯(高手請忽略) 

      開發-》運維中心-》日志查詢  日志類型選擇:公眾號被動回復,類型自選即可

 

  

  4.代碼實現

      

 

//controller方法,暫時沒有分service
const rawBody     = require('raw-body')
var   contentType = require('content-type')
const tool        = require('../../utils/tool.js')
//處理方法

 async message(){
    //獲取微信推送過來的消息
    const { ctx ,config} = this
    console.log('message request:', ctx.request.body)
    var data = await rawBody(ctx.req, {
      length  : ctx.request.headers['content-length'],
      limit   : '1mb',
      encoding: contentType.parse(ctx.request).parameters.charset
    });
    console.log('data+++:' + data);
    let jsonData                                              = await tool.parseXMLAsync(data)
    let getData                                               = jsonData.xml
    let { ToUserName, FromUserName, MsgType, Content, MsgId } = getData
      
        
    console.log('****************', getData)

    let rst = `<xml><ToUserName><![CDATA[${FromUserName}]]></ToUserName>
              <FromUserName><![CDATA[${ToUserName}]]></FromUserName>
              <CreateTime>1540993144</CreateTime>
              <MsgType><![CDATA[${ MsgType}]]></MsgType>
              <Content><![CDATA[${Content}]]></Content>
              <MsgId>${MsgId}</MsgId>
              </xml>`
    ctx.body = rst
  }



//一下為tool.js  簡單的封裝了xml2js方法,將其同步化
var xml2js = require('xml2js');
//導出解析XML的方法
function parseXMLAsync (xml) {
  return new Promise(function (resolve, reject) {
    xml2js.parseString(xml, { explicitArray: true  }, function (err, content) {
      err ? reject(err): resolve(content);
    });
  });
};

module.exports = {
  parseXMLAsync
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM