一、打开客服接口
public interface KfService {
public boolean checkSignature(HttpSession hs, String signature, String timestamp,
String nonce) throws Exception;
public String kfMessage(HttpSession hs, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
二、实现客服接口
@Service
public class KfServiceImpl implements KfService {
private String kfAccount;//转发到多客服的随机账号
/**
*
*在此省略了次要部分代码
*
**/
2.1建立转发到客服的方法
private String buildReturnKfMessage(String reqmsg, BaseMessage v, String method) {
log.info(String.format(“call buildReturnKfMessage:%s”, v.getMsgType()));
if (v.getMsgType().equals(BaseMessage.MESSAGETYPE_TCS)) {
KfMessage k = (KfMessage) v;
log.info(String.format(“analyse %s”, k.getContent()));
try {
JSONObject n = new JSONObject(k.getContent());
String name = n.has(“name”) ? n.getString(“name”) : “”;
if (name.equals(“”)) {
throw new Exception(“unknow name!”);
}
if (name.startsWith("itjuzi_") || name.startsWith("query")) {
BaseMessage message = new BaseMessage();
if (message.getMsgType().equals(BaseMessage.MESSAGETYPE_TCS)) {
KfMessage kf = (KfMessage) message;
String r = "";
if (method.equals("voice")) {
r = reqmsg + "\n" + kf.getContent();
} else {
r = kf.getContent();
}
return WeiXinMessage.toKfResponseContent(v.getFromUserName(), v.getToUserName(), r,kfAccount);
} else if (message.getMsgType().equals(BaseMessage.MESSAGETYPE_NEWS)) {
NewsMessage nn = (NewsMessage) message;
return WeiXinMessage.toNewsResponseContent(v.getFromUserName(), v.getToUserName(), nn.getArticles());
}
} else {
String r = "";
if (method.equals("voice")) {
r = reqmsg + "\n" + k.getContent();
} else {
r = k.getContent();
}
return WeiXinMessage.toKfResponseContent(v.getFromUserName(), v.getToUserName(), r,kfAccount);
}
} catch (Exception e) {
//不是json文件, 直接作为文本处理
//log.warn("", e);
}
2.2调用转发到客服的方法
if (msgType.equals(WeiXinMessage.REQ_MESSAGE_TYPE_TEXT)) {
BaseMessage v = sessionFactory.dialog(fromUserName, “wechat”, content);
v.setToUserName(toUserName);
v.setFromUserName(fromUserName);
v.setKfAccount(kfAccount);
message = buildReturnKfMessage(content, v, "transfer_customer_service");//转发到客服
}
三、处理文本消息,以便发给微信平台服务器
3.1将文本消息对象转换成xml节点,并加CDATA标记
/**
* 文本消息对象转换成xml
*
* @param kfMessage
* 文本消息对象
* @return xml
*/
public static String textMessageToXml(KfMessage kfMessage) {
XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对所有xml节点的转换都增加CDATA标记
boolean cdata = true;
@SuppressWarnings("rawtypes")
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
if (name.equals("TransInfo")){
cdata = false;
} else {
cdata = true;
}
}
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
xstream.alias(“xml”, kfMessage.getClass());
return xstream.toXML(kfMessage);
}
3.2建立用于多客服响应的方法,xml节点的CDATA标记中的参数
public static String toKfResponseContent(String fromUserName,
String toUserName, String responseMessage,String kfAccount) {
KfMessage kfMessage = new KfMessage();
kfMessage.setToUserName(fromUserName);
kfMessage.setFromUserName(toUserName);
kfMessage.setCreateTime(new Date().getTime());
kfMessage.setMsgType(BaseMessage.MESSAGETYPE_TCS);
return textMessageToXml(kfMessage);
}
3.3相关的BaseMessage类中的部分代码
public class BaseMessage {
public static final String MESSAGETYPE_TEXT = “text”;
public static final String MESSAGETYPE_NEWS = “news”;
public static final String MESSAGETYPE_TCS = “transfer_customer_service”;
private String ToUserName;
private String FromUserName;
private long CreateTime = (new Date()).getTime();
private String MsgType;
private String KfAccount;