本篇文章给大家带来的内容是关于如何通过LayuiAdmin&LayIM&ThinkPHP&Gateway实现小程序多客服接入系统的例子,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
先看下效果图吧。
功能:
1、小程序客服对话实时接收并推送到Layim
2、通过Layim可以实时回复小程序客服对话
3、可以添加多个小程序、可以添加多个客服
4、在线客服顺序分配对话,客服不在线则按照留言处理
5、自动回复功能
实现逻辑:
以微信访客的openid作为唯一标识符,新建一个layim用户并将其作为客服的好友。后端TP作做消息接收和转发的中间层。
实现步骤(重点说gateway部分):
1、安装TP,composer安装workerman、gateway
2、在tp的根目录创建server.PHP(其他名字都行)#!/usr/bin/env PHP
PHP ini_set('display_errors','on'); if(strpos(strtolower(PHP_OS),'win') === 0) { exit("start.PHP not support windows.\n"); } // 检查扩展 if(!extension_loaded('pcntl')) { exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n"); } if(!extension_loaded('posix')) { exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html\n"); } define('APP_PATH',__DIR__ . '/application/');//如果修改了也要跟着修改,tp的application define('BIND_MODULE','chat/Run');//这个位置是你唯一要自定义的 // 加载框架引导文件 require __DIR__ . '/thinkPHP/start.PHP';
3、在tp的application目录下创建一个模块chat,创建Run的控制器,这里除了Events的命名空间,其他基本不需要改动,改动端口有点坑,建议就用gateway默认的
class Run { public function __construct() { //注册register new Register('text://0.0.0.0:1236'); //初始化 bussinessWorker 进程 $worker = new BusinessWorker(); $worker->name = 'WebIMBusinessWorker'; $worker->count = 4; $worker->registerAddress = '127.0.0.1:1236'; //设置处理业务的类,此处制定Events的命名空间 $worker->eventHandler = '\app\chat\controller\Events'; // 初始化 gateway 进程 $gateway = new Gateway("websocket://0.0.0.0:8282"); $gateway->name = 'WebIMGateway'; $gateway->count = 4; $gateway->lanIp = '127.0.0.1'; $gateway->startPort = 2900; $gateway->registerAddress = '127.0.0.1:1236'; $gateway->pingInterval = 55; $gateway->pingNotResponseLimit = 1; $gateway->pingData = '{"emit":"ping"}';//此处为心跳包数据 //运行所有Worker; if(!defined('GLOBAL_START')) { Worker::runAll(); } } }
4、创建Event.PHP的控制器类,Event.PHP是主要的逻辑处理类,这里我只简单说下我的onmessage方法:
public static function onMessage($client_id,$data){ $message = json_decode($data,true); $message_type = $message['emit'];原文链接:https://www.f2er.com/thinkphp/66696.htmlswitch($message_type) { case 'init': // uid //根据token<a href="https://www.jb51.cc/tag/huoqu/" target="_blank" class="keywords">获取</a>uid $tokenCache = new TokenCache(); $user = $tokenCache->where('token','eq',$message['token'])->order('id DESC')->find(); if(!$user->uid||$user->date+$user->lifetime<time()){ self::onClose($client_id); } $wechatMsgUser = new WechatMsgUser(); $msgUser = $wechatMsgUser->where('openid',$user->uid)->where('type',0)->find(); if(!$msgUser->id){ self::onClose($client_id); } //*客服上线,设置<a href="https://www.jb51.cc/tag/shujuku/" target="_blank" class="keywords">数据库</a>状态字段为在线状态 $msgUser->status = 1; $msgUser->save(); $uid = $msgUser->id; // 设置session,这个$_SESSION我是为了下面的onclose<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>里设置客服离线状态 $_SESSION = [ 'id' => $uid,]; // 将当前$client_id与uid绑定 Gateway::bindUid($client_id,$uid); $msgService = new MsgService(); $msgService->checkLeavedMessage($uid); return; break; case 'ping': $pingData=[ 'emit'=>'pong','data'=>$client_id ]; Gateway::sendToClient($client_id,json_encode($pingData)); return; default: echo "unknown message $data" . <a href="https://www.jb51.cc/tag/PHP/" target="_blank" class="keywords">PHP</a>_EOL; } }</pre><p>这里因为我用的是jwt验证,所以多绕了一层,先通过token找到layuiadmin的uid,再通过uid找到客服ID,把客服ID和client_id绑定,这样在后端<a href="https://www.jb51.cc/tag/PHP/" target="_blank" class="keywords">PHP</a>里就可以直接使用gateway::sendToUid来推送消息了。</p><p>5、tp后端,在需要推送消息的地方使用GatewayClient来主动推送消息。</p><p>这是接收消息的整个流程:微信开放接口请求消息推送接口url→<a href="https://www.jb51.cc/tag/PHP/" target="_blank" class="keywords">PHP</a>拿到数据,存库,通过GatewayClient主动推送到指定客服→前端拿到数据通过layim渲染到视图</p><p>其实这个Event.<a href="https://www.jb51.cc/tag/PHP/" target="_blank" class="keywords">PHP</a>我只做了两件事,一个是心跳检测,另一个就是登陆后将客服的ID和client_id绑定。</p><p>发送消息我用的是ajax的http方式发送,没有使用websocket。</p><p>未能实现的<a href="https://www.jb51.cc/tag/gongneng/" target="_blank" class="keywords">功能</a>:</p><p>消息状态的处理,未读/已读</p><p>layim隐身/在线</p><p>目前只有<a href="https://www.jb51.cc/tag/wenzi/" target="_blank" class="keywords">文字</a>消息,没有<a href="https://www.jb51.cc/tag/tupian/" target="_blank" class="keywords">图片</a>和卡片消息</p>