当前位置:主页 > PHP开发 > PHP基础 >

PHP开发之用微信远程遥控服务器

栏目:PHP基础 来源: 微信小程序开发网 阅读: 2018-02-28

微信公众好的开发很火,小程序更火。于是也凑个热闹,尝试了一把。

大致的功能还是有的,不过是不全,很多地方我没有进行处理。不过对于纯文本方式的交流,已经没有问题啦。

环境搭建

下面大致的讲讲微信公众号的原理吧。可能我理解的有些不到位,如果有些许不当,欢迎批评指教。

客户端发送给微信平台请求,微信平台将请求转发给私服,交给程序处理之后,获取到私服的处理结果,然后反馈给客户端。

当然,这其中起到核心作用的自然是“微信公众平台”啦。相当于提供了一个舞台,一个能让各位能人异士展现出各自的特色的平台。其实,不仅微信如此,阿里同样是这样,如此各大电商才能一展手脚不是。

开启配置

这第一步,就是先申请一个微信开发者账号,个人的话选择订阅号就足够了。网上相关的资料很多,也很详细,我就不多说了。咱们直奔主题好了。

首先登陆开发者账号成功后,开启服务器端的设置即可,如下图

开启完成,根据自己服务器的情况进行一下设置即可。

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即可判定。

接口详情

验证