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


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实现与ASP Banner组件相似的类
Oct 09 PHP
PHP 文件上传进度条的两种实现方法的代码
Nov 25 PHP
新安装的MySQL数据库需要注意的安全知识
Jul 30 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
解析php curl_setopt 函数的相关应用及介绍
Jun 17 PHP
mac下Apache + MySql + PHP搭建网站开发环境
Jun 02 PHP
CI(CodeIgniter)框架介绍
Jun 09 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
Oct 13 PHP
cakephp打印sql语句的方法
Feb 13 PHP
PHP 数组基本操作小结(推荐)
Jun 13 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
PHP实现防盗链的方法分析
Jul 25 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
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
yii中widget的用法
2014/12/03 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
nicejforms——美化表单不用愁
2007/02/20 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
通过代码实例了解Python异常本质
2020/09/16 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
安全员岗位职责
2013/11/11 职场文书
2014年应届大学生自我评价
2014/01/09 职场文书
学校教师读书活动总结
2014/07/08 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
python中 Flask Web 表单的使用方法
2022/05/20 Python