AD

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

用户通过扫描网页提供的二维码实现登陆信息获取,大家参考使用吧

请先下载 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 <[email protected]>
 *  @link **github**/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 = '**login.weixin.qq**/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq**%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 '**login.weixin.qq**/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 = '**login.weixin.qq**/cgi-bin/mmwebwx-bin/login?uuid='.$this->_logincode.'&tip=1&_='.$t;
                        $send_snoopy = new Snoopy;
                        $send_snoopy->referer = "**wx.qq**/";
                        $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 = '**wx.qq**/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket='.$ticket.'&lang=zh_CN&scan='.$scan.'&fun=new';
                                                        $send_snoopy = new Snoopy;
                                                        $send_snoopy->referer = "**wx.qq**/";
                                                        $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**; ","",$tmp);
                                                                        $cookie.=$tmp;
                                                                }
                                                        }
                                                        $cookie .="Domain=.qq**;";
                                                        $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 = '**wx.qq**/cgi-bin/mmwebwx-bin/webwxinit?r='.$t;
                $send_snoopy->rawheaders['Cookie']= $this->cookie;
                $send_snoopy->referer = "**wx.qq**/";
                $send_snoopy->submit($submit,array());
                $this->log('login_**'.$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 = '**wx.qq**'.$url;
                }
                $send_snoopy = new Snoopy;
                $send_snoopy->rawheaders['Cookie']= $this->cookie;
                $send_snoopy->referer = "**wx.qq**/";
                $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 = '**wx.qq**/cgi-bin/mmwebwx-bin/webwxlogout?redirect=1&type=1';
                $send_snoopy->rawheaders['Cookie']= $this->cookie;
                $send_snoopy->referer = "**wx.qq**/";
                $send_snoopy->submit($submit,array('uin'=>$uid,'sid'=>$sid));
                $this->deleteCookie($this->_cookiename);
                return true;
        }
}
标签: 微信扫描二维码
分类: php实例
时间: 2013-12-03

相关文章

  1. Android微信扫描二维码登入实现 基于ZXing开源工程

    项目需求,做一个类似微信扫描二维码,网页端登陆的功能实现. 利用开源项目ZXing来实现.ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形 ...
  2. 微信扫描二维码登入实现,网页端

    服务器端要做得事很多,虽然逻辑不是很复杂,但是我们必须要分析清楚我们要做哪些事,请看下图: 通过这张图,我们看出,服务器端的接口一共有6个,分别处理: 手机客户端登录 首页 二维码图片流 long polling维持 接 ...
  3. 利用ZXING扫描二维码的分析

    之前给公司做了一个摄影相关的应用,现在要添加二维码扫描的功能,网上找资料后,虽然已经成功集成到app里面,但是总感觉心里没底儿.所以趁这段时间不是很忙,总结一下. 首先是启动扫描的UI类: 1,Activity启动,当然 ...
  4. asp.net C#生成和解析二维码的实例代码

    这篇文章介绍了asp.net C#生成和解析二维码的实例代码,有需要的朋友可以参考一下 类库文件我们在文件最后面下载 [ThoughtWorks.QRCode.dll 就是类库] 使用时需要增加: using Thoug ...
  5. 二维码登录原理 CSC

    世纪双12 VS天猫双xx,搞二维码扫描投注彩票,玩死你,虽然说还没把二维码应用到极致,估计也不远了 下面但从技术角度考虑下原理实现: web客户端 --> 服务端 <-- 手持移动设备 三方验证 主要工作: ...
  6. php实现扫描二维码根据浏览器类型访问不同下载地址

    本程序实现的功能就是扫描同一个二维码根据浏览器类型访问不同下载地址,很实用的,建议大家学习下 <?php $Agent = $_SERVER['HTTP_USER_AGENT']; preg_match('/and ...
  7. c#二维码生成的代码分享

    c#生成二维码实现示例代码分享,生成方法是调用外网API,为了不直接调用别人的接口,创建一个QrImg.aspx用于显示二维码,传参数即可 using System; using System.Collections.G ...
  8. 手机摄像头扫描二维码

    http://www.apkbus.com/android-94033-1-1.html http://www.cnblogs.com/tankaixiong
  9. Android 基于google Zxing实现二维码.条形码扫描,仿微信二维码扫描效果

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的 ...
  10. [专题]Android 应用之二维码扫描登录

    下面介绍二维码扫描登录原理, 首先需要web服务端,和app客户端. web服务端主要工作是生成二维码,检测客户端提交信息正确性,更新网页界面. app客户端主要工作是扫描二维码,提交账户信息(此不是指提交用户名和密码) ...
  11. 二维码扫描和生成

    二维码扫描和生成 网站 : http://code4app.com/ios/利用ZBar实现二维码扫描和生成/501a70f16803fa1c73000000 在 ZBarSDK(本站下载:http://code4app ...
  12. 二维码扫描购物叫好不叫座 电商媒体持观望态度

    如果你在看报纸或者看直邮目录,在广告中看到心仪的商品,用手机扫一下旁边的二维码,马上完成支付,然后就等着商品送到家,这样是不是一种很不错的购物方式?但这种听上去很好的购物概念,却并不是那么叫座. 变革 在麦考林副总裁陈少 ...
  13. OSC线下活动客户端自动签到流程说明以及二维码扫描Demo

    刚在公司吃完烧烤回来,吃得好饱,这个感觉真是太棒了,@丫头潘潘这手艺都可以在公司楼下开个烧烤摊自己当老板了,给潘潘点个赞.要不下次咱们源创会的茶歇时间让潘潘现场给oscer来一份烧烤得了. 好了,有点扯远了,今天的主题是 ...
  14. PHP下通过QRCode类库创建中间带网站LOGO的二维码

    这篇文章主要介绍了用php中QRCode类库创建中间带LOGO的二维码,QRcode生成二维码的实例代码,有需要的朋友可以参考下 我们要生成二维码都需要借助一些类库来实现了,下面我介绍利用PHP QR Code生成二维码 ...
  15. 二维码市场生存调查:从防伪工具到潮货

    本报记者 董长青 好像在一夜之间,今年届满十八岁的二维码忽然成了很潮的玩意儿-- 微博上,一批名人"大V"纷纷用一个黑白交错的小方块,来推销自己的微信认证账号.扫拍媒体广告上的二维码,就可以实现购物和 ...
  16. 给WordPress的文章增加二维码

    "二维码将取代 URL,成为移动时代人们访问网站的主要方式".不管这句话说的是否太绝对,能通过更简单的方式获得互联网内容总归是好事.对于博客主来说,二维码还可以帮助你的文章更快捷的被分享.传播,何乐而 ...
  17. 二维码3年可望撬动千亿级市场 盈利模式待解

    羊城晚报记者林曦李晓莉 实习生刘安安 似乎就在一夜之间,二维码渗入到人们生活的方方面面:这个或大或小的"回"字(注:二维码的形状)出现在各类商品的外包装盒上,出现在机票.火车票等各种票据上,出现在餐馆 ...
  18. 二维码的诱惑:2015年市场规模将超1千亿

    O2O购物.电影票.优惠券.会议签到,忽如一夜春风来,二维码突然开始越来越多地进入人们的视野,腾讯当家人马化腾更是喊出了"未来二维码将成为移动互联网的重要入口"这一口号.而随着腾讯的高调加入,二维码这 ...
  19. 二维码复兴:老技术的新生命

    二维码背后的趋势是整个世界的互联网化,这一趋势要求信息以更为简单有效的方式从线下流向线上.从技术角度来看,二维码将被取代,难以取代的则是围绕"信息流动加速器"所形成的服务模式. 王鹏飞第一次发现微信里 ...