您好,登錄后才能下訂單哦!
這篇文章主要介紹了怎么通過LayuiAdmin&LayIM&Thinkphp&Gateway實(shí)現(xiàn)小程序多客服接入系統(tǒng),具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
先看下效果圖吧。
實(shí)現(xiàn)的功能:
1、小程序客服對話實(shí)時(shí)接收并推送到Layim
2、通過Layim可以實(shí)時(shí)回復(fù)小程序客服對話
3、可以添加多個(gè)小程序、可以添加多個(gè)客服
4、在線客服順序分配對話,客服不在線則按照留言處理
5、自動(dòng)回復(fù)功能
實(shí)現(xiàn)邏輯:
以微信訪客的openid作為唯一標(biāo)識符,新建一個(gè)layim用戶并將其作為客服的好友。后端TP作做消息接收和轉(zhuǎn)發(fā)的中間層。
實(shí)現(xiàn)步驟(重點(diǎn)說gateway部分):
1、安裝TP,composer安裝workerman、gateway
2、在tp的根目錄創(chuàng)建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"); } // 檢查擴(kuò)展 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');//這個(gè)位置是你唯一要自定義的 // 加載框架引導(dǎo)文件 require __DIR__ . '/thinkphp/start.php';
3、在tp的application目錄下創(chuàng)建一個(gè)模塊chat,創(chuàng)建Run的控制器,這里除了Events的命名空間,其他基本不需要改動(dòng),改動(dòng)端口有點(diǎn)坑,建議就用gateway默認(rèn)的
class Run { public function __construct() { //注冊register new Register('text://0.0.0.0:1236'); //初始化 bussinessWorker 進(jìn)程 $worker = new BusinessWorker(); $worker->name = 'WebIMBusinessWorker'; $worker->count = 4; $worker->registerAddress = '127.0.0.1:1236'; //設(shè)置處理業(yè)務(wù)的類,此處制定Events的命名空間 $worker->eventHandler = '\app\chat\controller\Events'; // 初始化 gateway 進(jìn)程 $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"}';//此處為心跳包數(shù)據(jù) //運(yùn)行所有Worker; if(!defined('GLOBAL_START')) { Worker::runAll(); } } }
4、創(chuàng)建Event.php的控制器類,Event.php是主要的邏輯處理類,這里我只簡單說下我的onmessage方法:
public static function onMessage($client_id, $data){ $message = json_decode($data, true); $message_type = $message['emit']; switch($message_type) { case 'init': // uid //根據(jù)token獲取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','eq',$user->uid)->where('type','eq',0)->find(); if(!$msgUser->id){ self::onClose($client_id); } //*客服上線,設(shè)置數(shù)據(jù)庫狀態(tài)字段為在線狀態(tài) $msgUser->status = 1; $msgUser->save(); $uid = $msgUser->id; // 設(shè)置session,這個(gè)$_SESSION我是為了下面的onclose方法里設(shè)置客服離線狀態(tài) $_SESSION = [ 'id' => $uid, ]; // 將當(dāng)前$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" . PHP_EOL; } }
這里因?yàn)槲矣玫氖莏wt驗(yàn)證,所以多繞了一層,先通過token找到layuiadmin的uid,再通過uid找到客服ID,把客服ID和client_id綁定,這樣在后端php里就可以直接使用gateway::sendToUid來推送消息了。
5、tp后端,在需要推送消息的地方使用GatewayClient來主動(dòng)推送消息。
這是接收消息的整個(gè)流程:微信開放接口請求消息推送接口url→php拿到數(shù)據(jù),存庫,通過GatewayClient主動(dòng)推送到指定客服→前端拿到數(shù)據(jù)通過layim渲染到視圖
其實(shí)這個(gè)Event.php我只做了兩件事,一個(gè)是心跳檢測,另一個(gè)就是登陸后將客服的ID和client_id綁定。
發(fā)送消息我用的是ajax的http方式發(fā)送,沒有使用websocket。
未能實(shí)現(xiàn)的功能:
消息狀態(tài)的處理,未讀/已讀
layim隱身/在線
目前只有文字消息,沒有圖片和卡片消息
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享怎么通過LayuiAdmin&LayIM&Thinkphp&Gateway實(shí)現(xiàn)小程序多客服接入系統(tǒng)內(nèi)容對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。