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技巧与注意事项分析
Feb 03 PHP
php urlencode()与urldecode()函数字符编码原理详解
Dec 06 PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 PHP
CI框架装载器Loader.php源码分析
Nov 04 PHP
推荐5款跨平台的PHP编辑器
Dec 25 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 PHP
PHP实现的简单AES加密解密算法实例
May 29 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 PHP
yii框架使用分页的方法分析
Jul 25 PHP
thinkphp 获取控制器及控制器方法
Apr 16 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 批量生成html,txt文件的实现代码
2013/06/26 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
vue $mount 和 el的区别说明
2020/09/11 Javascript
Python实现批量下载图片的方法
2015/07/08 Python
使用Python对MySQL数据操作
2017/04/06 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
解决Django连接db遇到的问题
2019/08/29 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
Python读取实时数据流示例
2019/12/02 Python
python实现人脸签到系统
2020/04/13 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
css3一个简易的 LED 数字时钟实现方法
2020/01/15 HTML / CSS
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
软件设计的目标是什么
2016/12/04 面试题
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
迷你西餐厅创业计划书范文
2013/12/31 职场文书
科研课题实施方案
2014/03/18 职场文书
党风廉政建设责任书
2014/04/14 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
原告代理词范文
2015/05/25 职场文书
导游词之长城八达岭
2019/09/24 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL
Python如何加载模型并查看网络
2022/07/15 Python