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


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 相关文章推荐
经典的PHPer为什么被认为是草根?
Apr 02 PHP
解析posix与perl标准的正则表达式区别
Jun 17 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
ThinkPHP提交表单时默认自动转义的解决方法
Nov 25 PHP
Zend Framework教程之Application用法实例详解
Mar 14 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
Mar 15 PHP
laravel withCount 统计关联数量的方法
Oct 10 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 23 PHP
PHP数组基本用法与知识点总结
Jun 02 PHP
PHP tp5中使用原生sql查询代码实例
Oct 28 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
php面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
php输出图像的方法实例分析
2017/02/16 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
javascript String 对象
2008/04/25 Javascript
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
2020/01/22 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
python中的变量如何开辟内存
2018/06/26 Python
机器学习实战之knn算法pandas
2019/06/22 Python
python list转置和前后反转的例子
2019/08/26 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
C#实现启动一个进程
2016/10/01 面试题
会议邀请函
2015/01/30 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS
python缺失值填充方法示例代码
2022/12/24 Python