微信扫描二维码登录网站代码

微信扫描二维码登录网站代码

用户通过扫描网页提供的二维码实现登陆信息获取,大家参考使用吧

请先下载 snoopy 类

代码如下:

<?php

/**

* 微信公众平台PHP-SDK

* Wechatauth为非官方微信登陆API

* 用户通过扫描网页提供的二维码实现登陆信息获取

* 主要实现如下功能:

* get_login_code() 获取登陆授权码, 通过授权码才能获取二维码

* get_code_image($code='') 将上面获取的授权码转换为图片二维码

* verify_code() 鉴定是否登陆成功,返回200为最终授权成功.

* get_login_cookie() 鉴定成功后调用此方法即可获取用户基本信息

* sendNews($account,$title,$summary,$content,$pic,$srcurl='') 向一个微信账户发送图文信息

* get_avatar($url) 获取用户头像图片数据

* @author dodge <dodgepudding@gmail.com>

* @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<time()-$this->_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?app.$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;

}

/**

* 通过授权码获取对应的二维码图片地址

* @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?uu&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-_]+)&,$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.'&.$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']<0) return false;

$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;

else

return 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("/wxs,$this->cookie,$matches);

if (count($matches)>1) $sid = $matches[1];

$this->log('logout: u;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;

}

}