Marquis 发表于 2014-9-24 21:32:29

微信公众平台实现控制功能的一些思路

微信公众平台大家应该不陌生,它与硬件的一些结合也有一些案例。
例如:与路由器配合使用。

平台:pc,微信公众平台
pc端程序:c#桌面小程序
虽然还没有涉及到开发板,我只是提供一种可以操控pc(也可以说是一种硬件吧)的一些思路。
流程:第一次使用-》登陆pc端程序,用户向相关微信发送控制命令(获取到id),将id、定时、功能填好并启动软件
,用户再次发送指令即可控制pc。
再次使用时已经保存好了id,无需再次输入。

微信返回页面:


登陆界面:


启动界面:


微信开发模式下的文件:
weixin.php
query.php
pic.php

数据库:
control_weixin、字段:`content`,`type`,`uid` , `mid` , `time`
图片存储地址:
pic

关机指令-》微信(判断,将关机、用户id、消息id、发送时间写进数据库)-》pc端程序一直post数据(id)到query.php获取在最近时间数据库中与id匹配的控制信息(关机),并返回消息id、指令给pc端程序,程序通过判断执行定时关机(发送重启和取消关机类似)
<?php
$db = new SaeMysql();

$str = "SELECT `mid`, `content`, `time` FROM `control_weixin` WHERE `uid` = '%s' ORDER BY `time` DESC LIMIT 1";
$sql = sprintf($str, $_GET['uid']);
$data = $db->getData($sql);

if ($data) {
      if ((time() - $data["time"]) <= 100 ) {
                echo sprintf('%s,%s', $data["mid"], $data["content"]);
      } else {
                echo '0,expired';//务必保留,否则无数据返回则会报错!因为客户端没有做多余判断
      }
} else {
      echo '0,null';//务必保留,否则无数据返回则会报错!因为客户端没有做多余判断
}
?>

屏幕截图指令-》微信(判断,将屏幕截图、用户id、消息id、发送时间写进数据库,返回图片地址(几秒后可以查看))-》pc端程序一直post数据(id)到query.php获取在最近时间数据库中与id匹配的控制信息(屏幕截图),并返回消息id、指令给pc端程序,判断,生成一张截图,将截图发给存储文件pic.php,将图片存储起来,图片链接就是微信返回的图片地址。
<?php

$target_path = SAE_TMP_PATH;
$basename=basename( $_FILES['uploadedfile']['name']);
$domain='pic';
$uuid=md5(uniqid(rand(), true));
$target_path = $target_path.$uuid;
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
} else{
    echo "There was an error uploading the file, please try again!";
}
$file_contents= file_get_contents($target_path);
$s = new SaeStorage();
//$filename=$uuid.'/'.$basename;
$filename=$_GET["MsgId"].".jpg";
$s->write($domain, $filename ,$file_contents);
$url=$s->getUrl($domain, $filename );
?>

以上思路根据某贴子加上自己的改进而来。
pc端程序下载地址:http://zhbitwiki-wx.stor.sinaapp.com/WxControl1.0.rar




qiaoge 发表于 2014-9-24 22:59:26

可以的

zixi0007 发表于 2014-9-25 09:37:41

现在联通把我家的80端口封了,不能做服务端.请问楼主是怎么弄的?

Marquis 发表于 2014-9-25 10:51:34

zixi0007 发表于 2014-9-25 09:37 static/image/common/back.gif
现在联通把我家的80端口封了,不能做服务端.请问楼主是怎么弄的?

在sae上部署代码

jerryli 发表于 2014-9-25 12:05:50

其实也有办法绕过,我写了一个php的程序,可以绕过80端口与微信对接。
用CT做微信的服务端挺不错,可控性高。

zixi0007 发表于 2014-9-25 12:33:38

jerryli 发表于 2014-9-25 12:05 static/image/common/back.gif
其实也有办法绕过,我写了一个php的程序,可以绕过80端口与微信对接。
用CT做微信的服务端挺不错,可控性高 ...

请问怎么搞的通过sae中转吗

zixi0007 发表于 2014-9-25 12:35:50

Marquis 发表于 2014-9-25 10:51 static/image/common/back.gif
在sae上部署代码

sae和pc端如何通讯呢?

jerryli 发表于 2014-9-28 09:18:20

zixi0007 发表于 2014-9-25 12:33 static/image/common/back.gif
请问怎么搞的通过sae中转吗

恩,差不多,做了一个反向代理,找个有80口的服务器放个转发程序,转发到你家里的Web口上,不要用80口因为是被封掉的,改用其他的口子如8888或则随便。
微信 <---> 公网服务器 <-->家里的CT服务器
代码如下:<?php
/**
* 反向代理处理类
* <li>将得到的get请求转发到另一个网站,并取回返回信息送到页面上</li>
* @version 1.0.0.3
* @author JerryLi lijian@dzs.mobi
* */
class CReverseProxy{
        private $_sOutBuf = null;
        /**
       * 构造
       * @param string $sServiceAddr 后端服务的地址
       */
        function __construct($sServiceAddr){
                $sQueryString = $_SERVER['QUERY_STRING']; //取出get信息
                $sPostData = file_get_contents("php://input"); //读取post数据

                if (empty($sQueryString))
                        $sUrl = $sServiceAddr; //没有get参数
                else
                        $sUrl = $sServiceAddr .'?'. $sQueryString; //存在get参数
                //提交内容
                $ch = curl_init();
                curl_setopt ($ch, CURLOPT_URL, $sUrl); //设置GET的URL地址
                curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);//将结果保存成字符串
                curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 3);//连接超时时间
                curl_setopt ($ch, CURLOPT_TIMEOUT, 2);//执行超时时间
                curl_setopt ($ch, CURLOPT_DNS_CACHE_TIMEOUT, 300);//DNS解析缓存保存时间5分钟
//                curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); //php版本5.3及以上,可关闭IPV6,只使用IPV4
                if (!empty($sPostData)){
                        curl_setopt ($ch, CURLOPT_POST, true);//POST输出
                        curl_setopt ($ch, CURLOPT_POSTFIELDS, $sPostData);//POST数据内容
                }
                $this->_sOutBuf = curl_exec($ch); //取出返回
                curl_close($ch);
                unset($ch);
        }
        /**
       * 析构函数(输出数据到屏幕)
       */
        function __destruct(){
                header('Content-Type: text/html; charset=UTF-8');
                echo $this->_sOutBuf;
        }
}

$o = new CReverseProxy('http://你的CT服务器地址:8888/微信处理程序.php');
unset($o);
?>

管叫我小狄 发表于 2014-9-28 11:45:51

这个给力,想下 如何控制A20吧,我也去学点PHP基础
页: [1]
查看完整版本: 微信公众平台实现控制功能的一些思路