pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

PHP開發之用微信遠程遙控服務器

微信公眾好的開發很火,小程序更火。小編給大家分享一個PHP開發之用微信遠程遙控服務器的實例代碼,需要的朋友參考下

 摘要

微信公眾好的開發很火,小程序更火。于是也湊個熱鬧,嘗試了一把。

大致的功能還是有的,不過是不全,很多地方我沒有進行處理。不過對于純文本方式的交流,已經沒有問題啦。

命令

音樂

環境搭建

下面大致的講講微信公眾號的原理吧。可能我理解的有些不到位,如果有些許不當,歡迎批評指教。

客戶端發送給微信平臺請求,微信平臺將請求轉發給私服,交給程序處理之后,獲取到私服的處理結果,然后反饋給客戶端。

當然,這其中起到核心作用的自然是“微信公眾平臺”啦。相當于提供了一個舞臺,一個能讓各位能人異士展現出各自的特色的平臺。其實,不僅微信如此,阿里同樣是這樣,如此各大電商才能一展手腳不是。

開啟配置

這第一步,就是先申請一個微信開發者賬號,個人的話選擇訂閱號就足夠了。網上相關的資料很多,也很詳細,我就不多說了。咱們直奔主題好了。

首先登陸開發者賬號成功后,開啟服務器端的設置即可,如下圖

開啟配置

開啟完成,根據自己服務器的情況進行一下設置即可。

  • URL就是你的私服用于處理請求數據的地址
  • TOKEN就是一個令牌,隨便設置。不過記住待會自己的代碼上會用到。
  • 至于密鑰嘛,沒什么較大的作用,暫且可以先不用管。

按需設置

按需設置

設置完,就可以啟用了。這就好比家里的電線全部裝修好了,現在要使用,按下開關一樣。如下圖

啟用服務器配置

啟用服務器配置

服務器環境

關于服務器這塊,官網上講解的也是很詳細的啦。

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

我們還可以下載官方的demo來模擬。

官方樣本

官方樣本

代碼也很簡單。基本上學過了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, 'SimpleXMLElement', 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('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;
 }
 }
}
?>

核心思路,無非檢驗一下簽名,處理一下請求,反饋一下結果罷了。

這里我不得不想說的就是,我覺得騰訊其實可以將那些個模板什么的去掉,直接暴露出黑盒模式,這樣的話安全性會更高一點。很多時候,權限放的越開,效果可能越差。

核心類

接下來就是我自己的處理邏輯了,參照官方文檔。微信公眾好上有6大接收接口,三大回復接口。依據MsgType即可判定。

接口詳情

驗證


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

驗證方法核心就是依據咱們之前網頁上設置的TOKEN來工作的,所以代碼上會用得到。

回復

回復的代碼需要依據客戶端發送的數據的類型來區分對待,類型這塊微信平臺會將數據打包好封裝起來,我們住需要調用內部的MsgType進行處理即可。

拓展

拓展部分,是我自己異想天開往上加的。

添加機器人

調用一個機器人接口,來代替自己發送回復,技能讓用戶得到一個良好的用戶體驗,還能愉悅大眾,何樂而不為?

我這邊測試了兩個接口,一個是curl模式,一個是file_get_contents模式,都挺好用的啦。


<?php
/**
 * 圖靈 機器人接口
 * 
 * 使用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);
 $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;

命令模式

手機相對于電腦一個很大的優點就是便攜,我們雖然不能隨時隨地攜帶電腦,但是卻能使用手機來代替。很多時候對服務器的管理需要的命令很簡單,但是遠程登錄的時候也不方便。這個時候就用微信來幫忙傳話也是不錯的啦。

我平時喜歡使用Python寫一些腳本,什么獲取本地IP,聊天,查看內存,網速啥的,可謂是應有盡有。這下也終于能有用武之地了。利用微信的關鍵字匹配,就可以簡單的讓微信公眾號當一個小小傳話員啦。

這里給個思路,具體實現起來也比較簡單,當做是文本來處理即可。

完整代碼

下面貼出我服務器上的完整代碼,有些私密的地方我做了些更改,屆時按照自己的情況進行修改即可。


<?php
/**
 * wechat php test
 */
// define your token
define ( "TOKEN", "您的TOKEN" );
$wechatObj = new wechatCallbackapiTest ();
// $wechatObj->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=='音樂' || $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 == '命令模式'){
  $msgType = 'text';
  $contentStr = "進入命令模式,開始對服務器進行管理!\n接下來將依據您輸入的命令對服務器進行管理!";
  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 = "<xml>
  <ToUserName><![CDATA[%s]]></ToUserName>
  <FromUserName><![CDATA[%s]]></FromUserName>
  <CreateTime>%s</CreateTime>
  <MsgType><![CDATA[%s]]></MsgType>
  <Content><![CDATA[%s]]></Content>
  <FuncFlag>0</FuncFlag>
 </xml>";
 $resultStr = sprintf ( $textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr );
 echo $resultStr;
}
function imageMessageHandle($fromUsername, $toUsername, $time, $msgType, $contentStr) {
 $imageTpl = "<xml>
  <ToUserName><![CDATA[%s]]></ToUserName>
  <FromUserName><![CDATA[%s]]></FromUserName>
  <CreateTime>%s</CreateTime>
  <MsgType><![CDATA[%s]]></MsgType>
  <Content><![CDATA[%s]]></Content>
  <PicUrl><![CDATA[this is a url]]></PicUrl>
  <MediaId><![CDATA[media_id]]></MediaId>
  <MsgId>1234567890123456</MsgId>
  </xml>";
 $resultStr = sprintf ( $textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr );
 echo $resultStr;
}
function musicMessageHandle($fromUsername, $toUsername, $time, $msgType, $musictitle, $musicDescription, $musicurl, $hqmusicurl) {
 $musicTpl = "<xml>
  <ToUserName><![CDATA[%s]]></ToUserName>
  <FromUserName><![CDATA[%s]]></FromUserName>
  <CreateTime>%s</CreateTime>
  <MsgType><![CDATA[%s]]></MsgType>
  <Music>
  <Title><![CDATA[%s]]></Title>
  <Description><![CDATA[%s]]></Description>
  <MusicUrl><![CDATA[%s]]></MusicUrl>
  <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
  </Music>
 </xml>";
 $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微信開發之微信錄音臨時轉永久存儲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
隨著微信的普及,掃碼登錄方式越來越被現在的應用所使用。它因為不用去記住密碼,只要有微信號即可方便快捷登錄.這里基于微信公眾平臺的帶參數臨時二維碼,并且結合 Swoole 的
這篇文章主要為大家詳細介紹了php獲取微信共享收貨地址的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
主站蜘蛛池模板: 婚博会2024时间表_婚博会门票领取_婚博会地址-婚博会官网 | 万濠投影仪_瑞士TRIMOS高度仪_尼康投影仪V12BDC|量子仪器 | 桁架楼承板-钢筋桁架楼承板-江苏众力达钢筋楼承板厂 | 黄石妇科医院_黄石东方女子医院_黄石东方妇产医院怎么样 | 超声波清洗机_大型超声波清洗机_工业超声波清洗设备-洁盟清洗设备 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 深圳展厅设计_企业展馆设计_展厅设计公司_数字展厅设计_深圳百艺堂 | 高低温老化试验机-步入式/低温恒温恒湿试验机-百科 | 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 客服外包专业服务商_客服外包中心_网萌科技 | 南昌旅行社_南昌国际旅行社_南昌国旅在线 | 瑞典Blueair空气净化器租赁服务中心-专注新装修办公室除醛去异味服务! | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 塑钢课桌椅、学生课桌椅、课桌椅厂家-学仕教育设备首页 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 立式壁挂广告机厂家-红外电容触摸一体机价格-华邦瀛 | _网名词典_网名大全_qq网名_情侣网名_个性网名| 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 校园气象站_超声波气象站_农业气象站_雨量监测站_风途科技 | 硫化罐-胶管硫化罐-山东鑫泰鑫智能装备有限公司 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 精密五金加工厂-CNC数控车床加工_冲压件|蜗杆|螺杆加工「新锦泰」 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 精密线材测试仪-电线电缆检测仪-苏州欣硕电子科技有限公司 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 铜镍-康铜-锰铜-电阻合金-NC003 - 杭州兴宇合金有限公司 | 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 大米加工设备|大米加工机械|碾米成套设备|大米加工成套设备-河南成立粮油机械有限公司 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 桐城新闻网—桐城市融媒体中心主办 |