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


Posted in PHP onDecember 30, 2013

请先下载  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.uuid\s+=\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:本站还提供了一个功能十分强大的二维码工具供大家使用:

PHP 相关文章推荐
discuz7 phpMysql操作类
Jun 21 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
Feb 16 PHP
php多文件上传实现代码
Feb 20 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
PHP实现数组递归转义的方法
Aug 28 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
Jul 01 PHP
php 基础函数
Feb 10 PHP
详解php几行代码实现CSV格式文件输出
Jul 01 PHP
PHP中数组转换为SimpleXML教程
Jan 27 PHP
浅谈PHP变量作用域以及地址引用问题
Dec 27 #PHP
一个好用的PHP验证码类实例分享
Dec 27 #PHP
PHP连接SQLServer2005方法及代码
Dec 26 #PHP
php截取中文字符串不乱码的方法
Dec 25 #PHP
php输入流php://input使用示例(php发送图片流到服务器)
Dec 25 #PHP
php二维数组排序方法(array_multisort usort)
Dec 25 #PHP
php缩小png图片不损失透明色的解决方法
Dec 25 #PHP
You might like
yii的CURD操作实例详解
2014/12/04 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
2011/12/08 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
js导航菜单(自写)简单大方
2013/03/28 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
2015/02/03 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
小程序实现搜索框
2020/06/19 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
Echarts实现多条折线可拖拽效果
2019/12/19 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
python 获取本机ip地址的两个方法
2013/02/25 Python
在Python中操作字典之fromkeys()方法的使用
2015/05/21 Python
在Django框架中编写Context处理器的方法
2015/07/20 Python
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
工程业务员岗位职责
2013/12/31 职场文书
《孔子拜师》教学反思
2014/02/24 职场文书
2014年保洁工作总结
2014/11/24 职场文书
安阳殷墟导游词
2015/02/10 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
如何正确理解python装饰器
2021/06/15 Python
python前后端自定义分页器
2022/04/13 Python