Len's Study-Log

集中一点,登峰造极!

0%

将消息转发到客服

关于微信小程序客服消息将消息转发到客服的功能,官方文档是这样写的:

如果小程序处于开发模式,普通微信用户向公众号发消息时,微信服务器会先将消息POST到开发者填写的url上,如果希望将消息转发到客服系统,则需要开发者在响应包中返回MsgType为transfer_customer_service的消息,微信服务器收到响应后会把当次发送的消息转发至客服系统。

接下来,还有个调用说明:

1
2
3
4
5
6
<xml> 
<ToUserName><![CDATA[touser]]></ToUserName>
<FromUserName><![CDATA[fromuser]]></FromUserName>
<CreateTime>1399197672</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>

请求参数说明

参数 是否必须 描述
ToUserName 接收方OpenID账号
FromUserName 开发者微信号
CreateTime 消息创建时间戳(整型)
MsgType transfer_customer_service

那么,问题来了,之前我们都是直接 return "success" 的,现在怎么在响应包中返回MsgType为transfer_customer_service的消息?

网上搜了一遍,都是说直接拼一个字符串返回就行了,例如这样:

1
return "<xml><ToUserName><![CDATA[oU-j***Jm0]]></ToUserName><FromUserName><![CDATA[gh_***5607]]></FromUserName><CreateTime>164***86</CreateTime><MsgType><![CDATA[transfer_customer_service]]></MsgType></xml>";

但是对于 Java 开发来讲,这样写是不行的,至少我尝试了很多次都是不行的。

可行的方法是:把这个响应包封装成一个 JSON 字符串,例如:

1
2
3
4
5
6
{
"CreateTime": 164***86,
"ToUserName": "oU-j***Jm0",
"FromUserName": "gh_***5607",
"MsgType": "transfer_customer_service"
}

另外,需要注意的是,如果人工客服接入了,微信就不会再把消息发到我们的服务器上了。需要等30分钟,会话关闭之后,微信才会又重新把消息发送到我们填写的URL上面。