`
zzc1684
  • 浏览: 1222710 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

请先下载  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;
      }
}

 

 

 

分享到:
评论
1 楼 kingding 2015-07-06  
这样只要是手机登录了微信的用户。扫描二维码后都可以登录进入网站主页?

相关推荐

    java 微信扫描二维码支付demo

    这个“java 微信扫描二维码支付demo”应该是包含了一个完整的示例项目,帮助开发者理解如何在Java后端生成二维码并集成微信支付功能。下面我们将深入探讨相关知识点。 1. **微信支付API** 微信提供了公众平台支付...

    opencv + 微信二维码识别

    而微信二维码识别则涉及移动支付和信息交换的领域,通过扫描二维码来读取和解析其中包含的信息。 在描述中提到,“本程序可以直接运行实现二维码识别”,这意味着开发者已经构建了一个完整的流程,用户无需额外的...

    微信实现网页扫描二维码登录

    微信实现网页扫描二维码登录,分三步走,第一步配置相关信息,第二步 代码编程,第三步 测试,主要是配置需要关注的点有几个,可以详细阅读我的博客,配置正确,一切都ok

    离线微信二维码名片生成器

    此外,项目可能还包含了示例数据和配置文件,帮助用户理解和定制自己的微信二维码名片生成器。通过学习和理解这个项目,开发者可以掌握如何在前端生成二维码,以及如何结合微信环境优化用户体验。这不仅适用于名片,...

    安卓条码扫描二维码相关-仿微信二维码制作二维码扫码读取名片信息.rar

    这个压缩包文件“安卓条码扫描二维码相关-仿微信二维码制作二维码扫码读取名片信息.rar”似乎提供了一个实现类似微信功能的示例项目,让我们来详细探讨一下相关的知识点。 1. **二维码技术**: - 二维码是一种二维...

    Python提取支付宝和微信支付二维码的示例代码

    #### 示例代码解析 ```python import glob from PIL import Image if __name__ == '__main__': filenames = glob.glob('*.png') # 微信支付收款码导出为png格式 filenames.extend(glob.glob('*.jpg')) # 支付宝...

    仿微信的二维码登录功能:客户端登录后,通过扫描web端页面上的二维码,实现同一用户在web端的登录.zip

    在IT行业中,二维码登录已经成为一种常见的用户认证方式,特别是在...项目中的源代码`qrcode_login-master`可能包含了实现这一功能的具体步骤,包括客户端和服务器端的代码示例,对于学习者来说是一份宝贵的参考资料。

    扫描二维码(zxing)

    本文将详细讲解如何使用ZXing库在Android应用中实现二维码扫描功能,并提供相关的代码示例。 首先,我们需要在项目中引入ZXing库。如果你使用的是Gradle构建系统,可以在app模块的build.gradle文件中添加依赖: ``...

    基于Winfrom的企业微信扫码登录案例

    4. **代码示例**: ```csharp // 获取二维码图片 string qrCodeUrl = "https://work.weixin.qq.com/api/qrcode?access_token=ACCESS_TOKEN&agentid=AGENT_ID"; using (var client = new WebClient()) { byte[]...

    opencvsharp4.5.5 wechats微信二维码识别c#

    总的来说,通过结合OpenCVSharp4.5.5和ZXing.Net,C#开发者可以构建一个高效且准确的微信二维码识别系统,从而在各种应用场景中实现快速的微信登录、分享等功能。理解和掌握这两个库的使用是提升C#应用程序功能的...

    原生鼠标悬停微信图标显示二维码效果

    在IT行业中,实现“原生鼠标悬停微信图标显示二维码效果”是一项常见的交互设计,它主要涉及HTML、CSS和JavaScript这三个核心技术。...这种效果提升了用户体验,使用户能够更方便地扫描二维码进行互动。

    js.rar_js二维码扫描_二维码_二维码扫描_微信_微信二维码

    "js.rar"可能是一个包含JavaScript相关代码或库的压缩文件,它聚焦于实现二维码的生成和扫描功能。本文将深入探讨二维码的基本原理、在JavaScript中的实现以及与微信二维码的关联。 首先,二维码(Quick Response ...

    微信native支付接口调用代码示例+企业微信消息推送接口调用示例

    用户在商家APP内选择商品后,通过扫描二维码或条形码完成支付,无需跳转到微信支付页面。 2. **接口调用流程**: - **预下单(统一下单)**:商户系统先向微信支付服务器发送请求,生成预支付交易订单。 - **生成...

    微信支付宝扫码支付DELPHI示例源码.rar

    Delphi开发的微信、支付宝支付源代码,无需域名,只需输入微信公众号、微信商户号、微信API密钥;支付宝APPID 、支付宝验签密钥文件;订单编号、支付金额,就可以完成以下微信、支付宝支付。 1、生成微信支付二维码...

    微信小程序扫描二维码获取信息实例详解

    在微信小程序中,扫描二维码是一项常见的功能,可以用于获取各种信息,例如商品详情、链接、会员信息等。本文将深入讲解如何在微信小程序中实现扫描二维码并获取信息的实例。 首先,我们需要创建一个简单的微信小...

    基于OpenCV开源的微信二维码引擎.zip

    在本项目中,`java0323`可能代表一个Java实现的代码示例或者版本号,说明这个开源引擎使用Java语言编写,适应于Java开发环境。这使得它不仅适用于Android平台,还可以在Java桌面应用或其他Java支持的系统中使用。 ...

    基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

    通过以上步骤,你就可以构建一个基本的二维码和条形码扫描应用,其功能和界面与微信扫描相似。当然,实际应用可能还需要考虑更多的细节,比如错误处理、用户反馈、性能优化等。希望这个简要的指南能帮助你开始你的...

    guyandog-QR_BR-master -新增新版微信二维码识别.zip

    8. **项目结构**:这个"guyandog-QR_BR-master"项目可能包含了源代码、示例、测试用例以及相关文档,帮助开发者理解如何集成和使用这个新的微信二维码识别功能。 9. **开发实践**:在实际开发中,需要考虑浏览器...

Global site tag (gtag.js) - Google Analytics