java开发微信将消息转发到多客服

一、打开客服接口

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;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值