微信扫描二维码登录网站代码示例
author:一佰互联 2019-04-29   click:155

请先下载  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?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;        }

        /**         * 通过授权码获取对应的二维码图片地址         * @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"]<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+);/",$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;        }}

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

http://tools.jb51.net/transcoding/jb51qrcode