1、流程:用户在公众号发送文本消息,通过公众号消息模板推送通知给客服,客服点击通知,跳转小程序与用户对话。用户可以直接在公众号内与客服对话。

2、所用技术栈:

"php": "^7.3|^8.0",
"laravel/framework": "^8.54",
"overtrue/laravel-wechat": "^6.0",
"overtrue/wechat": "~5.0",
"workerman/gateway-worker": "^3.0",
"workerman/workerman": "^4.0",

3、首先截获用户在公众号发送的消息(workerman搭建不再赘述,详情可查看官方文档)

WechatController.php

    public function wechetCheck(){$app = Factory::officialAccount($this->config);$app->server->push(function ($message) use ($app) {switch ($message['MsgType']) {case 'event' :{// do something}break;case 'text':{//检查用户是否咨询过,咨询过则用原message_id$openId = $message['FromUserName'];$LogServerMessage = new LogServerMessage();$checkMessage = $LogServerMessage->getIdByOpenId($openId);if (!$checkMessage) {$messageId = $LogServerMessage->newMessage($openId)->id;} else {$messageId = $checkMessage->id;}$LogServer = new LogServer();$serverRes = $LogServer->addLog($messageId, $openId, 0, $message['Content']);// 发送消息模板,按自己的实际情况编写// do something}//由于我的服务器同时运行了多个workerman,需要指定registerAddress发送消息Gateway::$registerAddress = '127.0.0.1:1237';Gateway::sendToGroup("server_{$messageId}", json_encode(['type' => 'message','content' => $message['Content'],'id' => $serverRes->id]));return "消息提示";}}});return $app->server->serve();}//发送消息给用户,配置路由为 /server-message-listpublic function sendServerMsgToUser(Request $request){$messageId = $request->input('message_id');$content = $request->input('content');$toUserOpenId = $request->input('to_user_open_id');$fromUserOpenId = $request->input('from_user_open_id');$app = Factory::officialAccount($this->config);$app->customer_service->message($content)->to($toUserOpenId)->send();$LogServer = new LogServer();$server = $LogServer->addLog($messageId, $fromUserOpenId, 1, $content);$data['status'] = 'success';$data['content'] = $server->id;return $data;}

LogServerMessage.php(表结构很简单,就只保存open_id)

    public function newMessage($openId){return $this->create(['open_id' => $openId]);}public function getIdByOpenId($openId){return $this->where('open_id', $openId)->first(['id']);}

LogServer.php(记录消息详情)

    /****$userType 0:用户;1:客服;***/public function addLog($messageId, $openId, $userType, $content){return $this->create(['message_id' => $messageId,'open_id' => $openId,'user_type' => $userType,'content' => $content]);}public function getListByMessageId($messageId){return $this->where('message_id', $messageId)->orderBy('id', 'asc')->get(['id', 'user_type', 'content', 'open_id']);}

4、前端连接websocket,我这里使用的是uniapp

<template><view class="h-100 w-100 p-1"><scroll-view class="content-wrap bg p-1" :scroll-y="true"  :scroll-into-view="scrollViewItem"><view v-for="(item, index) in list" :key="index" class="w-90p":class="[parseInt(item.user_type) === 0 ? '' : 'msg-server-flex']"><view class="msg border-round border p-05 m-b-05" :id="`msg_${item.id}`":class="[parseInt(item.user_type) === 0 ? 'msg-customer' : 'msg-server']"><span>{{ item.content }}</span></view></view></scroll-view><view class="flex flex-center flex-col footer w-90p"><u-input :border="true" style="width: 100%" type="textarea" v-model="content"/><u-button :custom-style="longPop" size="mini" type="primary-color" :hair-line="false" @click="sendMessage">发送</u-button></view></view>
</template><script>
export default {name: "index",data() {return {messageId: '',list: [],user: this.$common.getUserInfo(),content: '',longPop: {width: '100%',margin: '0.5rem auto'},toUserOpenId: '',fromUserOpenId: '',scrollViewItem: ''}},methods: {getMessage() {const data = {uid: this.user.uid,token: this.user.token,message_id: this.messageId}this.$ajax.post(`${this.$url}/server-message-list`, data).then(res => {this.list = []if (res.data.status === 'success') {this.list = res.data.content.listthis.toUserOpenId = res.data.content.open_idthis.fromUserOpenId = res.data.content.server_open_idthis.scrollToBottom(this.list[this.list.length - 1].id)}})},sendMessage() {const data = {uid: this.user.uid,token: this.user.token,content: this.content,to_user_open_id: this.toUserOpenId,from_user_open_id: this.fromUserOpenId,message_id: this.messageId}this.$ajax.post(`${this.$url}/send-server-msg-to-user`, data).then(res => {this.list.push({content: this.content,user_type: 1,id: res.data.content})this.content = ''this.scrollToBottom(res.data.content)})},scrollToBottom(id){this.scrollViewItem = `msg_${id}`}},onLoad(option) {this.messageId = option.message_idthis.getMessage()uni.connectSocket({url: `wss://your-wesocket?message_id=${this.messageId}`,success: res => console.log('success:', res),error: res => console.log('error:', res),complete: res => console.log('complete:', res),})const _this = thisuni.onSocketMessage(function (res) {const data = JSON.parse(res.data)if (data.type === 'message') {_this.list.push({content: data.content,user_type: 0,id: data.id})_this.scrollToBottom(data.id)}});}
}
</script><style scoped lang="scss">
@import "src/static/style/common.scss";.bg {background-color: #fcfcfc;
}.p-1 {padding: 25rpx;
}.h-100 {height: 100vh;
}.w-100 {width: 100vw;
}.w-90p {width: 90%;
}.p-05 {padding: 15rpx;
}.m-b-05 {margin-bottom: 15rpx;
}.border-round {border-radius: 5px;
}.border{border: 1px solid #efefef;
}.flex {display: flex;
}.flex-center {justify-content: center;align-items: center;
}.flex-col {flex-direction: column;
}.content-wrap {height: calc(100vh - 300rpx);overflow-y: auto;
}.footer {position: fixed;left: 5%;bottom: 30rpx;background-color: white;
}.msg {max-width: 45%;display: inline-block;
}.msg-customer {background-color: white;
}.msg-server {background-color: $green;color: white;
}.msg-server-flex {display: flex;justify-content: flex-end;
}
</style>

基于laravel+workerman+easywechat的公众号客服系统相关推荐

  1. 微信公众号客服系统怎么生成能追踪效果的二维码?

    想要做好微信公众号的运营,专业的技能少不了,但是也要具有善于使用工具的能力,正所谓"工欲善其事必先利其器",一款好的客服系统,不但可以方便我们进行客户接待,还能帮助我们生分析公众号 ...

  2. 微信公众号客服系统怎么实现消息提醒,快速回复粉丝留言?

    很多做微信公众号运营的小编,都会有这样的工作经验吧,一上班就开始刷新微信公众号后台,看看有没有粉丝留言,然后这一天就开始了时不时打开后台页面看一下,即使这样还是免不了粉丝留言晚回或者漏回的情况发生,追 ...

  3. php公众号客服系统,公众号在线客服系统哪个好,主流客服系统评测及推荐

    微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字.图片.语音.视频的全方位沟通.互动 .形成了一种主流的线上线下微信互动 ...

  4. 微信营销为什么会用到微信公众号客服系统?

    最近看到在网上很多人问运营微信公众号有必要用客服软件吗,公众号客服软件到底好不好?针对这个问题,我简单的说下. 首先,我自己本身就是做运营的,不用第三方软件,会遇到粉丝消息回复不及时.聊天记录只能保存 ...

  5. 在微信公众号里的web商城嵌入客服_微信公众号客服功能如何在手机上使用?

    微信公众号官方提供了免费的多客服功能,但是由于官方的客服功能只有PC版,并且没有实时的客服消息通知,这就导致下班后无法提供客服服务,给客户不好的体验. 另外,还有些小企业,由于没有专职的客服人员,没办 ...

  6. 微信公众号客服系统消息能即时提醒吗?

    微信公众号的客服系统,当有用户在后台留言的时候,网页版客服系统只能通过提示声音来判断,不会弹出消息提醒.所以只能采用戴耳机安音响这种方式了嘛?当然不是,你需要的是一款可以消息即时提醒的微信公众号客服系 ...

  7. 公众号客服消息经常忘记看?简单设置,立即提醒查看!

    当客服工作繁忙,打开了多个网页,不在客服后台,能收到消息提示,声音提示吗? 当客服离开岗位,浏览器最小化,不打开网页的情况下,能知道哪个公众号哪个用户发了什么内容吗? 今天就给大家分享这个方法! 第一 ...

  8. h5 修改title 微信_微信公众号客服消息不限次数推送如何设置?

    在公众平台发送客服消息,只能通过消息管理功能实现,仅支持一个个粉丝单独发送文本信息,如果想要实现更多功能效果,可以使用微号帮平台的48小时信息推送功能实现,或者通过公众号平台的接口编程开发实现功能,都 ...

  9. Java实现微信公众号客服功能和本地联调

    Java实现微信公众号客服功能 微信公众平台设置 生产环境 公众号 设置 [开发]–> [基本配置]–> [服务器配置] 注: a.服务器地址(URL) 是开发者用来接收微信消息和事件的接 ...

最新文章

  1. No cached version of com.android.tools.build:gradle:2.0.0 available for offline mode.
  2. [问题解决]NotImplementedError 错误原因:子类没有实现父类要求一定要实现的接口
  3. android mysql 记事本_android项目 之 记事本(11) ----- 加入数据库
  4. Microsoft Visual c++简介
  5. eclipse如何部署到tomcat上的
  6. ASP.NET MVC与RAILS3的比较
  7. php curl上传文件返回false,php curl上传文件$_FILES为空的问题
  8. (72)Verilog HDL系统函数和任务:$display
  9. mysql 去重后拼接_mysql学习笔记(三)—— 查询select
  10. 解析文本文件 r 与 rb 模式的区别(Python)
  11. c语言上机作业题及答案,2017计算机二级C语言上机测试题附答案
  12. Pytorch——计算机视觉工具包:torchvision
  13. python input函数用法mac_sublime text3解决input()函数无法使用的问题(Python)
  14. HT1621B显示驱动LCD显示驱动芯片- SSOP48
  15. oracle建立图书管理数据库,Oracle数据库设计 图书管理系统
  16. 计算机网络有那些参考文献,计算机网络参考文献
  17. HCIP RS IERS题之OSPF(二)
  18. JS中使数组倒序排列
  19. java 编写桌面_利用Java技术编写桌面软件基础
  20. 如何自己编写一个交通仿真软件 (开篇) 走火入魔。

热门文章

  1. 网易云音乐App(iOS)分析
  2. 六轴机器人轨迹规划(直线轨迹规划,弧线轨迹规划)——C#实现+ABB为例(规划直接下发离线程序运动)
  3. 一个前端开发工程师的Vim跟IDE一样
  4. 年薪40万程序员辞职炒股,把一年工资亏光了,得了抑郁症,太惨了
  5. C++二叉树计算带权路径长度(WPL)的算法
  6. 图像的线性分类器(感知机、SVM、Softmax)
  7. 一个输入框背景色改不了?去除浏览器自动填充的背景颜色
  8. android关闭蓝牙连接手机号码,Android BLE蓝牙连接要注意的问题
  9. 播放量暴涨2000w+,单日狂揽24w粉,内卷的搞笑赛道还有机会
  10. 快手视频素材在哪找?各大平台视频素材批量下载