Maison  >  Article  >  développement back-end  >  Exemple d'implémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat

Exemple d'implémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat

小云云
小云云original
2018-01-27 09:28:081213parcourir

Le développement de WeChat a été très populaire ces derniers temps.Cet article partage principalement avec vous des exemples d'implémentation PH des fonctions de serveur de contrôle à distance utilisant WeChat. Les fonctions générales sont toujours là, mais elles ne sont pas complètes. Mais pour la communication en texte brut, il n’y a aucun problème.

Exemple dimplémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat

Exemple dimplémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat

Configuration de l'environnement

Parlons brièvement des principes des comptes publics WeChat. Peut-être que ma compréhension n’est pas au point. S’il y a quelque chose qui ne va pas, j’accepte les critiques et les conseils.

Le client envoie une requête à la plateforme WeChat, et la plateforme WeChat transmet la requête au serveur privé. Après avoir été transmis au programme pour traitement, les résultats du traitement du serveur privé sont obtenus puis alimentés. retour au client.

Bien entendu, la « plateforme publique WeChat » joue un rôle central à cet égard. Cela équivaut à fournir une scène, une plate-forme qui permet aux personnes talentueuses et aux étrangers de montrer leurs propres caractéristiques. En fait, cela n’est pas seulement vrai pour WeChat, mais aussi pour Alibaba, afin que les grandes entreprises de commerce électronique puissent montrer leurs capacités.

Ouvrir la configuration

La première étape consiste à demander un compte développeur WeChat. Pour les particuliers, il suffit de choisir un compte d'abonnement. Il existe de nombreuses informations pertinentes sur Internet et elles sont très détaillées, je n’entrerai donc pas dans les détails. Allons droit au but.

Tout d'abord, après vous être connecté avec succès au compte développeur, ouvrez les paramètres côté serveur, comme indiqué ci-dessous

Exemple dimplémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat

Une fois l'activation terminée, définissez-le selon la situation de votre serveur.

  • L'URL est l'adresse utilisée par votre serveur privé pour traiter les données de la demande

  • TOKEN est un jeton, définissez-le comme vous le souhaitez. Mais rappelez-vous que vous l’utiliserez plus tard dans votre propre code.

  • Quant à la clé, elle n'a pas d'utilité majeure, vous pouvez donc la laisser tranquille pour l'instant.

Exemple dimplémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat

Définir selon vos besoins

Après le réglage, vous pouvez l'activer. C'est comme si tous les fils de votre maison étaient rénovés et que vous vouliez maintenant les utiliser et appuyer sur l'interrupteur. Comme indiqué ci-dessous

Exemple dimplémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat

Activer la configuration du serveur

Environnement du serveur

Concernant le serveur, le site officiel l'explique en détail.

https://mp.weixin.qq.com/wiki

Nous pouvons également télécharger la démo officielle pour simuler.

Exemple dimplémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat

Échantillon officiel

Le code est également très simple. Fondamentalement, toute personne ayant appris la syntaxe de base de PHP peut la comprendre.

<?php /**
 * wechat php test
 */
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
class wechatCallbackapiTest
{
 public function valid()
 {
 $echoStr = $_GET["echostr"];
 //valid signature , option
 if($this->checkSignature()){
 echo $echoStr;
 exit;
 }
 }
 public function responseMsg()
 {
 //get post data, May be due to the different environments
 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
 //extract post data
 if (!empty($postStr)){
 /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
  the best way is to check the validity of xml by yourself */
 libxml_disable_entity_loader(true);
 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
 $fromUsername = $postObj->FromUserName;
 $toUsername = $postObj->ToUserName;
 $keyword = trim($postObj->Content);
 $time = time();
 $textTpl = "<xml>
  <tousername></tousername>
  <fromusername></fromusername>
  <createtime>%s</createtime>
  <msgtype></msgtype>
  <content></content>
  <funcflag>0</funcflag>
  </xml>"; 
 if(!empty( $keyword ))
 {
  $msgType = "text";
  $contentStr = "Welcome to wechat world!";
  $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  echo $resultStr;
 }else{
  echo "Input something...";
 }
 }else {
 echo "";
 exit;
 }
 }
 private function checkSignature()
 {
 // you must define TOKEN by yourself
 if (!defined("TOKEN")) {
 throw new Exception('TOKEN is not defined!');
 }
 $signature = $_GET["signature"];
 $timestamp = $_GET["timestamp"];
 $nonce = $_GET["nonce"];
 $token = TOKEN;
 $tmpArr = array($token, $timestamp, $nonce);
 // use SORT_STRING rule
 sort($tmpArr, SORT_STRING);
 $tmpStr = implode( $tmpArr );
 $tmpStr = sha1( $tmpStr );
 if( $tmpStr == $signature ){
 return true;
 }else{
 return false;
 }
 }
}
?>

L'idée de base n'est rien d'autre que de vérifier la signature, de traiter la demande et de donner un retour sur les résultats.

Ce que je dois dire ici, c'est que je pense que Tencent peut réellement supprimer ces modèles et exposer directement le mode boîte noire. Dans ce cas, la sécurité sera plus élevée. Dans de nombreux cas, plus les autorisations sont ouvertes, plus l’effet peut être grave.

Core Class

La prochaine étape est ma propre logique de traitement, veuillez vous référer à la documentation officielle. WeChat Public dispose de 6 interfaces de réception et de trois interfaces de réponse. Il peut être déterminé en fonction de MsgType.

Détails de l'interface

Vérification

private function checkSignature() {
 // you must define TOKEN by yourself
 if (! defined ( "TOKEN" )) {
 throw new Exception ( 'TOKEN is not defined!' );
 }
 $signature = $_GET ["signature"];
 $timestamp = $_GET ["timestamp"];
 $nonce = $_GET ["nonce"];
 $token = TOKEN;
 $tmpArr = array (
 $token,
 $timestamp,
 $nonce 
 );
 // use SORT_STRING rule
 sort ( $tmpArr, SORT_STRING );
 $tmpStr = implode ( $tmpArr );
 $tmpStr = sha1 ( $tmpStr );
 if ($tmpStr == $signature) {
 return true;
 } else {
 return false;
 }
 }

Le cœur de la méthode de vérification fonctionne sur la base du TOKEN que nous avons défini sur la page Web précédente, il sera donc utilisé dans le code.

Réponse

Le code de réponse doit être traité différemment selon le type de données envoyées par le client. La plateforme WeChat regroupera les données et les encapsulera. Nous devons appeler le MsgType interne. . Traitez-le simplement.

Extension

La partie extension a été ajoutée par moi en fonction de mes caprices.

Ajouter un robot

Appeler une interface robot pour envoyer des réponses en votre nom Cette compétence permet aux utilisateurs d'avoir une bonne expérience utilisateur et de plaire au public. Pourquoi pas ?

J'ai testé deux interfaces ici, l'une est le mode curl et l'autre le mode file_get_contents, les deux sont très simples à utiliser.

<?php /**
 * 图灵 机器人接口
 * 
 * 使用curl来进行浏览器模拟并抓取数据
 */
function turing($requestStr) {
 // 图灵机器人接口
 $url = "http://www.tuling123.com/openapi/api";
 // 用于POST请求的数据
 $data = array(
 &#39;key&#39;=>"哈哈,这个key还是得你自己去申请的啦",
 'info'=>$requestStr,
 );
 // 构造curl下载器
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 $responseStr = curl_exec($ch);
 curl_close($ch);
 return $responseStr;
}
/**
 * 调用另外的接口
 * @param unknown $req
 * @return mixed
 */
function test($req){
 $url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg=".$req;
 $result = file_get_contents($url);
 $result = json_decode($result, true);
 return $result['content'];
}
$req = 'hello';
$res = test($req);
echo $res;

Mode Commande

L'un des grands avantages des téléphones mobiles par rapport aux ordinateurs est leur portabilité. Bien que nous ne puissions pas transporter d'ordinateurs à tout moment et n'importe où, nous pouvons utiliser des téléphones mobiles à la place. Souvent, les commandes nécessaires à la gestion du serveur sont très simples, mais il n'est pas pratique de se connecter à distance. C’est également une bonne idée d’utiliser WeChat pour faire passer le message en ce moment.

J'aime généralement utiliser Python pour écrire certains scripts, comme obtenir une adresse IP locale, discuter, vérifier la mémoire, la vitesse du réseau, etc. On peut dire qu'il a tout. Cette fois, cela entre enfin en jeu. En utilisant la correspondance de mots clés de WeChat, vous pouvez simplement laisser le compte public WeChat agir comme un petit messager.

Voici une idée. La mise en œuvre spécifique est relativement simple, il suffit de la traiter comme du texte.

Code complet

Le code complet sur mon serveur est publié ci-dessous. J'ai apporté quelques modifications dans certaines parties privées. Vous pouvez le modifier en fonction de votre propre situation.

valid();
// 调用回复信息方法
$wechatObj->responseMsg ();
// 微信消息处理核心类
class wechatCallbackapiTest {
 public function valid() {
 $echoStr = $_GET ["echostr"];
 // valid signature , option
 if ($this->checkSignature ()) {
 echo $echoStr;
 exit ();
 } else {
 echo "验证失败!";
 }
 }
 public function responseMsg() {
 // get post data, May be due to the different environments
 // 类似$_POST但是可以接受XML数据,属于增强型
 $postStr = $GLOBALS ["HTTP_RAW_POST_DATA"];
 // extract post data
 if (! empty ( $postStr )) {
 /*
 * libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
 * the best way is to check the validity of xml by yourself
 */
 // 不解析外部数据,防止xxml漏洞
 libxml_disable_entity_loader ( true );
 $postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
 $fromUsername = $postObj->FromUserName;
 $toUsername = $postObj->ToUserName;
 $keyword = trim ( $postObj->Content );
 $time = time ();
 /*
 * 微信客户端发送信息的时候会附带一些参数,详见官方文档。所以要根据不同的类型,来分别做相关的处理。
 * 于是MsgType 就充当这样的一个区分的标记
 */
 $msgType = $postObj->MsgType;
 /*
 * 当有用户关注后者退订的时候,会触发相应的事件。所以再来个event事件的监听更为友好。
 * $event = $postObj->Event.
 * 具体的参数信息,官网上很详细。
 */
 $event = $postObj->Event;
 switch ($msgType) {
 // 文本消息 处理部分
 case "text" :
  if (! empty ( $keyword )) {
  // 在此处进行对关键字的匹配就可以实现:针对不同关键字组装的相应数据
  if($keyword=='Exemple dimplémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat' || $keyword == "music") {
  $msgType = 'music';
  $musictitle = "The Mountain";
  $musicdescription = "夏日舒心清凉歌曲";
  $musicurl = "http://101.200.58.242/wx/themaintain.mp3";
  $hqmusicurl = "http://101.200.58.242/wx/themaintain.mp3";
  musicMessageHandle($fromUsername, $toUsername, $time, $msgType, $musictitle, $musicdescription, $musicurl, $hqmusicurl);
  }elseif($keyword == '1'){
  $msgType = 'text';
  $contentStr = "人生得意须尽欢,莫使金樽空对月!";
  textMessageHandle($fromUsername, $toUsername, $time, $msgType, $contentStr);
  }elseif($keyword == 'Exemple dimplémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat模式'){
  $msgType = 'text';
  $contentStr = "进入Exemple dimplémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat模式,开始对服务器进行管理!\n接下来将依据您输入的Exemple dimplémentation PHP de la fonction de serveur de contrôle à distance utilisant WeChat对服务器进行管理!";
  textMessageHandle($fromUsername, $toUsername, $time, $msgType, $contentStr);
  }else {
  // 直接调用 机器人接口,与用户进行交流
  $msgType = "text";
  $contentStr = turing($keyword)!=""?turing($keyword):"这里是微信 纯文本测试数据!";
  textMessageHandle ( $fromUsername, $toUsername, $time, $msgType, $contentStr );
  }
  } else {
  echo "您得输入点数据,我才能回复不是!";
  }
  break;
 // 接收图片信息
 case "image" :
  if (! empty ( $keyword )) {
//  $msgType = "image";
  $contentStr = "您发送的图片看起来还真不错!";
  textMessageHandle ( $fromUsername, $toUsername, $time, $msgType, $contentStr );
  } else {
  echo "服务器没能收到您发送的图片!";
  }
  break;
 // 接收语音信息
 case "voice" :
  if (! empty ( $keyword )) {
//  $msgType = "voice";
  $contentStr = "您发送的语音听起来还真不错!";
  textMessageHandle ( $fromUsername, $toUsername, $time, $msgType, $contentStr );
  } else {
  echo "服务器没能收到您发送的语音!";
  }
  break;
 // 接收视频信息
 case "video" :
  if (! empty ( $keyword )) {
//  $msgType = "video";
  $contentStr = "您发送的视频看起来还真不错!";
  textMessageHandle ( $fromUsername, $toUsername, $time, $msgType, $contentStr );
  } else {
  echo "服务器没能收到您发送的视频!";
  }
  break;
 // 接收视频信息
 case "shortvideo" :
  if (! empty ( $keyword )) {
//  $msgType = "shortvideo";
  $contentStr = "您发送的小视频看起来还真不错!";
  textMessageHandle ( $fromUsername, $toUsername, $time, $msgType, $contentStr );
  } else {
  echo "服务器没能收到您发送的小视频!";
  }
  break;
 // 接收位置信息
 case "location" :
  if (! empty ( $keyword )) {
//  $msgType = "location";
  $contentStr = "您发送的位置已被接收!";
  textMessageHandle ( $fromUsername, $toUsername, $time, $msgType, $contentStr );
  } else {
  echo "服务器没能收到您发送的位置!";
  }
  break;
 // 接收视频信息
 case "link" :
  if (! empty ( $keyword )) {
//  $msgType = "link";
  $contentStr = "您发送的链接看起来还真不错!";
  textMessageHandle ( $fromUsername, $toUsername, $time, $msgType, $contentStr );
  } else {
  echo "服务器没能收到您发送的链接!";
  }
  break;
 // 对事件进行侦听
 case "event":
  switch ($event) {
  case "subscribe":
  // 发送一些消息!
  $msgType = 'text';
  $contentStr = "终于等到你!";
  textMessageHandle($fromUsername, $toUsername, $time, $msgType, $contentStr);
  break;
  }
  break;
 default :
  break;
 }
 } else {
 echo "";
 exit ();
 }
 }
 private function checkSignature() {
 // you must define TOKEN by yourself
 if (! defined ( "TOKEN" )) {
 throw new Exception ( 'TOKEN is not defined!' );
 }
 $signature = $_GET ["signature"];
 $timestamp = $_GET ["timestamp"];
 $nonce = $_GET ["nonce"];
 $token = TOKEN;
 $tmpArr = array (
 $token,
 $timestamp,
 $nonce 
 );
 // use SORT_STRING rule
 sort ( $tmpArr, SORT_STRING );
 $tmpStr = implode ( $tmpArr );
 $tmpStr = sha1 ( $tmpStr );
 if ($tmpStr == $signature) {
 return true;
 } else {
 return false;
 }
 }
}
/**
 * 定义为心中想难关的六个接口的数据发送格式模板
 */
function textMessageHandle($fromUsername, $toUsername, $time, $msgType, $contentStr) {
 $textTpl = "
  
  
  %s
  
  
  0
 ";
 $resultStr = sprintf ( $textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr );
 echo $resultStr;
}
function imageMessageHandle($fromUsername, $toUsername, $time, $msgType, $contentStr) {
 $imageTpl = "
  
  
  %s
  
  
  
  
  1234567890123456
  ";
 $resultStr = sprintf ( $textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr );
 echo $resultStr;
}
function musicMessageHandle($fromUsername, $toUsername, $time, $msgType, $musictitle, $musicDescription, $musicurl, $hqmusicurl) {
 $musicTpl = "
  
  
  %s
  
  
  
  
  
  
  
 ";
 $resultStr = sprintf($musicTpl, $fromUsername, $toUsername, $time, $msgType, $musictitle, $musicDescription, $musicurl, $hqmusicurl);
 echo $resultStr;
}
/**
 * 图灵 机器人接口
 * 
 * 使用curl来进行浏览器模拟并抓取数据
 */
function turing($requestStr) {
 /* // 图灵机器人接口
 $url = "http://www.tuling123.com/openapi/api";
 // 用于POST请求的数据
 $data = array(
 "key"=>"您在图灵机器人官网上申请的key",
 "info"=>$requestStr
 );
 // 构造curl下载器
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 $requestStr = curl_exec($ch);
 curl_close($ch);
 return responseStr; */
 $url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg=".$requestStr;
 $result = file_get_contents($url);
 $result = json_decode($result, true);
 return $result['content'];
}
?>

Résumé

Enfin, passons en revue quels points de connaissances ont été utilisés dans cette expérience.

  • La programmation orientée objet en PHP est simple à mettre en œuvre.

  • Deux modes de traitement de l'interface

  • Accès, traitement et commentaires sur le serveur privé backend du compte public WeChat.

  • Interaction entre front-end et back-end, et application du chatbot.

En fait, ces codes sont assez différents de ce que j'imaginais au départ, je voulais mettre en place une "télécommande" Avant de me coucher le soir, j'utiliserais WeChat pour envoyer. une commande "Ouvrir "Couverture chauffante". Au bout d'une demi-heure, j'ai fini de regarder la télévision. Quand je me suis couché, j'ai trouvé que le lit était très chaud. Oui, à condition d'ajouter du matériel, c'est facile à réaliser. De plus, elle peut être complétée par un réfrigérateur et une télévision. Dans ce cas, on estime que vous aurez besoin de consulter un médecin. C'est ce qu'on appelle la « maison intelligente ».

Recommandations associées :

Implémentation PHP de l'enregistrement WeChat, conversion temporaire en partage d'exemple de stockage permanent

Un résumé des problèmes rencontrés dans le développement de mini-programmes WeChat

JS partage des exemples sur WeChat, Weibo, QQ et Huo App

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!

Déclaration:
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