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 相关文章推荐
function.inc.php超越php
Dec 09 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
PHP的范围解析操作符(::)的含义分析说明
Jul 03 PHP
Zend studio文件注释模板设置方法
Sep 29 PHP
PHP多线程类及用法实例
Dec 03 PHP
php实现格式化多行文本为Js可用格式
Apr 15 PHP
php外部执行命令函数用法小结
Oct 11 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
PHP实现微信小程序人脸识别刷脸登录功能
May 24 PHP
PHP+redis实现微博的拉模型案例详解
Jul 10 PHP
php实现微信和支付宝支付的示例代码
Aug 11 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
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
php网站判断用户是否是手机访问的方法
2013/11/01 PHP
php从csv文件读取数据并输出到网页的方法
2015/03/14 PHP
PHP加密解密类实例代码
2016/07/20 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
jQuery 工具函数学习资料
2010/04/29 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
python中的协程深入理解
2019/06/10 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
应付会计岗位职责
2013/12/12 职场文书
自我反省检讨书
2014/01/23 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
汉语言文学职业规划
2014/02/14 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
企业元宵节主持词
2014/03/25 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
Go 内联优化让程序员爱不释手
2022/06/21 Golang