基于laravel+workerman+easywechat的公众号客服系统
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的公众号客服系统相关推荐
- 微信公众号客服系统怎么生成能追踪效果的二维码?
想要做好微信公众号的运营,专业的技能少不了,但是也要具有善于使用工具的能力,正所谓"工欲善其事必先利其器",一款好的客服系统,不但可以方便我们进行客户接待,还能帮助我们生分析公众号 ...
- 微信公众号客服系统怎么实现消息提醒,快速回复粉丝留言?
很多做微信公众号运营的小编,都会有这样的工作经验吧,一上班就开始刷新微信公众号后台,看看有没有粉丝留言,然后这一天就开始了时不时打开后台页面看一下,即使这样还是免不了粉丝留言晚回或者漏回的情况发生,追 ...
- php公众号客服系统,公众号在线客服系统哪个好,主流客服系统评测及推荐
微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字.图片.语音.视频的全方位沟通.互动 .形成了一种主流的线上线下微信互动 ...
- 微信营销为什么会用到微信公众号客服系统?
最近看到在网上很多人问运营微信公众号有必要用客服软件吗,公众号客服软件到底好不好?针对这个问题,我简单的说下. 首先,我自己本身就是做运营的,不用第三方软件,会遇到粉丝消息回复不及时.聊天记录只能保存 ...
- 在微信公众号里的web商城嵌入客服_微信公众号客服功能如何在手机上使用?
微信公众号官方提供了免费的多客服功能,但是由于官方的客服功能只有PC版,并且没有实时的客服消息通知,这就导致下班后无法提供客服服务,给客户不好的体验. 另外,还有些小企业,由于没有专职的客服人员,没办 ...
- 微信公众号客服系统消息能即时提醒吗?
微信公众号的客服系统,当有用户在后台留言的时候,网页版客服系统只能通过提示声音来判断,不会弹出消息提醒.所以只能采用戴耳机安音响这种方式了嘛?当然不是,你需要的是一款可以消息即时提醒的微信公众号客服系 ...
- 公众号客服消息经常忘记看?简单设置,立即提醒查看!
当客服工作繁忙,打开了多个网页,不在客服后台,能收到消息提示,声音提示吗? 当客服离开岗位,浏览器最小化,不打开网页的情况下,能知道哪个公众号哪个用户发了什么内容吗? 今天就给大家分享这个方法! 第一 ...
- h5 修改title 微信_微信公众号客服消息不限次数推送如何设置?
在公众平台发送客服消息,只能通过消息管理功能实现,仅支持一个个粉丝单独发送文本信息,如果想要实现更多功能效果,可以使用微号帮平台的48小时信息推送功能实现,或者通过公众号平台的接口编程开发实现功能,都 ...
- Java实现微信公众号客服功能和本地联调
Java实现微信公众号客服功能 微信公众平台设置 生产环境 公众号 设置 [开发]–> [基本配置]–> [服务器配置] 注: a.服务器地址(URL) 是开发者用来接收微信消息和事件的接 ...
最新文章
- No cached version of com.android.tools.build:gradle:2.0.0 available for offline mode.
- [问题解决]NotImplementedError 错误原因:子类没有实现父类要求一定要实现的接口
- android mysql 记事本_android项目 之 记事本(11) ----- 加入数据库
- Microsoft Visual c++简介
- eclipse如何部署到tomcat上的
- ASP.NET MVC与RAILS3的比较
- php curl上传文件返回false,php curl上传文件$_FILES为空的问题
- (72)Verilog HDL系统函数和任务:$display
- mysql 去重后拼接_mysql学习笔记(三)—— 查询select
- 解析文本文件 r 与 rb 模式的区别(Python)
- c语言上机作业题及答案,2017计算机二级C语言上机测试题附答案
- Pytorch——计算机视觉工具包:torchvision
- python input函数用法mac_sublime text3解决input()函数无法使用的问题(Python)
- HT1621B显示驱动LCD显示驱动芯片- SSOP48
- oracle建立图书管理数据库,Oracle数据库设计 图书管理系统
- 计算机网络有那些参考文献,计算机网络参考文献
- HCIP RS IERS题之OSPF(二)
- JS中使数组倒序排列
- java 编写桌面_利用Java技术编写桌面软件基础
- 如何自己编写一个交通仿真软件 (开篇) 走火入魔。
热门文章
- 网易云音乐App(iOS)分析
- 六轴机器人轨迹规划(直线轨迹规划,弧线轨迹规划)——C#实现+ABB为例(规划直接下发离线程序运动)
- 一个前端开发工程师的Vim跟IDE一样
- 年薪40万程序员辞职炒股,把一年工资亏光了,得了抑郁症,太惨了
- C++二叉树计算带权路径长度(WPL)的算法
- 图像的线性分类器(感知机、SVM、Softmax)
- 一个输入框背景色改不了?去除浏览器自动填充的背景颜色
- android关闭蓝牙连接手机号码,Android BLE蓝牙连接要注意的问题
- 播放量暴涨2000w+,单日狂揽24w粉,内卷的搞笑赛道还有机会
- 快手视频素材在哪找?各大平台视频素材批量下载