微信扫描二维码登录网站代码示例
请先下载 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;
}
}
相关文章
- 【愚公系列】2022年09月 微信小程序-Page页面扩展
- 微信小程序–单选复选按钮组的实现
- iOS逆向入门实践 — 逆向微信,伪装定位(二)
- 【黄啊码】PHP配合微信小程序实现获取手机号码【直接抄即可】
- 通过Wireshark监听流量,查找对方微信、QQ、钉钉的IP地址 – 学金融的文史哲小生
- WordPress 网站使用 “微信机器人高级版” 插件连通微信公众号
- 微信版大语言模型来了:跨时空对话李白、教你高情商说话,API在线试玩全都有
- 微信小程序 picker-从底部弹起的滚动选择器
- 微信开发者工具的使用
- java企业通知小程序微信消息推送小程序企业消息通知系统网站源码
- 每日优鲜回应清退解散;国内Go语言爱好者发起新编程语言;微信安装包11年膨胀575倍|Q资讯
- 微信机器人详细介绍:自定义回复
- 第三方微信小程序管理软件有哪些优势?
- 微信企业号开发:微信考勤Cookies的使用详解手机开发
- 微信公众号支付入坑-02详解手机开发
- 微信小程序开发语音识别文字教程详解手机开发
- php如何使用微信用户绑定网站用户详解编程语言
- 商家引流新渠道!微信支付“品牌红包”新增视频号入口