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


Posted in PHP onDecember 31, 2015

通过学习借鉴朋友的实现方法进行整理,实现了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&lang=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&lang=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&lang=zh_CN&fakeid={$fakeId}";
    $this->getHeader = 0;
    $this->referer = 'https://mp.weixin.qq.com/cgi-bin/contactmanagepage?token='.$this->token.'&t=wxm-friend&lang=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&lang=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}&lang=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.'&lang=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 相关文章推荐
PHP中的加密功能
Oct 09 PHP
PHP zlib扩展实现页面GZIP压缩输出
Jun 17 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
Sep 16 PHP
PHP之uniqid()函数用法
Nov 03 PHP
php打包压缩文件之ZipArchive方法用法分析
Apr 30 PHP
php关闭warning问题的解决方法
May 17 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 PHP
laravel接管Dingo-api和默认的错误处理方式
Oct 25 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 PHP
php创建桌面快捷方式实现方法
Dec 31 #PHP
开启PHP的伪静态模式
Dec 31 #PHP
thinkphp多层MVC用法分析
Dec 30 #PHP
thinkphp命名空间用法实例详解
Dec 30 #PHP
详解PHP中的null合并运算符
Dec 30 #PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 #PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 #PHP
You might like
PHP文件下载类
2006/12/06 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
php基于GD库画五星红旗的方法
2015/02/24 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
javascript制作2048游戏
2015/03/30 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
详解python:time模块用法
2019/03/25 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
Python如何批量生成和调用变量
2020/11/21 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
高中运动会入场词
2014/02/14 职场文书
2014年小班元旦活动方案
2014/02/16 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
授权委托书协议书
2014/10/16 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis
如何Python使用re模块实现okenizer
2022/04/30 Python