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


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 相关文章推荐
聊天室php&amp;mysql(一)
Oct 09 PHP
php 远程图片保存到本地的函数类
Dec 08 PHP
php下图片文字混合水印与缩略图实现代码
Dec 11 PHP
Fine Uploader文件上传组件应用介绍
Jan 06 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
Sep 27 PHP
PHP多线程类及用法实例
Dec 03 PHP
php建立Ftp连接的方法
Mar 07 PHP
php中PDO方式实现数据库的增删改查
May 17 PHP
基于PHP实现假装商品限时抢购繁忙的效果
Oct 16 PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
Aug 05 PHP
基于ThinkPHP删除目录及目录文件函数
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&amp;&amp;mysql)三
2006/10/09 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
PHP中使用curl入门教程
2015/07/02 PHP
jquery高级编程的最佳实践详解
2014/03/23 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
python删除字符串中指定字符的方法
2018/08/13 Python
如何运行带参数的python脚本
2019/11/15 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
教学大赛获奖感言
2014/01/15 职场文书
高一生物教学反思
2014/01/17 职场文书
幼儿园教学管理制度
2014/02/04 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
七年级思品教学反思
2016/02/20 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python