Heim >Backend-Entwicklung >PHP-Tutorial >Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung

Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung

jacklove
jackloveOriginal
2018-06-29 17:33:441450Durchsuche

Die öffentliche WeChat-Entwicklung erfreut sich großer Beliebtheit, und Miniprogramme erfreuen sich sogar noch größerer Beliebtheit. Der Herausgeber stellt Ihnen einen Beispielcode für die Verwendung des WeChat-Fernsteuerungsservers in der PHP-Entwicklung zur Verfügung. Freunde, die ihn benötigen, können sich darauf beziehen

Zusammenfassung

WeChat öffentlich Gute Entwicklung ist sehr beliebt und kleine Programme sind noch beliebter. Also machte ich mit und probierte es aus.

Die allgemeinen Funktionen sind noch vorhanden, aber sie sind unvollständig und ich habe mich an vielen Stellen nicht damit beschäftigt. Aber für die Kommunikation im Klartext ist das kein Problem.

Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung


Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung

Umgebungseinrichtung

Lassen Sie uns kurz über die Prinzipien öffentlicher WeChat-Konten sprechen. Vielleicht ist mein Verständnis nicht gegeben, wenn etwas nicht stimmt, freue ich mich über Kritik und Ratschläge.

Der Client sendet eine Anfrage an die WeChat-Plattform und die WeChat-Plattform leitet die Anfrage an den privaten Server weiter. Nach der Übergabe an das Programm zur Verarbeitung werden die Verarbeitungsergebnisse des privaten Servers abgerufen und dann eingespeist zurück zum Kunden.

Natürlich spielt dabei die „WeChat Public Platform“ eine zentrale Rolle. Es ist gleichbedeutend mit der Bereitstellung einer Bühne, einer Plattform, die es talentierten Menschen und Fremden ermöglicht, ihre eigenen Eigenschaften zu zeigen. Tatsächlich gilt dies nicht nur für WeChat, sondern auch für Alibaba, sodass große E-Commerce-Unternehmen ihr Talent zeigen können.

Konfiguration öffnen

Der erste Schritt besteht darin, ein WeChat-Entwicklerkonto zu beantragen. Für Einzelpersonen reicht es aus, ein Abonnementkonto auszuwählen. Es gibt viele relevante Informationen im Internet und sie sind sehr detailliert, daher werde ich nicht näher darauf eingehen. Kommen wir gleich zur Sache.

Öffnen Sie zunächst nach erfolgreicher Anmeldung beim Entwicklerkonto die serverseitigen Einstellungen, wie unten gezeigt

Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung

Nachdem die Aktivierung abgeschlossen ist, legen Sie sie fest entsprechend der Situation Ihres Servers.

  • URL ist die Adresse, die von Ihrem privaten Server zur Verarbeitung von Anforderungsdaten verwendet wird

  • TOKEN ist ein Token, legen Sie es nach Ihren Wünschen fest. Denken Sie jedoch daran, dass Sie es später in Ihrem eigenen Code verwenden werden.

  • Der Schlüssel hat keinen großen Nutzen, sodass Sie ihn vorerst in Ruhe lassen können.

Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung

Nach Bedarf einstellen

Nach der Einstellung können Sie es aktivieren. Das ist so, als ob alle Kabel in Ihrem Haus renoviert würden und Sie sie nun verwenden möchten und den Schalter drücken. Wie unten gezeigt

Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung

Serverkonfiguration aktivieren

Serverumgebung

Über den Server , die offizielle Website erklärt es auch ausführlich.

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

Wir können auch die offizielle Demo zur Simulation herunterladen.

Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung

Offizielles Beispiel

Der Code ist auch sehr einfach. Im Grunde kann es jeder verstehen, der die grundlegende Syntax von PHP gelernt hat.

<?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;
 }
 }
}
?>

Die Kernidee besteht lediglich darin, die Signatur zu überprüfen, die Anfrage zu bearbeiten und Feedback zu den Ergebnissen zu geben.

Was ich hier sagen muss, ist, dass Tencent diese Vorlagen tatsächlich entfernen und den Black-Box-Modus direkt offenlegen kann. In diesem Fall ist die Sicherheit höher. In vielen Fällen kann der Effekt umso schlimmer sein, je offener die Berechtigungen sind.

Kernklasse

Der nächste Schritt ist meine eigene Verarbeitungslogik, siehe offizielle Dokumentation. WeChat Public verfügt über 6 Empfangsschnittstellen und drei Antwortschnittstellen. Es kann anhand von MsgType bestimmt werden.

Schnittstellendetails

Verifizierung

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;
 }
 }

Der Kern des Die Überprüfungsmethode basiert auf dem TOKEN, das wir auf der vorherigen Webseite festgelegt haben, sodass es im Code verwendet wird.

Antwort

Der Antwortcode muss je nach Art der vom Kunden gesendeten Daten unterschiedlich behandelt werden Daten basierend auf dem Typ, um sie zu kapseln, müssen wir nur den internen MsgType zur Verarbeitung aufrufen.

Erweiterung

Der Erweiterungsteil wurde aus eigener Laune hinzugefügt.

Einen Roboter hinzufügen

Rufen Sie eine Roboterschnittstelle auf, um in Ihrem Namen Antworten zu senden. Diese Fähigkeit ermöglicht Benutzern eine gute Benutzererfahrung und erfreut die Öffentlichkeit ?

Ich habe hier zwei Schnittstellen getestet, eine im Curl-Modus und die andere im file_get_contents-Modus. Beide sind sehr einfach zu verwenden.

<?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;

Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung模式

手机相对于电脑一个很大的优点就是便携,我们虽然不能随时随地携带电脑,但是却能使用手机来代替。很多时候对服务器的管理需要的Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung很简单,但是远程登录的时候也不方便。这个时候就用微信来帮忙传话也是不错的啦。

我平时喜欢使用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=='Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung' || $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 == 'Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung模式'){
  $msgType = 'text';
  $contentStr = "进入Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung模式,开始对服务器进行管理!\n接下来将依据您输入的Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung对服务器进行管理!";
  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的面向对象方法编程简单实现。

  • 接口处理的两种方式

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

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

其实,这些代码跟我一开始的设想还是差别挺大的,原本是想实现一个“遥控器”,晚上想睡觉之前,用微信发一条Relevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung“打开电热毯”,半个小时后,电视看完了,去睡觉的时候发现被窝很暖和,是的,只要加上点硬件,这很容易实现啦再者冰箱了,电视了统统可以完成,那样估计就诊的是“智能家居”了吧。

您可能感兴趣的文章:

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

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

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

Das obige ist der detaillierte Inhalt vonRelevante Erklärung des WeChat-Fernsteuerungsservers für die PHP-Entwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn