PHP开发微信公众号(二)消息接受与推送

  • Post author:
  • Post category:php


上一篇文章我们知道怎么获取二维码,这样别人就可以扫描二维码来关注我们,但是别人关注后,发送消息,我们怎么进行相关处理?

这里我们就来学习下怎么处理处理这些消息,以及推送消息。

学习之前首先你需要有一个域名和空间

url:填写你希望微信公众平台把用户的消息转发到哪里

token:随便输入,用于微信公众平台和你的站点进行第一次通信建立关联用

/*
    用于第一次验证我们网站url合法性
     */
    public function firstValid(){
        //检验签名的合法性
        if($this->_checkSignature()){
            //签名合法,告知微信公众平台服务器
            echo $_GET['echostr'];
        }
    }
/**
     * 验证签名
     * @return bool 
     */
    private function _checkSignature(){
        //获得由微信公众平台请求的验证数据
        $signature = $_GET['signature'];
        $timestamp = $_GET['timestamp'];
        $nonce = $_GET['nonce'];
        //将时间戳,随机字符串,token按照字母顺序排序,病并连接
        $tmp_arr = array($this->_token,$timestamp,$nonce);
        sort($tmp_arr,SORT_STRING);//字典顺序
        $tmp_str = implode($tmp_arr);//连接
        $tmp_str = sha1($tmp_str);//sha1加密
        if($signature==$tmp_str){
            return true;
        }else{
            return false;
        }
    

在你的站点写一个脚本,调用一下firstValid 就可以完成微信公众平台和你站点的关联。$this->_token,就是你上面写token。

然后再提交,就能成功了。


1、关注后,欢迎语的设置

有人关注后,微信公众平台会给我们发一个xml格式的数据,如下:

然后我们对这个信息进行获取,转化成我们想要的格式,进行相关判断,返回数据,同样也需要组装成xml格式

public function responseMsg(){
        /*
        获得请求时POST:XML字符串
        不能用$_POST获取,因为没有key
         */
        $xml_str = $GLOBALS['HTTP_RAW_POST_DATA'];
        if(empty($xml_str)){
            die('');
        }
        if(!empty($xml_str)){
            // 解析该xml字符串,利用simpleXML
            libxml_disable_entity_loader(true);
            //禁止xml实体解析,防止xml注入
              $request_xml = simplexml_load_string($xml_str, 'SimpleXMLElement', LIBXML_NOCDATA);
            //判断该消息的类型,通过元素MsgType
            switch ($request_xml->MsgType){
                case 'event':
                    //判断具体的时间类型(关注、取消、点击)
                    $event = $request_xml->Event;
                      if ($event=='subscribe') { // 关注事件
                          $this->_doSubscribe($request_xml);
                      }elseif ($event=='CLICK') {
   //菜单点击事件
                          $this->_doClick($request_xml);
                      }elseif ($event=='VIEW') {
   //连接跳转事件
                          $this->_doView(