在开发环境进行客服消息的接入测试,需要用到内网穿透工具,如ngrok或者花生壳,推荐前者。在开发页面设置好回调服务器地址,选择好数据格式,这里特别说明一下,客服消息转发到客服工具(注:微信网页客服端)和加不加密无关,和那种数据格式无关。
推荐文章:微信小程序客服消息回复开发
这是社区里面的一篇接入文章,写的通俗易懂,不知道如何接入的话,强烈建议先看这篇文章。我遇到的问题是,原样返回接收到的客服消息之后并没有在客服助手处收到待接入的信息,所以这篇文章的目的在于说清楚理解上的奇异点。
1.服务器签名验证,以下是正确的排序代码,文档中写的是将token,nonce,timestamp按字典序进行排序,指的是按照值得字典序进行排序拼接,而不是对应得参数字段名[token,timestamp,nonce]。当然在某些服务中,也有采用后面这种这是我在接入中遇到得第一个问题。
List<String> strings = Lists.newArrayList(token, nonce, timestamp);
strings.sort(Comparator.naturalOrder());
String txt = String.join("", strings);
if(signature.equals(DigestUtils.sha1Hex(txt)){
return true;
}
return false;
DigesUtils是apache commons-codec包下得工具类。
2.转发到客服工具,在这里的奇异点是,将MsgType改为transfortransfer_customer_service然后原样返回就好,是的我仅仅将接收到的json数据中的MsgType改成transfortransfer_customer_service然后返回,由于这是在同一个http请求中完成的,所以一旦完成之后,得不到反馈,就没法根据错误码进行差错。这里需要注意的两点
①需要将ToUserName指定为接收数据中的FromUserName,FromUserName 指定为接受到数据中的ToUserName,然后CreateTime为接受到数据的CreateTime,MsgType为transfortransfer_customer_service。
②在接收到该客服消息的HTTP请求的response应答体、只能包含上述的4个字段。格式的你接受的是什么数据格式,返回的就是什么数据格式。
Map<String, Object> rs = Maps.newHashMap();
rs.put("MsgType","transfer_customer_service");
rs.put("ToUserName", app.getFromUserName());
rs.put("FromUserName", app.getToUserName());
rs.put("CreateTime", app.getCreateTime());
return JSON.toJSONString(rs);
总结:思维的固式让我在接入的时候,会按照自己的习惯去思考微信的接口。
3.将信息转发给某个指定的客服,方式有两种,可以去接入三方客服工具如回复中的所提到的。或者参官方文档中的 转发指定接入客服以下截图一段官方文档内容
在响应包中返回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>
<TransInfo>
<KfAccount><![CDATA[test1@test]]></KfAccount>
</TransInfo>
</xml>
有趣的是,这段文档是我在公众号开发的文档中找到的,在小程序客服消息中并没有指定客服消息的描述,不过看字段和配置方式一致,再加上三方工具也说明支持,那么我们可以大胆的说yes。有个疑问是这里的KfAccount 看上去像是账号,是微信号吗?这里的@又让人觉得是邮箱。如果有知道的小伙伴,欢迎补充以下。
你好,请问转发客服消息能否实现指定客服人员,感谢