热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JAVA微信公众号开发第4篇将用户消息转发到多客服

说明微信公众平台多客服功能如何使用将用户消息转发至客服开发步骤描述消息

    • 说明
    • 微信公众平台多客服功能如何使用
    • 将用户消息转发至客服开发步骤
      • 描述
      • 消息转发到多客服
        • 当用户输入关键词人工客服时进行消息转发
        • 生成转发报文
        • 将报文返回至微信公众平台


说明

本文主要针对博主JAVA微信公众号客服图文消息一文做补充

微信公众平台多客服功能如何使用

  • 获得多客服使用权限
    认证的微信服务号可以在 “公众平台-功能-添加功能插件” 看到 “多客服” 申请入口,申请开通即可。
    这里写图片描述]
  • 客服功能使用
    这里写图片描述
  • 微信公众平台客服PC版
    登陆地址请“点我”
    扫码登录
    操作界面

将用户消息转发至客服开发步骤

描述

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

消息被转发到多客服以后,会被自动分配给一个在线的客服帐号,您也可以在返回transfer_customer_service消息时,在XML中附上TransInfo信息指定分配给某个客服帐号。

用户被客服接入以后,客服关闭会话以前,处于会话过程中时,用户发送的消息均会被直接转发至客服系统。当会话超过2小时客服没有关闭时,微信服务器会自动停止转发至多客服,而将消息恢复发送至开发者填写的url上。用户在等待队列中时,用户发送的消息仍然会被推送至开发者填写的url上。

消息转发到多客服

当用户输入关键词【人工客服】时进行消息转发

/** * 

Title: getText

*

Description: 文本消息

* @param wxMessage * @param context * @param iService * @return */
private WxXmlOutMessage getText(WxXmlMessage wxMessage, Map context, IService iService){ if("人工客服".equals(wxMessage.getContent())){ //转至 return WxXmlOutMessage.TEXT().content(wxMessage.getContent()).toUser(wxMessage.getFromUserName()).fromUser(wxMessage.getToUserName()).buildKf(); } return WxXmlOutMessage.TEXT().content("您好!如有问题,请输入【人工客服】寻求帮助。").toUser(wxMessage.getFromUserName()).fromUser(wxMessage.getToUserName()).build(); }

生成转发报文

  • 返回消息模型WxXmlOutMessage.java
@XStreamAlias("ToUserName")
    @XStreamConverter(value = XStreamCDataConverter.class)
    protected String toUserName;

    @XStreamAlias("FromUserName")
    @XStreamConverter(value = XStreamCDataConverter.class)
    protected String fromUserName;

    @XStreamAlias("CreateTime")
    protected Long createTime;

    @XStreamAlias("MsgType")
    @XStreamConverter(value = XStreamCDataConverter.class)
    protected String msgType;

    public String getToUserName() {
        return toUserName;
    }

    public void setToUserName(String toUserName) {
        this.toUserName = toUserName;
    }

    public String getFromUserName() {
        return fromUserName;
    }

    public void setFromUserName(String fromUserName) {
        this.fromUserName = fromUserName;
    }

    public Long getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Long createTime) {
        this.createTime = createTime;
    }

    public String getMsgType() {
        return msgType;
    }

    public void setMsgType(String msgType) {
        this.msgType = msgType;
    }

    public String toXml() {
        return XStreamTransformer.toXml((Class) this.getClass(), this);
    }
/** * 获得文本消息builder * * @return */
    public static TextBuilder TEXT() {
        return new TextBuilder();
    }
  • 获得文本消息Builder
  • CDATA 转换器XStreamCDataConverter.java
package com.bigbigbu.wx.tools.util.xml;

import com.thoughtworks.xstream.converters.basic.StringConverter;

/** * CDATA 转换器 * @author FANQIBU * */
public class XStreamCDataConverter extends StringConverter {

    @Override
    public String toString(Object obj) {
        return " + super.toString(obj) + "]]>";
    }

}

– 获得文本消息TextBuilder.java

package com.bigbigbu.wx.tools.bean.outxmlbuilder;

import com.bigbigbu.wx.tools.bean.WxXmlMessage.WxKf;
import com.bigbigbu.wx.tools.bean.WxXmlOutTextMessage;

/** * @ClassName: TextBuilder * @Description: TODO 文本消息builder * @author FANQIBU修改于 2017年12月12日 下午4:16:14 (ps:增加构建客服消息) * @date 2017年12月12日 下午4:16:14 * */
public final class TextBuilder extends BaseBuilder<TextBuilder, WxXmlOutTextMessage> {
    private String content;
    private WxKf wxKf=null;

    public TextBuilder content(String content) {
        this.cOntent= content;
        return this;
    }

    public TextBuilder kfAccount(String kfAccount) {
        this.wxKf = new WxKf();
        this.wxKf.setKfAccount(kfAccount);
        return this;
    }

    public WxXmlOutTextMessage build() {
        WxXmlOutTextMessage m = new WxXmlOutTextMessage();
        setCommon(m);
        m.setContent(this.content);
        return m;
    }

    public WxXmlOutTextMessage buildKf() {
        WxXmlOutTextMessage m = new WxXmlOutTextMessage();
        setCommon(m);
        m.setContent(this.content);
        m.setMsgType("transfer_customer_service");
        if(wxKf != null){
            m.setWxKf(wxKf);
        }
        return m;
    }
}

–BaseBuilder.java

package com.bigbigbu.wx.tools.bean.outxmlbuilder;

import com.bigbigbu.wx.tools.bean.WxXmlOutMessage;

public abstract class BaseBuilder {

    protected String toUserName;

    protected String fromUserName;

    public BuilderType toUser(String touser) {
        this.toUserName = touser;
        return (BuilderType) this;
    }

    public BuilderType fromUser(String fromusername) {
        this.fromUserName = fromusername;
        return (BuilderType) this;
    }

    public abstract ValueType build();

    public void setCommon(WxXmlOutMessage m) {
        m.setToUserName(this.toUserName);
        m.setFromUserName(this.fromUserName);
        m.setCreateTime(System.currentTimeMillis() / 1000l);
    }

}

将报文返回至微信公众平台

 // 把消息传递给路由器进行处理
             WxXmlOutMessage xmlOutMsg = router.route(wx);
             if (xmlOutMsg != null)
                 out.print(xmlOutMsg.toXml());// 因为是明文,所以不用加密,直接返回给用户。

推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
author-avatar
fmz4733974
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有