zl程序教程

您现在的位置是:首页 >  工具

当前栏目

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

微信网站代码 示例 登录 扫描 二维码
2023-06-13 09:15:14 时间

请先下载 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)获取用户头像图片数据
 * @authordodge<dodgepudding@gmail.com>
 * @linkhttps://github.com/dodgepudding/wechat-php-sdk
 * @version1.1
 * 
 */
include"snoopy.class.php";
classWechatauth
{
       private$cookie;
       private$_cookiename;
       private$_cookieexpired=3600;
       private$_account="test";
       private$_datapath="./data/cookie_";
       private$debug;
       private$_logcallback;
       public$login_user;//当前登陆用户,调用get_login_info后获取
       
       publicfunction__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 文件内容
        *@returnbool
        */
       publicfunctionsaveCookie($filename,$content){
               returnfile_put_contents($filename,$content);
       }

       /**
        *读取cookie缓存内容
        *@param string$filename缓存文件名
        *@returnstringcookie
        */
       publicfunctiongetCookie($filename){
               if(file_exists($filename)){
                       $mtime=filemtime($filename);
                       if($mtime<time()-$this->_cookieexpired)returnfalse;
                       $data=file_get_contents($filename);
                       if($data)$this->cookie=$data;
               }
               return$this->cookie;
       }
       
       /*
        *删除cookie
        */
       publicfunctiondeleteCookie($filename){
               $this->cookie="";
               @unlink($filename);
               returntrue;
       }
       
       privatefunctionlog($log){
               if($this->debug&&function_exists($this->_logcallback)){
                       if(is_array($log))$log=print_r($log,true);
                       returncall_user_func($this->_logcallback,$log);
               }
       }
       
       /**
        *获取登陆二维码对应的授权码
        */
       publicfunctionget_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=newSnoopy;
               $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;
       }

       /**
        *通过授权码获取对应的二维码图片地址
        *@paramstring$code
        *@returnstringimageurl
        */
       publicfunctionget_code_image($code=""){
               if($code=="")$code=$this->_logincode;
               if(!$code)returnfalse;
               return"http://login.weixin.qq.com/qrcode/".$this->_logincode."?t=webwx";
       }
       
       /**
        *设置二维码对应的授权码
        *@paramstring$code
        *@returnclass$this
        */
       public functionset_login_code($code){
               $this->_logincode=$code;
               return$this;
       }
       
       /**
        *二维码登陆验证
        *
        *@returnstatus:
        *>=400:invaildcode;408:notauthandwait,400,401:notvalidorexpired
        *201:justscanedbutnotconfirm
        *200:confirmthenyoucangetuserinfo
        */
       publicfunctionverify_code(){
               if(!$this->_logincode)returnfalse;
               $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=newSnoopy;
                       $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=newSnoopy;
                                                       $send_snoopy->referer="https://wx.qq.com/";
                                                       $send_snoopy->fetch($loginurl);
                                                       $this->log("step3:".print_r($send_snoopy->headers,true));
                                                       foreach($send_snoopy->headersas$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;
                               }
                       }
               returnfalse;
       }
       
       /**
        *获取登陆的cookie
        *
        *@parambool$is_array是否以数值方式返回,默认否,返回字符串
        *@returnstring|array
        */
       publicfunctionget_login_cookie($is_array=false){
               if(!$is_array)       return$this->cookie;
               $c_arr=explode(";",$this->cookie);
               $cookie=array();
               foreach($c_arras$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;
       }
       
       /**
        *         授权登陆后获取用户登陆信息
        */
       publicfunctionget_login_info(){
               if(!$this->cookie)returnfalse;
               $t=time().strval(mt_rand(100,999));
               $send_snoopy=newSnoopy;
               $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)returnfalse;
               $this->_login_user=$result["User"];
               return$result;
       }
       
       /**
        * 获取头像
        * @paramstring$url传入从用户信息接口获取到的头像地址
        */
       publicfunctionget_avatar($url){
               if(!$this->cookie)returnfalse;
               if(strpos($url,"http")===false){
                       $url="http://wx.qq.com".$url;
               }
               $send_snoopy=newSnoopy;
               $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
                       returnfalse;
       }
       
       /**
        *登出当前登陆用户
        */
       publicfunctionlogout(){
               if(!$this->cookie)returnfalse;
               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=newSnoopy;
               $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);
               returntrue;
       }
}

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