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 相关文章推荐
判“新”函数:得到今天与明天的秒数
Oct 09 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
Apr 20 PHP
php模拟post提交数据的方法
Feb 12 PHP
php按字符无乱码截取中文的方法
Mar 27 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
编写PHP脚本过滤用户上传的图片
Jul 03 PHP
iOS10推送通知开发教程
Sep 19 PHP
简单谈谈PHP中的Reload操作
Dec 12 PHP
PHP面向对象程序设计类的定义与用法简单示例
Dec 27 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
Jan 15 PHP
PHP异步进程助手async-helper
Feb 05 PHP
PHP集成环境XAMPP的安装与配置
Nov 13 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
怎么使 Mysql 数据同步
2006/10/09 PHP
php实现的递归提成方案实例
2015/11/14 PHP
jQuery ui 1.7更新小结
2009/08/15 Javascript
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
C语言基础笔试题
2013/04/27 面试题
机械电子工程毕业生自荐信
2013/11/23 职场文书
学生安全教育材料
2014/02/14 职场文书
毕业生求职信范文
2014/06/29 职场文书
2014和解协议书范文
2014/09/15 职场文书
招标授权委托书样本
2014/09/23 职场文书
校长四风对照检查材料
2014/09/27 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014年业务工作总结
2014/11/17 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
消防安全培训工作总结
2015/10/23 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
CSS的calc函数用法小结
2022/06/25 HTML / CSS