Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat

PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat

小云云
小云云Original
2018-01-27 09:28:081226Durchsuche

Die WeChat-Entwicklung erfreut sich in letzter Zeit großer Beliebtheit. In diesem Artikel werden hauptsächlich Beispiele für die PH-Implementierung von Fernsteuerungsserverfunktionen mit WeChat vorgestellt. Die allgemeinen Funktionen sind jedoch noch nicht vollständig. Aber für die Kommunikation im Klartext ist das kein Problem.

PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat

PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat

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 Können unter Beweis stellen 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 online und sie sind sehr detailliert, daher werde ich nicht näher darauf eingehen. Kommen wir gleich zur Sache.

Nachdem Sie sich erfolgreich beim Entwicklerkonto angemeldet haben, können Sie die serverseitigen Einstellungen öffnen, wie unten gezeigt

PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat

Nachdem die Aktivierung abgeschlossen ist, können Sie dies tun Stellen Sie es entsprechend der Situation Ihres Servers ein.

  • URL ist die Adresse, die Ihr privater Server zur Verarbeitung von Anforderungsdaten verwendet

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

PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat

Nach Bedarf einstellen

Nach der Einstellung können Sie es aktivieren. Das ist so, als hätten Sie alle Kabel in Ihrem Zuhause dekoriert und möchten sie nun verwenden und den Schalter drücken. Wie unten gezeigt

PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat

Serverkonfiguration aktivieren

Serverumgebung

Was den Server betrifft, wird dies auf der offiziellen Website ausführlich erläutert.

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

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

PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat

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

Die Kernidee besteht lediglich darin, die Signatur zu prü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 ( '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;
 }
 }

Der Kern der Verifizierungsmethode basiert auf dem TOKEN, das wir auf der vorherigen Webseite festgelegt haben, sodass es in verwendet wird Code.

Antwort

Der Antwortcode muss je nach Art der vom Client gesendeten Daten unterschiedlich behandelt werden. Wir müssen den internen MsgType aufrufen . Verarbeiten Sie es einfach.

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还是得你自己去申请的啦",
 '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;

Befehlsmodus

Einer der großen Vorteile von Mobiltelefonen gegenüber Computern ist ihre Portabilität. Obwohl wir Computer nicht immer und überall mitnehmen können, können wir stattdessen Mobiltelefone verwenden. Oftmals sind die zur Verwaltung des Servers erforderlichen Befehle sehr einfach, die Remote-Anmeldung ist jedoch umständlich. Es ist in dieser Zeit auch eine gute Idee, WeChat zu nutzen, um die Nachricht zu verbreiten.

Normalerweise verwende ich Python gerne zum Schreiben einiger Skripte, z. B. zum Abrufen lokaler IP-Adressen, zum Chatten, zum Überprüfen des Speichers, der Netzwerkgeschwindigkeit usw. Man kann sagen, dass es alles hat. Diesmal kommt es endlich ins Spiel. Durch die Verwendung des Keyword-Matchings von WeChat können Sie das öffentliche WeChat-Konto einfach als kleinen Messenger fungieren lassen.

Hier ist eine Idee. Die spezifische Implementierung ist relativ einfach. Behandeln Sie sie einfach als Text.

Vollständiger Code

Der vollständige Code auf meinem Server ist unten aufgeführt. Ich habe einige Änderungen an einigen privaten Teilen vorgenommen.

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=='PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit 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 == 'PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat模式'){
  $msgType = 'text';
  $contentStr = "进入PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat模式,开始对服务器进行管理!\n接下来将依据您输入的PHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit 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'];
}
?>

Zusammenfassung

Lassen Sie uns abschließend überprüfen, welche Wissenspunkte in diesem Experiment verwendet wurden.

  • Objektorientierte Programmierung in PHP ist einfach zu implementieren.

  • Zwei Arten der Schnittstellenverarbeitung

  • Zugriff auf, Verarbeitung und Feedback auf dem privaten Back-End-Server des öffentlichen WeChat-Kontos.

  • Interaktion zwischen Front-End und Backend und Anwendung von Chatbot.

Eigentlich sind diese Codes ganz anders, als ich mir das ursprünglich vorgestellt hatte. Ich wollte vor dem Schlafengehen eine „Fernbedienung“ zum Versenden nutzen einen Befehl „Heizdecke öffnen“. Nach einer halben Stunde war ich mit dem Fernsehen fertig. Als ich zu Bett ging, stellte ich fest, dass das Bett sehr warm war. Ja, solange etwas Hardware hinzugefügt wird, ist dies leicht zu erreichen. Darüber hinaus kann es mit einem Kühlschrank und einem Fernseher ausgestattet werden. In diesem Fall müssen Sie voraussichtlich einen Arzt aufsuchen. Das nennt man „Smart Home“.

Verwandte Empfehlungen:

PHP-Implementierung der temporären Konvertierung von WeChat-Aufzeichnungen in dauerhafte Speicherung, Beispielfreigabe

Eine Zusammenfassung der Probleme, die in der aufgetreten sind Entwicklung von WeChat-Miniprogrammen

JS-Sharing-Beispiele auf WeChat, Weibo, QQ und Huo App

Das obige ist der detaillierte Inhalt vonPHP-Implementierungsbeispiel für die Fernsteuerungsserverfunktion mit WeChat. 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