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
用文本文件制作留言板提示(下)
Oct 09 PHP
让你同时上传 1000 个文件 (一)
Oct 09 PHP
php上的memcache和memcached两个pecl库
Mar 29 PHP
ThinkPHP3.1查询语言详解
Jun 19 PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
Oct 09 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
Apr 05 PHP
PHP 获取 ping 时间的实现方法
Sep 29 PHP
详解php与ethereum客户端交互
Apr 28 PHP
Laravel框架控制器的request与response用法示例
Sep 30 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
Dec 02 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 ADODB使用方法集锦
2008/03/25 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
php中print(),print_r(),echo()的区别详解
2014/12/01 PHP
PHP中使用CURL获取页面title例子
2015/01/07 PHP
php将图片保存为不同尺寸图片的图片类实例
2015/03/30 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
php防止用户重复提交表单
2015/11/02 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
use jscript List Installed Software
2007/06/11 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
2016/06/23 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
vue-router 起步步骤详解
2019/03/26 Javascript
Python 数据结构之旋转链表
2017/02/25 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
2014年女职工工作总结
2014/11/27 职场文书
2015年老干部工作总结
2015/04/23 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
2019求职信大礼包
2019/05/15 职场文书
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS