php实现微信公众号主动推送消息

5年以前  |  阅读数:669 次  |  编程语言:PHP 

通过学习借鉴朋友的实现方法进行整理,实现了PHP版的微信公共平台消息主动推送,分享给大家供大家参考,具体内容如下
此方法是通过模拟登录微信公共平台的方法来实现的。
代码如下:
一、登录接口部分代码


      //登录
      private function login(){
        $url = 'https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN';
        $this->send_data = array(
          'username' => $this->_account,
          'pwd' => md5($this->_password),
          'f' => 'json'
        );
        $this->referer = "https://mp.weixin.qq.com/";
        $this->getHeader = 1;
        $result = explode("\n",$this->curlPost($url));
        foreach ($result as $key => $value) {
          $value = trim($value);
          if(preg_match('/"ErrCode": (.*)/i', $value,$match)){//获取token
            switch ($match[1]) {
              case -1:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"系统错误")));
              case -2:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"帐号或密码错误")));
              case -3:
                die(urldecode(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>urlencode("密码错误")))));
              case -4:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"不存在该帐户")));
              case -5:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"访问受限")));
              case -6:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"需要输入验证码")));
              case -7:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"此帐号已绑定私人微信号,不可用于公众平台登录")));
              case -8:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"邮箱已存在")));
              case -32:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"验证码输入错误")));
              case -200:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"因频繁提交虚假资料,该帐号被拒绝登录")));
              case -94:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"请使用邮箱登陆")));
              case 10:
                die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"该公众会议号已经过期,无法再登录使用")));
              case 0:
                $this->userFakeid = $this->getUserFakeid();
                break;
            }
          }
          if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $value,$match)){//获取cookie
            $this->cookie .=$match[1].'='.$match[2].'; ';
          }
          if(preg_match('/"ErrMsg"/i', $value,$match)){//获取token
            $this->token = rtrim(substr($value,strrpos($value,'=')+1),'",');
          }
        }
      }

二、信息发送部分代码


      //单发消息
      private function send($fakeid,$content){
        $url = 'https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response〈=zh_CN';
        $this->send_data = array(
            'type' => 1,
            'content' => $content,
            'error' => 'false',
            'tofakeid' => $fakeid,
            'token' => $this->token,
            'ajax' => 1,
          );
        $this->referer = 'https://mp.weixin.qq.com/cgi-bin/singlemsgpage?token='.$this->token.'&fromfakeid;='.$fakeid.'&msgid;=&source;=&count;=20&t;=wxm-singlechat〈=zh_CN';
        return $this->curlPost($url);
      }

三、群发信息代码


      //群发消息
      public function sendMessage($content='',$userId='') {
        if(is_array($userId) && !empty($userId)){
          foreach($userId as $v){
            $json = json_decode($this->send($v,$content));
            if($json->ret!=0){
              $errUser[] = $v;
            }
          }
        }else{
          foreach($this->userFakeid as $v){
            $json = json_decode($this->send($v['fakeid'],$content));
            if($json->ret!=0){
              $errUser[] = $v['fakeid'];
            }
          }
        }

        //共发送用户数
        $count = count($this->userFakeid);
        //发送失败用户数
        $errCount = count($errUser);
        //发送成功用户数
        $succeCount = $count-$errCount;

        $data = array(
          'status'=>0,
          'count'=>$count,
          'succeCount'=>$succeCount,
          'errCount'=>$errCount,
          'errUser'=>$errUser 
        );

        return json_encode($data);
      }

四、获取所有用户信息代码片段


      //获取所有用户信息
      public function getAllUserInfo(){
        foreach($this->userFakeid as $v){
          $info[] = $this->getUserInfo($v['groupid'],$v['fakeid']);
        }

        return $info;
      }



      //获取用户信息
      public function getUserInfo($groupId,$fakeId){
        $url = "https://mp.weixin.qq.com/cgi-bin/getcontactinfo?t=ajax-getcontactinfo〈=zh_CN&fakeid;={$fakeId}";
        $this->getHeader = 0;
        $this->referer = 'https://mp.weixin.qq.com/cgi-bin/contactmanagepage?token='.$this->token.'&t;=wxm-friend〈=zh_CN&pagesize;='.$this->pageSize.'&pageidx;=0&type;=0&groupid;='.$groupId;
        $this->send_data = array(
          'token'=>$this->token,
          'ajax'=>1
        );
        $message_opt = $this->curlPost($url);
        return $message_opt;
      }

      //获取所有用户fakeid
      private function getUserFakeid(){
        ini_set('max_execution_time',600);
        $pageSize = 1000000;
        $this->referer = "https://mp.weixin.qq.com/cgi-bin/home?t=home/index〈=zh_CN&token;={$_SESSION['token']}";
        $url = "https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&pagesize;={$pageSize}&pageidx;=0&type;=0&groupid;=0&token;={$this->token}〈=zh_CN";
        $user = $this->vget($url);
        $preg = "/\"id\":(\d+),\"name\"/";
        preg_match_all($preg,$user,$b);
        $i = 0;
        foreach($b[1] as $v){
          $url = 'https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&pagesize;='.$pageSize.'&pageidx;=0&type;=0&groupid;='.$v.'&token;='.$this->token.'〈=zh_CN';
          $user = $this->vget($url);
          $preg = "/\"id\":(\d+),\"nick_name\"/";
          preg_match_all($preg,$user,$a);
          foreach($a[1] as $vv){
            $arr[$i]['fakeid'] = $vv;
            $arr[$i]['groupid'] = $v;
            $i++;
          }
        }
        return $arr;
      }

希望本文所述对大家学习php程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例