ホームページ >バックエンド開発 >PHPチュートリアル >PHP開発用WeChatリモートコントロールサーバー関連説明

PHP開発用WeChatリモートコントロールサーバー関連説明

jacklove
jackloveオリジナル
2018-06-29 17:33:441447ブラウズ

WeChat の公共財開発は非常に人気があり、小規模なプログラムはさらに人気があります。エディターは、PHP 開発用の WeChat リモート コントロール サーバーのサンプル コードを共有します。必要な友人はそれを参照してください。

概要

WeChat public 優れた開発は非常に人気があり、小規模なプログラムはさらに人気があります。そこで私もその楽しみに参加して試してみました。

一般的な機能はまだありますが、不完全で、多くの場所に手を付けていません。ただし、プレーンテキストでの通信には問題ありません。

PHP開発用WeChatリモートコントロールサーバー関連説明


PHP開発用WeChatリモートコントロールサーバー関連説明

#環境設定 WeChat 公開アカウントの原則について簡単に説明しましょう。私の理解が不十分な点があるかもしれませんが、批判やアドバイスを歓迎します。

クライアントは WeChat プラットフォームにリクエストを送信し、WeChat プラットフォームはリクエストをプライベート サーバーに転送して処理します。プライベート サーバーの処理結果が取得されて供給されます。クライアントに戻ります。


もちろん、これには「WeChatパブリックプラットフォーム」が中心的な役割を果たします。それは才能ある人や見知らぬ人がそれぞれの持ち味を発揮できる舞台、プラットフォームを提供することに相当します。実はこれはWeChatだけでなくアリババにも当てはまり、大手電子商取引企業が腕を振るうことができる。

オープン構成最初のステップは、WeChat 開発者アカウントを申請することです。個人の場合は、サブスクリプション アカウントを選択するだけで十分です。インターネット上には関連情報がたくさんあり、非常に詳細なので、詳細は説明しません。早速本題に入りましょう。

開発者アカウントに正常にログインした後、以下に示すようにサーバー側の設定を開くことができます。

PHP開発用WeChatリモートコントロールサーバー関連説明アクティブ化が完了すると、次のことが可能になります。ご自身のサーバーの状況に合わせて設定してください。

    URL はプライベート サーバーがリクエスト データを処理するために使用するアドレスです。
  • TOKEN はトークンです。任意に設定します。ただし、後で独自のコードで使用することを忘れないでください。
  • キーに関しては、大きな用途はないので、今のところは放っておいても問題ありません。

#オンデマンド設定PHP開発用WeChatリモートコントロールサーバー関連説明

設定後、有効にすることができます。これは、家のすべての配線を改修して、それを使用してスイッチを押したいと思うようなものです。以下に示すように

サーバー構成を有効にするPHP開発用WeChatリモートコントロールサーバー関連説明

サーバー環境

サーバーについて, 公式サイトでも詳しく解説されています。

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

公式デモをダウンロードしてシミュレーションすることもできます。

公式サンプルPHP開発用WeChatリモートコントロールサーバー関連説明

コードも非常にシンプルです。基本的に、PHP の基本的な構文を学んだ人なら誰でも理解できます。

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

中心となるアイデアは、署名を確認し、リクエストを処理し、結果をフィードバックすることに他なりません。

ここで言わなければならないのは、Tencent は実際にこれらのテンプレートを削除してブラック ボックス モードを直接公開できると考えているということです。この場合、セキュリティはより高くなるでしょう。多くの場合、アクセス許可がオープンであればあるほど、影響は悪化する可能性があります。

コアクラス

次のステップは私自身の処理ロジックです。公式ドキュメントを参照してください。 WeChat Public には 6 つの受信インターフェイスと 3 つの返信インターフェイスがあります。これは、MsgType に基づいて決定できます。

インターフェイスの詳細

検証

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

検証方法は、前の Web ページで設定した TOKEN に基づいて動作するため、コード内で使用されます。

返信

返信コードは、クライアントによって送信されるデータの種類に応じて異なる方法で処理する必要があります。データをタイプに基づいてカプセル化するには、処理のために内部 MsgType を呼び出すだけです。

拡張

拡張部分は私の気まぐれに基づいて追加されました。

ロボットを追加する

ロボット インターフェイスを呼び出して、ユーザーに代わって返信を送信することで、ユーザーは優れたユーザー エクスペリエンスを得ることができ、ユーザーを喜ばせることができます。 ?

ここでは 2 つのインターフェイスをテストしました。1 つは Curl モード、もう 1 つは file_get_contents モードです。どちらも非常に使いやすいです。

うわー

PHP開発用WeChatリモートコントロールサーバー関連説明模式

手机相对于电脑一个很大的优点就是便携,我们虽然不能随时随地携带电脑,但是却能使用手机来代替。很多时候对服务器的管理需要的PHP開発用WeChatリモートコントロールサーバー関連説明很简单,但是远程登录的时候也不方便。这个时候就用微信来帮忙传话也是不错的啦。

我平时喜欢使用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=='PHP開発用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開発用WeChatリモートコントロールサーバー関連説明模式'){
  $msgType = 'text';
  $contentStr = "进入PHP開発用WeChatリモートコントロールサーバー関連説明模式,开始对服务器进行管理!\n接下来将依据您输入的PHP開発用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 ( &#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的面向对象方法编程简单实现。

  • 接口处理的两种方式

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

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

其实,这些代码跟我一开始的设想还是差别挺大的,原本是想实现一个“遥控器”,晚上想睡觉之前,用微信发一条PHP開発用WeChatリモートコントロールサーバー関連説明“打开电热毯”,半个小时后,电视看完了,去睡觉的时候发现被窝很暖和,是的,只要加上点硬件,这很容易实现啦再者冰箱了,电视了统统可以完成,那样估计就诊的是“智能家居”了吧。

您可能感兴趣的文章:

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

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

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

以上がPHP開発用WeChatリモートコントロールサーバー関連説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。