走进微信公众号实现关注之后推送一条服务器自定义的消息给用户

版权声明:廖圣平博客,未经博主允许不得转载。企鹅:1194008361 https://blog.csdn.net/qq_22823581/article/details/77508008


下面是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 给微信的服务器, 通过微信的服务器再传递给用户。


没有更多推荐了,返回首页