请先下载 snoopy 类复制代码代码如下:php
* get_login_cookie() 鉴定成功后调用此方法即可获取用户基本信息* sendNews($account,$title,$summary,$content,$pic,$srcurl='') 向一个微信账户发送图文信息* get_avatar($url) 获取用户头像图片数据* @author dodge* @link https://github.com/dodgepudding/wechat-php-sdk* @version 1.1**/include "snoopy.class.php";class Wechatauth{private $cookie;private $_cookiename;private $_cookieexpired = 3600;private $_account = 'test';private $_datapath = './data/cookie_';private $debug;private $_logcallback;public $login_user; //当前登陆用户, 调用get_login_info后获取public function __construct($options){$this->_account = isset($options['account'])?$options['account']:'';$this->_datapath = isset($options['datapath'])?$options['datapath']:$this->_datapath;$this->debug = isset($options['debug'])?$options['debug']:false;$this->_logcallback = isset($options['logcallback'])?$options['logcallback']:false;$this->_cookiename = $this->_datapath.$this->_account;$this->getCookie($this->_cookiename);}/*** 把cookie写入缓存* @param string $filename 缓存文件名* @param string $content 文件内容* @return bool*/public function saveCookie($filename,$content){return file_put_contents($filename,$content);}/*** 读取cookie缓存内容* @param string $filename 缓存文件名* @return string cookie*/public function getCookie($filename){if (file_exists($filename)) {$mtime = filemtime($filename);if ($mtime_cookieexpired) return false;$data = file_get_contents($filename);if ($data) $this->cookie = $data;}return $this->cookie;}/** 删除cookie*/public function deleteCookie($filename) {$this->cookie = '';@unlink($filename);return true;}private function log($log){if ($this->debug && function_exists($this->_logcallback)) {if (is_array($log)) $log = print_r($log,true);return call_user_func($this->_logcallback,$log);}}/*** 获取登陆二维码对应的授权码*/public function get_login_code(){if ($this->_logincode) return $this->_logincode;$t = time().strval(mt_rand(100,999));$codeurl = 'https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_='.$t;$send_snoopy = new Snoopy;$send_snoopy->fetch($codeurl);$result = $send_snoopy->results;if ($result) {preg_match("/window.QRLogin.uuid\s+=\s+\"([^\"]+)\"/",$result,$matches);if(count($matches)>1) {$this->_logincode = $matches[1];$_SESSION['login_step'] = 0;return $this->_logincode;}}return $result;}/*** 通过授权码获取对应的二维码图片地址* @param string $code* @return string image url*/public function get_code_image($code=''){if ($code=='') $code = $this->_logincode;if (!$code) return false;return 'http://login.weixin.qq.com/qrcode/'.$this->_logincode.'?t=webwx';}/*** 设置二维码对应的授权码* @param string $code* @return class $this*/public function set_login_code($code) {$this->_logincode = $code;return $this;}/*** 二维码登陆验证** @return status:* >=400: invaild code; 408: not auth and wait, 400,401: not valid or expired* 201: just scaned but not confirm* 200: confirm then you can get user info*/public function verify_code() {if (!$this->_logincode) return false;$t = time().strval(mt_rand(100,999));$url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid='.$this->_logincode.'&tip=1&_='.$t;$send_snoopy = new Snoopy;$send_snoopy->referer = "https://wx.qq.com/";$send_snoopy->fetch($url);$result = $send_snoopy->results;$this->log('step1:'.$result);if ($result) {preg_match("/window\.code=(\d+)/",$result,$matches);if(count($matches)>1) {$status = intval($matches[1]);if ($status==201) $_SESSION['login_step'] = 1;if ($status==200) {preg_match("/ticket=([0-9a-z-_]+)&lang=zh_CN&scan=(\d+)/",$result,$matches);$this->log('step2:'.print_r($matches,true));if (count($matches)>1) {$ticket = $matches[1];$scan = $matches[2];$loginurl = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket='.$ticket.'&lang=zh_CN&scan='.$scan.'&fun=new';$send_snoopy = new Snoopy;$send_snoopy->referer = "https://wx.qq.com/";$send_snoopy->fetch($loginurl);$this->log('step3:'.print_r($send_snoopy->headers,true));foreach ($send_snoopy->headers as $key => $value) {$value = trim($value);if(strpos($value,'Set-Cookie: ') !== false){$tmp = str_replace("Set-Cookie: ","",$value);$tmp = str_replace("Path=/","",$tmp);$tmp = str_replace("Domain=.qq.com; ","",$tmp);$cookie.=$tmp;}}$cookie .="Domain=.qq.com;";$this->cookie = $cookie;$this->saveCookie($this->_cookiename,$this->cookie);}}return $status;}}return false;}/*** 获取登陆的cookie** @param bool $is_array 是否以数值方式返回,默认否,返回字符串* @return string|array*/public function get_login_cookie($is_array = false){if (!$is_array) return $this->cookie;$c_arr = explode(';',$this->cookie);$cookie = array();foreach($c_arr as $item) {$kitem = explode('=',trim($item));if (count($kitem)>1) {$key = trim($kitem[0]);$val = trim($kitem[1]);if (!empty($val)) $cookie[$key] = $val;}}return $cookie;}/*** 授权登陆后获取用户登陆信息*/public function get_login_info(){if (!$this->cookie) return false;$t = time().strval(mt_rand(100,999));$send_snoopy = new Snoopy;$submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r='.$t;$send_snoopy->rawheaders['Cookie']= $this->cookie;$send_snoopy->referer = "https://wx.qq.com/";$send_snoopy->submit($submit,array());$this->log('login_info:'.$send_snoopy->results);$result = json_decode($send_snoopy->results,true);if ($result['BaseResponse']['Ret'] $this->_login_user = $result['User'];return $result;}/*** 获取头像* @param string $url 传入从用户信息接口获取到的头像地址*/public function get_avatar($url) {if (!$this->cookie) return false;if (strpos($url, 'http')===false) {$url = 'http://wx.qq.com'.$url;}$send_snoopy = new Snoopy;$send_snoopy->rawheaders['Cookie']= $this->cookie;$send_snoopy->referer = "https://wx.qq.com/";$send_snoopy->fetch($url);$result = $send_snoopy->results;if ($result)return $result;elsereturn false;}/*** 登出当前登陆用户*/public function logout(){if (!$this->cookie) return false;preg_match("/wxuin=(\w+);/",$this->cookie,$matches);if (count($matches)>1) $uid = $matches[1];preg_match("/wxsid=(\w+);/",$this->cookie,$matches);if (count($matches)>1) $sid = $matches[1];$this->log('logout: uid='.$uid.';sid='.$sid);$send_snoopy = new Snoopy;$submit = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxlogout?redirect=1&type=1';$send_snoopy->rawheaders['Cookie']= $this->cookie;$send_snoopy->referer = "https://wx.qq.com/";$send_snoopy->submit($submit,array('uin'=>$uid,'sid'=>$sid));$this->deleteCookie($this->_cookiename);return true;}}
