Maison > Applet WeChat > Développement de mini-programmes > Exemple de mise en œuvre de plusieurs systèmes d'accès au service client pour les mini-programmes via LayuiAdmin&LayIM&Thinkphp&Gateway

Exemple de mise en œuvre de plusieurs systèmes d'accès au service client pour les mini-programmes via LayuiAdmin&LayIM&Thinkphp&Gateway

不言
Libérer: 2018-08-25 09:25:10
original
5580 Les gens l'ont consulté

Ce que cet article vous apporte est un exemple de la façon de mettre en œuvre plusieurs systèmes d'accès au service client pour les mini-programmes via LayuiAdmin&LayIM&Thinkphp&Gateway. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Jetons d'abord un coup d'oeil aux rendus.

Exemple de mise en œuvre de plusieurs systèmes daccès au service client pour les mini-programmes via LayuiAdmin&LayIM&Thinkphp&Gateway Fonctions mises en œuvre :

1. Les conversations du service client du mini-programme sont reçues en temps réel et transmises à Layim
2. Les conversations du service client du mini-programme peuvent recevoir une réponse en temps réel. temps via Layim
3. Vous pouvez ajouter plusieurs mini-programmes et plusieurs services client
4. Le service client en ligne attribue les conversations dans l'ordre si le service client n'est pas en ligne, les messages seront traités
5. Automatique. fonction de réponse

Logique de mise en œuvre :

Utilisez l'openid du visiteur WeChat comme identifiant unique pour créer un nouvel utilisateur profane et en faire un ami du service client. Le TP backend sert de couche intermédiaire pour la réception et le transfert des messages.

Étapes de mise en œuvre (accent sur la partie passerelle) :

1. Installer TP, composer installe workerman, gateway

2 Créer server.php (autres) à la racine. répertoire de tp N'importe quel nom fonctionnera) #!/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;;
Copier après la connexion

3. Créez un module de discussion dans le répertoire d'application de tp et créez un contrôleur d'exécution en plus de. l'espace de noms Events, d'autres modifications de base ne sont pas nécessaires. Changer le port est un peu délicat. Il est recommandé d'utiliser la passerelle par défaut

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();
        }
    }
}
Copier après la connexion

4. Créez la classe de contrôleur d'Event.php. php est la principale classe de traitement logique. Ici, je parle brièvement de ma méthode 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;
        }
    }
Copier après la connexion

Parce que j'utilise la vérification jwt, j'ai d'abord trouvé l'uid de layuiadmin. via le jeton, puis avez trouvé le service client via l'ID uid, liez l'ID du service client et client_id, afin que vous puissiez utiliser directement gateway::sendToUid pour envoyer des messages dans le php back-end.

5. tp backend, utilisez GatewayClient pour envoyer activement des messages là où les messages doivent être envoyés.

Il s'agit de l'ensemble du processus de réception des messages : l'interface ouverte de WeChat demande l'URL de l'interface push du message → PHP récupère les données, les stocke et les transmet activement au service client désigné via GatewayClient → Le frontal obtient le données et les restitue à la vue via layim

En fait, je n'ai fait que deux choses dans cet Event.php, l'une est la détection du rythme cardiaque et l'autre est de lier l'ID du service client et le client_id après la connexion.

J'utilise la méthode http ajax pour envoyer des messages et je n'utilise pas websocket.

Fonction non implémentée :

Traitement de l'état des messages, non lu/lu

layim invisible/en ligne

Actuellement, uniquement les messages texte, pas de messages d'images et de cartes

Recommandations associées :

Fonction de service client automatique du mini-robot du programme WeChat

Développement de la plateforme publique WeChat : plus de description de l'interface du service client

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal