微信公众号接入自己的客服系统,自定义客服系统

微信公众号客服功能对接(微信自己的客服系统


文章目录

    • 一、前提
      • 1-1、接收对方的消息
      • 1-2、发送消息给对方
      • 1-3、消息推送机制
    • 二、直接后台(单个服务)
      • 2-1、业务图
    • 三、直接后台(多个服务)
      • 3-1、业务图
    • 四、转接后台(单个服务)
      • 4-1、业务图
    • 五、转接后台(多个服务)
      • 5-1、业务图
    • 六、其它


一、前提

消息的对话是由两部分组成一个发送消息给对方,一个接收到对方的消息

1-1、接收对方的消息

在开发之前,我们需要给微信提供接口,这个接口支持Get和Post请求,以后微信后台和我们服务就是通过这个接口去沟通的。

在填写接口的时候,微信会去调用你接口的Get方法验证: 因为可能有伪造请求,所以每次你都要在业务进行前进行验证,这个请求是否合法,具体参考这里:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

代码如下:

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/portal")
public class WxHandler {

    @GetMapping(produces = "text/plain;charset=utf-8")
    public String authGet(
            @RequestParam(name = "signature", required = false) String signature,
            @RequestParam(name = "timestamp", required = false) String timestamp,
            @RequestParam(name = "nonce", required = false) String nonce,
            @RequestParam(name = "echostr", required = false) String echostr) {

        // 1、对数据进行进行校验

        return echostr;
    }

    @PostMapping(produces = "application/xml; charset=UTF-8")
    public String post(@RequestBody String requestBody,
                       @RequestParam("signature") String signature, @RequestParam("timestamp") String timestamp,
                       @RequestParam("nonce") String nonce, @RequestParam("openid") String openid,
                       @RequestParam(name = "encrypt_type", required = false) String encType,
                       @RequestParam(name = "msg_signature", required = false) String msgSignature) throws InterruptedException {
        // 1、对数据进行进行校验

        // 2、业务处理

        // 3、注意如果在5s内没有收到回复,会重试三次,还是失败后就会告知用户,该公众号服务中断

        return "";
    }
}

注意如果在5s内没有收到回复,会重试三次,还是失败后就会告知用户,该公众号服务中断

上面post请求里面的requestBody就包含了用户的消息内容和用户信息,我们就可以进行业务处理了。


我们提供的这个接口需要外网,我们可以借助:ngrok

不过现在正式公众号好像屏蔽了这个,测试公众号还可以用


1-2、发送消息给对方

自定义客服是基于微信提供的回复用户消息接口触发的,也就是用户触发了某个动作后,48小时内我们可以对这个消息进行回复。

目前支持的动作

  • 用户发送信息
  • 点击自定义菜单(仅有点击推事件、扫码推事件、扫码推事件且弹出“消息接收中”提示框这3种菜单类型是会触发客服接口的)
  • 关注公众号
  • 扫描二维码
  • 支付成功

然后我们就可以多次调用发消息接口进行消息发送了,目前限制一日50w次调用,每个月可以有10次清空的机会。

在这里插入图片描述

全部类型消息接口地址


这里有一个基于微信操作封装好的框架,比如上面的发消息,如果使用了这个框架就可以这样写

@GetMapping("/fun")
public boolean String() throws WxErrorException {
    WxMpKefuMessage message = new WxMpKefuMessage();
    message.setToUser("o2tmFv6nFgxPzbYt4fqlgvzyaL8s");
    message.setMsgType("text");
    message.setContent("等待客服接入");
    return weixinService.getKefuService().sendKefuMessage(message);
}

这个框架封装的很好,功能很强大,文档地址:https://github.com/Wechat-Group/WxJava


1-3、消息推送机制

下面的业务实现都是基于WebSocket技术进行数据的交互,不懂的可以先去看看。

基于WebSocket实现Web端聊天系统


二、直接后台(单个服务)

2-1、业务图

在这里插入图片描述

当用户消息来了之后,指定一个客服和这个用户建立连接,客服和客户的连接session全部都在一个服务器上面,直接业务处理就好了。


三、直接后台(多个服务)

3-1、业务图

在这里插入图片描述

四、转接后台(单个服务)

可能有的人不太理解什么是转接后台,比如我现在所做的业务,微信公众号直接后台(我们称之为微厅),我们的微厅只提供缴费、留言、办理业务等事情。

我们有一个专门的客服工单系统,有专门的客服去提供对客户的支持,所以我们的业务微信聊天功能当然也是应该做在这个地方。

但是因为微信后台地址只能绑定一个(这个也很好理解),所以我们的微厅接收到消息之后要把消息推送到我们的客服工单系统,我称之为转接后台。


4-1、业务图

在这里插入图片描述

五、转接后台(多个服务)

5-1、业务图

在这里插入图片描述

除去微信和前端,我们主要是两种服务(微厅和客服工单都是分布式的),其中的难点是消息的消费,有两种做法:

  • 微厅做,微厅可以实现每个消息精准的投放到对应的服务器(使用redis分布式缓存,数据共享,可以知道每个客服与哪个机器建立连接)
  • 工单做,已经建立连接的消息使用广播消费,这样微厅就不需要判断了。

集群消费:当使用集群消费模式时,MQ 认为任意一条消息只需要被集群内的任意一个消费者处理即可。

广播消费:当使用广播消费模式时,MQ 会将每条消息推送给集群内所有注册过的客户端,保证消息至少被每台机器消费一次。


六、其它

至于客户怎么和客服建立连接,这个就要看具体的业务逻辑了,当然了总的来说是要均摊的。


http://www.niftyadmin.cn/n/774916.html

相关文章

Idea插件,MyBatis Log Plugin,自动生成完整的sql

我们在使用MyBatis的时候,打印出来的sql都是sql本体和参数分离,一两个参数倒也还好,参数多了复制起来就很麻烦了,使用插件MyBatis Log Plugin 可以完美解决这个问题。 重启IDEA后的操作如下:

超好用的Java反编译工具jd-gui【Java反编译工具】

有时候我们需要对已经打包好的jar包进行查看,这里推荐一个好用的工具jd-gui,无需安装,打开后直接把jar包拖动进去即可。 效果演示 关注微信公众号回复:jd-gui

你真的懂hashCode和equals吗???

前言 今天还在感概说,可能三年后我的简历和刚毕业那会没啥区别,因为现在已经毕业快一年了,上次重写简历除多了两个项目经验外没啥区别,而简历上面的技术我还需要好久才能掌握。 一、关于hashCode和equals我们知道下面几点 hashC…

MySql分表设计,Java分表设计

文章目录一、前言1-1、什么时候需要分表呢?1-2、分表的规则是什么呢?1-2-1、分表前后1-2-2、其它二、举例场景三、实现分表功能3-1、数据的增删改3-2、数据的查询3-3、自动创建表3-4、其它一、前言 1-1、什么时候需要分表呢? 这个其实就很简…

MySql关键字GROUP_CONCAT,组合连接查询

一、 试着想一下如果有这样一个需求应该怎么去做: 有一张学生表,和一张分数表。要查出每个学生姓名和分数,分数以逗号隔开 eg:张三 80,90,100 这个需求很简单,有很多种办法来解决,最简单的是我们可以先查询学生&#x…

MySql分组查询规则

文章目录一、问题二、结论证明实验一实验二一、问题 思考一下假如你有一个这样的需求 有一张账单表(bill_detail),一张开票表(open_invoice) 每一个用户有三种费用类型,分别是水费、污水费、违约金。&…

Nginx负载均衡当其中一台服务器挂掉之后,Nginx负载将会怎样呢?

之前写过Nginx负载均衡的配置,详情可以看这里 Nginx实现负载均衡Linux版本(六种负载策略) 今天来探讨一下当我们有多台服务的时候,其中一台服务挂掉了会怎么样呢? 我们使用上文中的思路去搭建一个简单的负载均衡&…

SpringCloud微服务详解(springcloud alibaba)

文章目录一、前言二、架构图三、过程详解3-1、服务的调用方3-2、负载均衡(Nginx)3-3、网关3-4、注册中心3-5、服务负载均衡调用3-6、服务提供方3-7、服务熔断、降级、限流、监控3-7-1、熔断3-7-2、降级3-7-3、限流3-7-4、监控3-8、统一配置文件3-9、分布…