非开发者模式:如果公众号没有处于开发者模式,则只需要单纯的在 微信公众号后台进行设置就可以启用多客服功能
开发者模式:用户发送消息时的2种情况:
普通微信用户向公众号发消息时,微信服务器会先将消息POST到开发者填写的url上。
开发者响应包有两种(普通消息响应包,带有启动多客服指令的包)
如果希望将消息转发到多客服系统,需要开发者在响应包中返回MsgType为transfer_customer_service的消息,微信服务器收到响应后会把当次发送的消息以及之后一段 时间(2小时内)转发至多客服系统(系统会自动将用户分配给某个客服,也可指定客服)。
交互的数据通过post,数据放在XML中
多客服流程如下:
1)用户发消息
2)微信服务器接收并发送至开发者服务器(根据填写的url)
3)开发者服务器处理信息并判断是否触发多客服
4) 如果启用多客服返回一个MsgType为transfer_customer_service的消息给微信服务器
5) 微信服务器将当前的信息以及该用户之后一段时间内(2个小时后自动断开,中间若客服关闭会话也断开)
6) 信息转发至多客服系统 ,客服同该用户交流
注意:多客服系统自动将该用户分配给某一在线客服(但也可以指定某一客服,需要在响应的的信息包中加上指定的客服信息,但如果该客服不在线,该消息不会转给其他客服,所以需要提前获取客服信息,通过get请求获取客服数据(json格式)
http请求方式: GET https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist?access_token=ACCESS_TOKEN)
返回说明
返回数据示例(正确时的JSON返回结果): { "kf_online_list": [ { "kf_account": "test1@test", "status": 1, "kf_id": "1001", "auto_accept": 0, "accepted_case": 1 }, { "kf_account": "test2@test", "status": 1, "kf_id": "1002", "auto_accept": 0, "accepted_case": 2 } ] }多客服微信服务器和开发者服务器之间交互的3种数据包:
用户发送消息时微信服务器发给开发者的数据包:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName> //开发者微信号
<FromUserName><![CDATA[fromUser]]></FromUserName> //发消息用户的openid
<CreateTime>1348831860</CreateTime> //消息创建时间
<MsgType><![CDATA[text]]></MsgType> //消息类型
<Content><![CDATA[this is a test]]></Content> //消息内容
<MsgId>1234567890123456</MsgId> //消息id
</xml>
开发者服务器返回数据的2种情况(普通,多客服)
1)启用多客服系统时返回给微信服务器的数据包:
<xml>
<ToUserName><![CDATA[touser]]></ToUserName> //发消息用户的openid
<FromUserName><![CDATA[fromuser]]></FromUserName> //开发者微信号
<CreateTime>1399197672</CreateTime> //消息创建时间
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>
2)普通情况开发者服务器返回给微信服务器的数据包:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName> //发消息用户的openid
<FromUserName><![CDATA[fromUser]]></FromUserName> //开发者微信号
<CreateTime>12345678</CreateTime> //消息创建时间
<MsgType><![CDATA[text]]></MsgType> //消息类型
<Content><![CDATA[你好]]></Content> //消息内容
</xml>
//回复多客服消息例子private function transmitService($object)
{
$xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>";
$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}