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

请先下载 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 * @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);
}
}

/**

/**

  • 设置二维码对应的授权码
  • @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+)/",$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+)/",$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']<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("/wxsid=(\w+);/",$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;
    }
    }

PS:本站还提供了一个功能十分强大的二维码工具供大家使用:

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...