微信是一个聊天工具,实现消息交互是一个很基础且重要的功能,在公众号中,用户关注后,可以给公众号发消息,公众号可以通过将消息转发给客服接待或者是直接根据用户发送的消息回复用户。微信提供的文档其实挺清楚的,但是初次看还是觉得乱乱的,到开发的差不多了反倒是觉得文档清晰了。
一旦配置了开发者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上。