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


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 相关文章推荐
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
Apr 18 PHP
Apache 配置详解(最好的APACHE配置教程)
Jul 04 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
Mar 26 PHP
php一次性删除前台checkbox多选内容的方法
Sep 22 PHP
使用phpQuery采集网页的方法
Nov 13 PHP
php实例分享之二维数组排序
May 15 PHP
PHP模块memcached使用指南
Dec 08 PHP
php获取网页里所有图片并存入数组的方法
Apr 06 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
Oct 04 PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 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 魔术方法详解
2014/11/11 PHP
php中fsockopen用法实例
2015/01/05 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
javascript基本类型详解
2014/11/28 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
小程序和web画三角形实现解析
2019/09/02 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
详解Python中的相对导入和绝对导入
2017/01/06 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
2018/12/28 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
大四自我鉴定
2014/02/08 职场文书
军训自我鉴定100字
2014/02/13 职场文书
物流专员岗位职责
2014/02/17 职场文书
学生保证书范文
2014/04/28 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
HTML中的表格元素介绍
2022/02/28 HTML / CSS
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis
Go语言 详解net的tcp服务
2022/04/14 Golang
Elasticsearch 批量操作
2022/04/19 Python
代码复现python目标检测yolo3详解预测
2022/05/06 Python
element tree树形组件回显数据问题解决
2022/08/14 Javascript
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL