下面是tp3.2实现的代码:
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index(){
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$token = "weixin";
$signature = $_GET['signature'];
$array = array($timestamp,$nonce,$token);
sort($array);
//2.将排序后的三个参数拼接后用sha1加密
$tmpstr = implode('',$array);
$tmpstr = sha1($tmpstr);
//3. 将加密后的字符串�� signature 进行对比, 判断该请求是否来自微��
if($tmpstr == $signature && $_GET['echostr'])
{
ob_clean();
echo $_GET['echostr'];
exit;
}else{
$this->reponseMsg();
}
}
public function reponseMsg(){
//1.获取到微信推送过来post数据(xml格式)
$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
//2.处理消息类型,并设置回复类型和内容
/*<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>*/
$postObj = simplexml_load_string( $postArr );
//$postObj->ToUserName = '';
//$postObj->FromUserName = '';
//$postObj->CreateTime = '';
//$postObj->MsgType = '';
//$postObj->Event = '';
// gh_e79a177814ed
//判断该数据包是否是订阅的事件推送
if( strtolower( $postObj->MsgType) == 'event'){
//如果是关注 subscribe 事件
if( strtolower($postObj->Event == 'subscribe') ){
//回复用户消息(纯文本格式)
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$time = time();
$msgType = 'text';
$content = '欢迎关注我们的微信公众账号'.'公众账号:::::'.$postObj->FromUserName.'用户id:::::'.$postObj->ToUserName;
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
echo $info;
/*<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>*/
}
}
}
}
1、token是必须的,如果对服务器信息不熟的可以看往期的文章
2、进行了token验证之后系统跳转到reponseMsg(),这个方法中
3、因为微信是通过xml数据传输的,所以我们要把信息转化为对象之后才能对其操作,一般我们php 是用$_POST接收传递过来的数据的, 但是xml 不能通过这个方法实现, 用的是
$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
这个方法得到微信传递过来的值,传过来的是一个xml 的格式, 所以世界上最好的语言php 能把直接转化为对象, 为我们所用。
$postObj = simplexml_load_string( $postArr );
这样就能把xml 的格式转化为对象, 直接可以调用数据,比如 $postObj->FromUserName 就直接调用到了是哪一个用户触发的这个事件。
if( strtolower( $postObj->MsgType) == 'event'){
php中的strtolower()的函数是转化为小写的功能。
如果这个消息是事件(event) ,然后再判断, 这个具体是什么事件, 事件包括很多事件:比如 关注事件, 取消关注事件, 还有消息推送事件,等等。
if( strtolower($postObj->Event == 'subscribe') ){
如果是关注(subscribe)事件,那么就按照这个程序走下去, 一般我们可以做:判断该用户以前有没有关注过我们, 如果没有关注我们我们可以把数据存储到数据库, 如果更细心一点的可以为该用户生成一个二维码之类的扩展运用。
**因为微信是通过xml 的方式去传递消息过来的, 所以我们也应该传递消息过去也是通过xml 的格式传递过去。传递过去我们当然是要知道传递给谁吧,所以我们通过
postObj->得到你想要的。
这边新学习一个新东西, 以前在开发路由器OpenWrt 的时候有接触:模板
先定义一个模板:
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
通过php 的函数分别把刚刚得到postObj的值代进去。
$info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
最后再echo $info 给微信的服务器, 通过微信的服务器再传递给用户。