Users can obtain login information by scanning the QR code provided on the web page.
/** * WeChat Public Platform PHP-SDK * Wechatauth is the unofficial WeChat login API * Users can obtain login information by scanning the QR code provided on the webpage * Mainly implements the following functions: * get_login_code() to obtain the login authorization code, through Only the authorization code can be obtained to obtain the QR code * get_code_image($code='') Convert the authorization code obtained above into the image QR code * verify_code() Verify whether the login is successful and return 200 for final authorization success. * get_login_cookie( ) After successful authentication, call this method to obtain the user's basic information * sendNews($account,$title,$summary,$content,$pic,$srcurl='') Send graphic and text information to a WeChat account * get_avatar( $url) Get user avatar image data * @author dodge
* [url=home.php?mod=space&uid=17823]@LINK[/url] 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; //Current logged in user, get it after calling 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);
}
/**
* Write the cookie to the cache
* @param string $filename cache file name
* @param string $content file content
* @return bool
*/
public function saveCookie($filename,$content){
return file_put_contents($filename,$content) ;
}
/**
* Read cookie cache content
* @param string $filename cache file name
* @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;
}
/*
* Delete 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);
}
}
/**
* Get the authorization code corresponding to the login QR code
*/
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.uuids+=s+"([^"]+)"/",$result,$matches);
if(count($matches)>1 ) {
$this->_logincode = $matches[1];
$_SESSION['login_step'] = 0;
return $this->_logincode;
}
}
return $result;
}
/**
* Obtain the corresponding QR code image address through the authorization code
* @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';
}
/**
* Set the authorization code corresponding to the QR code
* @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;
}
/**
* Get the login cookie
*
* @param bool $is_array Whether to return in numerical form, the default is no, return a string
* @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;
}
/**
* Obtain user login information after authorized login
*/
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']<0) return false; $this->_login_user = $result['User'];
return $result;
}
/**
* Get avatar
* @param string $url Pass in the avatar address obtained from the user information interface
*/
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;
else
return false;
}
/**
* Log out the currently logged in user
*/
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;
}
}
复制代码