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.
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('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. 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('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. 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['emit']; switch($message_type) { case 'init': // uid //根据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); } //*客服上线,设置数据库状态字段为在线状态 $msgUser->status = 1; $msgUser->save(); $uid = $msgUser->id; // 设置session,这个$_SESSION我是为了下面的onclose方法里设置客服离线状态 $_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" . PHP_EOL; } }
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
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!