Maison  >  Article  >  développement back-end  >  Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP

Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP

jacklove
jackloveoriginal
2018-06-29 17:33:441398parcourir

Le développement du bien public WeChat est très populaire, et les mini-programmes sont encore plus populaires. L'éditeur partagera avec vous un exemple de code pour utiliser le serveur de contrôle à distance WeChat dans le développement PHP. Les amis qui en ont besoin peuvent s'y référer

Résumé

<.>WeChat public Le bon développement est très populaire, et les petits programmes sont encore plus populaires. Alors j’ai participé à la fête et j’ai essayé.

Les fonctions générales sont toujours là, mais elles sont incomplètes et je n'ai pas traité de nombreux endroits. Mais pour la communication en texte brut, il n’y a aucun problème.

Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP


Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP

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.

Configuration ouverte

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 en ligne et elles sont très détaillées, je n’entrerai donc pas dans les détails. Allons droit au but.

Après vous être connecté avec succès au compte développeur, vous pouvez ouvrir les paramètres côté serveur, comme indiqué ci-dessous

Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP

Une fois l'activation terminée, vous pouvez réglez-le en fonction de la situation de votre serveur Can.

  • 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.

Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP

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

Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP

Activer la configuration du serveur

Environnement du serveur

À propos du serveur , le site officiel l'explique également en détail.

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

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

Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP

É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, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA);
 $fromUsername = $postObj->FromUserName;
 $toUsername = $postObj->ToUserName;
 $keyword = trim($postObj->Content);
 $time = time();
 $textTpl = "<xml>
  <ToUserName><![CDATA[%s]]></ToUserName>
  <FromUserName><![CDATA[%s]]></FromUserName>
  <CreateTime>%s</CreateTime>
  <MsgType><![CDATA[%s]]></MsgType>
  <Content><![CDATA[%s]]></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(&#39;TOKEN is not defined!&#39;);
 }
 $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 principale est simplement 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.

Classe de base

La prochaine étape est ma propre logique de traitement, reportez-vous à 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 ( &#39;TOKEN is not defined!&#39; );
 }
 $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;
 }
 }

Méthode de vérification Le noyau 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 conditionnera le. données basées sur le type Pour les encapsuler, il suffit d'appeler le MsgType interne pour le traitement.

Extension

La partie extension a été ajoutée selon mon propre caprice.

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 faire plaisir au public. ?

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还是得你自己去申请的啦",
 &#39;info&#39;=>$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[&#39;content&#39;];
}
$req = &#39;hello&#39;;
$res = test($req);
echo $res;

Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP模式

手机相对于电脑一个很大的优点就是便携,我们虽然不能随时随地携带电脑,但是却能使用手机来代替。很多时候对服务器的管理需要的Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP很简单,但是远程登录的时候也不方便。这个时候就用微信来帮忙传话也是不错的啦。

我平时喜欢使用Python写一些脚本,什么获取本地IP,聊天,查看内存,网速啥的,可谓是应有尽有。这下也终于能有用武之地了。利用微信的关键字匹配,就可以简单的让微信公众号当一个小小传话员啦。

这里给个思路,具体实现起来也比较简单,当做是文本来处理即可。

完整代码

下面贴出我服务器上的完整代码,有些私密的地方我做了些更改,届时按照自己的情况进行修改即可。

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=='Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP' || $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 == 'Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP模式'){
  $msgType = 'text';
  $contentStr = "进入Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP模式,开始对服务器进行管理!\n接下来将依据您输入的Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP对服务器进行管理!";
  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 ( &#39;TOKEN is not defined!&#39; );
 }
 $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
  
  
  <![CDATA[%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'];
}
?>

总结

最后来回顾一下,本次试验用到了哪些知识点。

  • PHP的面向对象方法编程简单实现。

  • 接口处理的两种方式

  • 微信公众号后台私服的接入,处理,反馈。

  • 前后端的交互,以及聊天机器人的应用。

其实,这些代码跟我一开始的设想还是差别挺大的,原本是想实现一个“遥控器”,晚上想睡觉之前,用微信发一条Explication pertinente du serveur de contrôle à distance WeChat pour le développement PHP“打开电热毯”,半个小时后,电视看完了,去睡觉的时候发现被窝很暖和,是的,只要加上点硬件,这很容易实现啦再者冰箱了,电视了统统可以完成,那样估计就诊的是“智能家居”了吧。

您可能感兴趣的文章:

CI框架(CodeIgniter)操作redis的方法的详解

php使用imagecopymerge()函数创建半透明水印的详解

一个中高级PHP工程师所应该具备的能力

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