目录

  • 前期准备
    • 1、微信公众平台基本设置
    • 2、开发所需参数
  • 功能步骤
    • 1、填写服务器配置
    • 2、验证服务器地址的有效性
    • 3、依据接口文档实现业务逻辑
  • 具体实现
    • 1、微信接入
    • 2、自定义回复及多客服接入

默认微信公众平台对公众号的自动回复、多客服等功能都是可以直接使用的。
但是由于一些因素(扫码登录)开放了微信公众号接口,导致以上功能需要自己对接,无法直接使用平台提供的功能。
以下是我对公众号自动回复和多客服实现的一些心得。

效果:

前期准备

1、微信公众平台基本设置

公众号官网:https://mp.weixin.qq.com

公众号客服系统地址:https://mpkf.weixin.qq.com/

登录前需公众号管理员设置客服账号:

基本配置:

AppSecret:自动生成

IP白名单:服务器外网ip(调用“获取access_token”接口,返回结果。如非白名单IP调用,将返回错误码:40164)

服务器地址:备案的域名下的某个可访问路径

Token令牌: 自定义

消息加密密钥:自动生成即可

消息加密解密方式:安全模式

2、开发所需参数

开发者ID(AppID)

开发者密码(AppSecret)

服务器令牌(Token)

消息加解密密钥(EncodingAESKey)

功能步骤

1、填写服务器配置
2、验证服务器地址的有效性

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

1)将token、timestamp、nonce三个参数进行字典序排序

2)将三个参数字符串拼接成一个字符串进行sha1加密

3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

3、依据接口文档实现业务逻辑

具体实现

全局常量:

   //@Value("${DNBX_TOKEN}")private String DNBX_TOKEN = 服务器令牌token;
1、微信接入

接入地址需要和配置中的服务器地址匹配

/*** 微信接入* 必须为get方式获取接口参数并验证* @return* @throws IOException*/@RequestMapping(value = "/connect", method = RequestMethod.GET)public void connectWeixin(HttpServletRequest request, HttpServletResponse response) throws IOException {PrintWriter print;//获取微信接口参数String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");LOGGER.info("\n[signature=" + signature+ "][timestamp=" + timestamp+ "][nonce=" + nonce+ "][echostr=" + echostr+ "][token=" + DNBX_TOKEN + "]");// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败if (signature != null && WeChatUtil.checkSignature(signature, DNBX_TOKEN, timestamp, nonce)) {try {print = response.getWriter();print.write(echostr);print.flush();print.close();LOGGER.info("wechat auth success...");} catch (IOException e) {e.printStackTrace();}} else {LOGGER.info("wechat auth failure...");}}
2、自定义回复及多客服接入
    @RequestMapping(value = "/connect", method = RequestMethod.POST, produces = "application/xml;charset=UTF-8")public void wechatPost(HttpServletRequest request, HttpServletResponse response) throws IOException {request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");LOGGER.info("wechat post request start...");PrintWriter print = response.getWriter();String reqStr = IOUtils.toString(request.getInputStream());LOGGER.info("解密请求消息:");try {//对消息加密,相关工具类官方已提供WXBizMsgCrypt pc = new WXBizMsgCrypt(DNBX_TOKEN, 消息加解密密钥EncodingAESKey, 开发者AppID);String timeStamp = String.valueOf(System.currentTimeMillis());    // 时间戳String nonce = DateUtil.format(new Date(), "yyyyMMddHHmmss");    // 随机字符串print = response.getWriter();String msgSignature = request.getParameter("msg_signature");System.out.println("msgSignature = " + msgSignature);String timestamp = request.getParameter("timestamp");String urlnonce = request.getParameter("nonce");System.out.println("urlnonce = " + urlnonce);String openid = request.getParameter("openid");String encrypt_type = request.getParameter("encrypt_type");String decryptStr = pc.decryptMsg(msgSignature, timestamp, urlnonce, reqStr);System.out.println("decryptStr = " + decryptStr);//LOGGER.info("解密后的请求消息:" + decryptStr);//XmlAndMap是自己封装的xml转map的工具类,此处是自动解析decryptStr为xml然后转map,如过不爱自己写可以留下邮箱索要Map<String, String> req = XmlAndMap.xmlToMap(decryptStr);Map<String, String> rsp = new HashMap<String, String>();//获取解密后的数据并封装Maprsp.put("ToUserName", req.get("FromUserName"));rsp.put("FromUserName", req.get("ToUserName"));rsp.put("CreateTime", req.get("CreateTime"));String replymsg = "";//判断返回的数据类型是否是事件if (req.get("Event") != null) {if (req.get("Event").equals("subscribe")) {//判断当前事件是关注事件rsp.put("MsgType", "Text");rsp.put("Content", "自定义的欢迎语句内容");}} else {//此处为消息类型Map replyMap = new HashMap();replyMap.put("人工客服", "正在为您链接到客服人员,请耐心等候……");//加载关键词及其回复内容List<KeyWordReply> keyWordReplies = keyWordService.selectKeyWords();for (KeyWordReply keyword : keyWordReplies) {String[] split = keyword.getKeyWord().split(",");for (String item : split) {replyMap.put(item.trim(), keyword.getText());}}//用户输入词汇与自定义的关键词匹配if (replymsg != null && replyMap.containsKey(req.get("Content").trim())) {if ("人工客服".equals(req.get("Content"))) {LOGGER.info("人工客服===================");//人工客服对接MsgType类型为transfer_customer_servicersp.put("MsgType", "transfer_customer_service");rsp.put("Content", replymsg);} else {LOGGER.info("自动回复===================");replymsg = (String) replyMap.get(req.get("Content"));rsp.put("MsgType", "Text");rsp.put("Content", replymsg);}} else {用户输入词汇与自定义的关键词匹配失败自动回复内容replymsg = "您好!如有问题,请输入【人工客服】寻求帮助。";rsp.put("MsgType", "Text");rsp.put("Content", replymsg);}//LOGGER.info("加密前响应报文:\n" + XmlAndMap.mapToXml2(rsp));}//回复内容加密并输出String miwen = pc.encryptMsg(XmlAndMap.mapToXml2(rsp), timestamp, urlnonce);print.write(miwen);//LOGGER.info("加密后响应报文:\n" + miwen);print.flush();print.close();} catch (IOException e) {e.printStackTrace();} catch (AesException e) {e.printStackTrace();}}

1)、代码中提到的消息类型及数据结构参考:官方文档

2)、对消息加密,加密工具类官方提供:官方代码

微信公众号自动回复及多客服功能实现相关推荐

  1. 如何让微信公众号快速接入智能客服机器人?

    工具: 1.一枚公众号. 2.一枚免费的第四范式智能客服机器人. STEP 1:登陆官网 https://www.4paradigm.com/solution/bot,注册一个属于自己的机器人. ST ...

  2. PHP 微信公众号真正正确的客服头像上传

    首先我们来看官方文档 这TM的搞笑呢 什么破玩意儿! 需要条件 1 需要有一个客服的账号 (废话) 2 一致jpg格式的图片(扯蛋) 完整流程 1 获取access_token 2获取账号 3 $ur ...

  3. 怎么设置微信公众号自动回复内容显示用户昵称

    对于微信公众号自动回复内容显示用户昵称,第三方平台微号帮提供了粉丝对话定时推送功能实现,支持公众号设置自动回复消息显示用户昵称,除了可以显示对应用户的昵称,还可以显示用户的头像.openID;用户向公 ...

  4. 微信公众号自动回复信息如何设置带链接的文字

    对于微信公众号自动回复信息设置带链接的文字,第三方平台微号帮提供了粉丝对话定时推送功能实现,可以实现公众号自动回复信息设置带链接的文字,可以延迟自动回复信息等;当粉丝向公众号发消息后自动触发回复,如果 ...

  5. java微信公众号自动回复文字加图片

    java微信公众号自动回复文字加图片 开发流程 详细流程,附上代码: 第一步服务器(url)接口配置 服务器(url)接口配置,此步骤就是微信授权接口的过程,如果域名都不改变,微信只会校验一次.此请求 ...

  6. 微信公众号自动回复-底部菜单栏-关键字回复-回复2条消息(1文字,1图片)

    微信公众号自动回复-底部菜单栏-关键字回复-回复2条消息(1文字,1图片)JAVA 主要实现: 1.关注后自动回复文字内容 2.关键字回复图文消息 3.实现公众号自定义底部菜单栏 - 点击菜单栏进入链 ...

  7. asp微信公众号自动回复开发案列之新闻查询机器人

    <% '********************************************** 'ASP文件需要以UTF-8的格式保存,否则乱码. '******************* ...

  8. 微信 SHA1 签名_微信公众号自动回复功能开发

    微信公众号自动回复功能开发 本篇主要讲解 微信公众号自动回复功能开发,让我们自己去托管公众号回复的功能,这样可以更加灵活的根据公众号收到的信息来制定特定的回复信息,一起来了解吧! 1.注册公众号 如果 ...

  9. 微信公众平台开发之微客服

    微信公众平台开发之微客服是实现人工客服的重要手段.前面我们介绍如何添加自定义回复,当用户发送某个关键词给我们的平台的时候就能根据我们添加的关键词自动回复.但是这样我们不能把所有的词语都添加进去,有时候 ...

  10. Flask结合werobot实现微信公众号自动回复

    Flask结合werobot实现微信公众号自动回复 下载依赖包 pip install werobot pip install Flask 建立项目文件夹<flask_project> 建 ...

最新文章

  1. Hbase完全分布式的搭建
  2. RabbitMQ脑裂问题解决方案调查
  3. hdu 5037 Frog 贪心 dp
  4. python tensorflow pytorch 深度学习 车牌识别
  5. Linux 调度器内幕
  6. [Android] 输入系统(三):加载按键映射
  7. sulin Python3.6爬虫+Djiago2.0+Mysql --实例demo
  8. c 语言指针教学视频,[C语言] 猎豹网校 C和指针视频教程
  9. python精通时间_学Python需要多久能学会?精通Python需要多长时间?
  10. conda install 换源_ubuntu更换pip install,apt-get,conda install 成国内源
  11. 操作系统之计算机系统概述:7、操作系统的体系结构
  12. linux智能电压表设计与实现,STC89C51数字电压表
  13. Asp.net控件开发学习笔记(二)-控件开发基础
  14. 181026英语每日一句
  15. phpstudy安装部署DVWA
  16. hdu 2079 - 选课时间
  17. 2018年机器视觉产业技术现状、发展趋势分析及发展前景预测
  18. html用if函数,if函数怎么用的实例
  19. SQL service基础(九)用户定义数据类型和用户定义函数的概念、创建及使用方法
  20. java中求两个数的最小公倍数,最大公约数的简便方法

热门文章

  1. python实现图形旋转_图像随机旋转及坐标进行旋转原理及Python实现
  2. 数据线性拟合优化之路
  3. 互联网人必备的六大类专业搜索工具
  4. mysql视图创建以及权限
  5. 模块学习笔记-IR2110/IR2130(上)
  6. labwindows panel设置透明度方法
  7. 信号与系统、数字信号处理——复试常见问题
  8. rabbitmq消息队列--restTemplate实现跨域请求--获取JSON字符串
  9. android 文件保存到应用和sd卡中
  10. 通过cRIO 9047 USB端口自定义开发周立功CAN盒