微信是一個聊天工具,實現消息交互是一個很基礎且重要的功能,在公眾號中,用戶關注后,可以給公眾號發消息,公眾號可以通過將消息轉發給客服接待或者是直接根據用戶發送的消息回復用戶。微信提供的文檔其實挺清楚的,但是初次看還是覺得亂亂的,到開發的差不多了反倒是覺得文檔清晰了。
一旦配置了開發者URL,很多消息都會發送到那個url上去處理,所以對於有些消息最好都處理一下,不處理要返回空串
(微信服務器在5秒內收不到響應就會斷掉連接,並且重新發起請求,總共重試三次。當無法保證5秒內處理並且回復,可以回復空串,微信服務器不會對此做任何處理,且不會重試)
當普通用戶向公眾號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL。
消息包括:文本(text)、圖片(image)、語音(voice)、視頻(video)、小視頻(shortvideo)、地址位置(location)、鏈接(url) 7個類型
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> 開發者微信號 <FromUserName><![CDATA[fromUser]]></FromUserName> 發送方賬號(一個OpenID) <CreateTime>1348831860</CreateTime> 消息創建時間(整型) <MsgType><![CDATA[text]]></MsgType> 消息類型text <Content><![CDATA[this is a test]]></Content> 文本消息內容 <MsgId>1234567890123456</MsgId> 消息id,64位整型 </xml>
post過去的數據類型都是類似於上面的xml數據包,PHP語言注意不能用$_POST接收的,其他語言要用相應的方法去接受讀取消息。
通過解析上面的數據包就可以知道消息的類型和內容了,然后可以在響應包(Get)中返回特定的XML結構,來對該消息進行響應(現支持回復文本、圖片、圖文、語音、視頻、音樂)。
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> 接收方賬號 <FromUserName><![CDATA[fromUser]]></FromUserName> 開發者微信號 <CreateTime>12345678</CreateTime> 消息創建時間 <MsgType><![CDATA[text]]></MsgType> text <Content><![CDATA[你好]]></Content> 回復的消息內容,能夠換行 </xml>
以上是直接類似於自動回復的實現,還可以將消息轉發給客服。
做法需要開發者在響應包中返回MsgType為transfer_customer_service的消息,微信服務器收到響應后會把當次發送的消息轉發至多客服系統,消息被轉發到多客服以后,會被自動分配給一個在線的客服帳號,您也可以在返回transfer_customer_service消息時,在XML中附上TransInfo信息指定分配給某個客服帳號。
轉發給多客服需要返回如下:
<xml> <ToUserName><![CDATA[touser]]></ToUserName> <FromUserName><![CDATA[fromuser]]></FromUserName> <CreateTime>1399197672</CreateTime> <MsgType><![CDATA[transfer_customer_service]]></MsgType> </xml>
轉發給指定客戶需要返回如下:
<xml> <ToUserName><![CDATA[touser]]></ToUserName> <FromUserName><![CDATA[fromuser]]></FromUserName> <CreateTime>1399197672</CreateTime> <MsgType><![CDATA[transfer_customer_service]]></MsgType> <TransInfo> <KfAccount><![CDATA[test1@test]]></KfAccount> </TransInfo> </xml>
用戶被客服接入以后,客服關閉會話以前,處於會話過程中時,用戶發送的消息均會被直接轉發至客服系統。當會話超過2小時客服沒有關閉時,微信服務器會自動停止轉發至多客服,而將消息恢復發送至開發者填寫的url上。用戶在等待隊列中時,用戶發送的消息仍然會被推送至開發者填寫的url上。