背景:某分廠須要實時查詢工件堆放的位置,要求快速便捷,所以設計了採用微信公衆號被動回覆信息的方案。sql
技術實現:開發者服務器--基於Angular2框架的已發佈網站,編程語言爲Python,後臺存儲數據庫爲Mysql;數據庫
微信服務器--微信公衆號,此業務只是處理微信客戶端發送的文本信息,且不使用公衆號的其餘功能,所以不須要認證公衆號;編程
微信客戶端--關注公衆號的微信使用者,即粉絲。服務器
當粉絲給公衆號發送特定的消息時,微信公衆號自動回覆相應內容,而其背後的實現原理可由下圖所示:微信
由上圖可知,粉絲(微信客戶端)向公衆號(微信服務器)發送消息後,公衆號立刻將消息報文轉發給綁定的網站(開發者服務器),此時消息框架
傳送到了開發者的系統裏。而後系統解析消息報文,獲得消息內容,再根據消息內容,從業務數據庫中獲得返回的消息文本,最終將消息文本包裝編程語言
成回覆的消息報文(xml),返回給公衆號,公衆號再發送給請求的粉絲。網站
消息報文: 微信服務器轉發的消息報文格式以下:設計
<xml>xml
<ToUserName>![DATA[toUser]]</ToUserName> // 接收消息方,開發者微信號(公衆號AppID)
<FromUserName>![DATA[fromUser]]</FromUserName> //發送方帳號(OpenId)
<CreateTime>12356548575</CreateTime> //消息建立時間
<MsgType>![DATA[text]]</MsgType> //消息類型,text表明文本類型
<Content>![DATA[?18-546]]</Content> //消息內容,本例爲 ?18-546
<MsgId>1234567890123456</MsgId> //消息ID
</xml>
開發者服務器經過解析轉發的消息報文,獲得發送方帳號(回覆消息用)和消息內容,而後經過一系列業務處理,生成回覆消息報文,格式以下:
<xml>
<ToUserName>![DATA[userName]]</ToUserName> //接收消息方,微信客戶端帳號(OpenId)
<FromUserName>![DATA[fromUser]]</FromUserName> // 發送方帳號,(公衆號AppID)
<CreateTime>456251484</CreateTime> //消息建立時間
<MsgType>![DATA[text]]</MsgType> //回覆的消息類型,text表明文本消息
<Content>![[[18-546]的工做臺位爲[車體新廠房3號]]]</Content> //回覆的消息內容,本例爲[18-546]的工做臺位爲[車體新廠房3號]
</xml>
微信服務器接收到回覆的消息報文後,經過解析,將內容發送給微信客戶端,這樣客戶端接收到信息了。
注意事項: 一、開發服務器自接收到轉發的消息後,須要再5秒內給予回覆,超過期間,則自動回覆錯誤提示消息"該公衆號提供的服務出現故障,請稍後再試",
所以,業務處理時間最好不要大於5秒鐘;
二、回覆消息內容應聽從公衆號信息內容的設定,最好不要回復帶空格的消息,由於會出現不能正常回復的現象。