微信公众平台OAuth2.0网页授权php示例

巴扎黑
发布: 2016-11-11 17:40:28
原创
2166人浏览过

用户通过扫描网页提供的二维码实现登陆信息获取,大家参考使用吧 
请先下载  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.uuids+=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; 
        } 
}

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号