首頁 >微信小程式 >小程式開發 >如何透過LayuiAdmin&LayIM&Thinkphp&Gateway實作小程式多客服存取系統的例子

如何透過LayuiAdmin&LayIM&Thinkphp&Gateway實作小程式多客服存取系統的例子

不言
不言原創
2018-08-25 09:25:105577瀏覽

這篇文章帶給大家的內容是關於如何透過LayuiAdmin&LayIM&Thinkphp&Gateway實現小程式多客服存取系統的例子,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

先看下效果圖吧。

如何透過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(&#39;display_errors&#39;, &#39;on&#39;);
if(strpos(strtolower(PHP_OS), &#39;win&#39;) === 0)
{
    exit("start.php not support windows.\n");
}
// 检查扩展
if(!extension_loaded(&#39;pcntl&#39;))
{
    exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
}
if(!extension_loaded(&#39;posix&#39;))
{
    exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
}
define(&#39;APP_PATH&#39;, __DIR__ . &#39;/application/&#39;);//如果修改了也要跟着修改,tp的application
define(&#39;BIND_MODULE&#39;,&#39;chat/Run&#39;);//这个位置是你唯一要自定义的
// 加载框架引导文件
require __DIR__ . &#39;/thinkphp/start.php&#39;;

3、在tp的application目錄下創建一個模組chat,創建Run的控制器,這裡除了Events的命名空間,其他基本上不需要改動,改動埠有點坑,建議就用gateway預設的

class Run
{
    public function __construct()
    {
        //注册register
        new Register(&#39;text://0.0.0.0:1236&#39;);
        //初始化 bussinessWorker 进程
        $worker = new BusinessWorker();
        $worker->name = &#39;WebIMBusinessWorker&#39;;
        $worker->count = 4;
        $worker->registerAddress = &#39;127.0.0.1:1236&#39;;
        //设置处理业务的类,此处制定Events的命名空间
        $worker->eventHandler = &#39;\app\chat\controller\Events&#39;;
        // 初始化 gateway 进程
        $gateway = new Gateway("websocket://0.0.0.0:8282");
        $gateway->name = &#39;WebIMGateway&#39;;
        $gateway->count = 4;
        $gateway->lanIp = &#39;127.0.0.1&#39;;
        $gateway->startPort = 2900;
        $gateway->registerAddress = &#39;127.0.0.1:1236&#39;;
        $gateway->pingInterval = 55;
        $gateway->pingNotResponseLimit = 1;
        $gateway->pingData = &#39;{"emit":"ping"}&#39;;//此处为心跳包数据
        //运行所有Worker;
        if(!defined(&#39;GLOBAL_START&#39;))
        {
            Worker::runAll();
        }
    }
}

4、創建Event.php的控制器類,Event.php是主要的邏輯處理類,這裡我只簡單說下我的onmessage方法:   

public static function onMessage($client_id, $data){
        $message = json_decode($data, true);
        $message_type = $message[&#39;emit&#39;];
        
        switch($message_type) {
            case &#39;init&#39;:
                // uid
                //根据token获取uid
                $tokenCache =   new TokenCache();
                $user   =   $tokenCache->where(&#39;token&#39;,&#39;eq&#39;,$message[&#39;token&#39;])->order(&#39;id DESC&#39;)->find();
                if(!$user->uid||$user->date+$user->lifetime<time()){
                    self::onClose($client_id);
                }
                $wechatMsgUser  =   new WechatMsgUser();
                $msgUser    =    $wechatMsgUser->where(&#39;openid&#39;,&#39;eq&#39;,$user->uid)->where(&#39;type&#39;,&#39;eq&#39;,0)->find();
                if(!$msgUser->id){
                    self::onClose($client_id);
                }
                //*客服上线,设置数据库状态字段为在线状态
                $msgUser->status    =   1;
                $msgUser->save();
                $uid    =   $msgUser->id;
                // 设置session,这个$_SESSION我是为了下面的onclose方法里设置客服离线状态
                $_SESSION = [
                    &#39;id&#39;       => $uid,
                ];
                // 将当前$client_id与uid绑定
                Gateway::bindUid($client_id, $uid);
                $msgService = new MsgService();
                $msgService->checkLeavedMessage($uid);
                return;
                break;
            case &#39;ping&#39;:
                $pingData=[
                    &#39;emit&#39;=>&#39;pong&#39;,
                    &#39;data&#39;=>$client_id
                ];
                Gateway::sendToClient($client_id, json_encode($pingData));
                return;
            default:
                echo "unknown message $data" . PHP_EOL;
        }
    }

這裡因為我用的是jwt驗證,所以多繞了一層,先透過token找到layuiadmin的uid,再透過uid找到客服ID,把客服ID和client_id綁定,這樣在後端php裡就可以直接使用gateway::sendToUid來推播訊息了。

5、tp後端,在需要推播訊息的地方使用GatewayClient來主動推播訊息。

這是接收訊息的整個流程:微信開放介面請求訊息推送介面url→php拿到數據,存庫,透過GatewayClient主動推送到指定客服→前端拿到資料透過layim渲染到視圖

其實這個Event.php我只做了兩件事,一個是心跳偵測,另一個就是登陸後將客服的ID和client_id綁定。

發送訊息我用的是ajax的http方式發送,沒有使用websocket。

未能實現的功能:

訊息狀態的處理,未讀取/已讀取

layim隱身/線上

目前只有文字訊息,沒有圖片與卡片訊息

相關推薦:

微信小程式機器人自動客服功能

微信公眾平台開發:多客服介面說明

以上是如何透過LayuiAdmin&LayIM&Thinkphp&Gateway實作小程式多客服存取系統的例子的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn