`
koothon
  • 浏览: 7081 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

php 
阅读更多
用户通过扫描网页提供的二维码实现登陆信息获取,大家参考使用吧
请先下载  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;
        }
}
分享到:
评论

相关推荐

    java对微信的OAuth2.0网页授权进行访问授权

    在微信开发中,OAuth2.0网页授权是一个关键机制,用于第三方应用获取用户的基本信息,以便提供个性化的服务。Java作为广泛使用的后端编程语言,自然可以与微信接口结合实现这一功能。本教程将深入讲解如何使用Java...

    微信oauth2.0授权

    2. 用户授权:用户在微信授权页面上确认是否允许应用获取其信息。如果用户同意,微信会将用户重定向到开发者预先设定的重定向URI,并在URL中附带一个授权码(code)。 3. 获取Access Token:开发者通过HTTP POST...

    微信公众平台开发OAuth2.0网页授权认证

    微信公众平台开发OAuth2.0网页授权认证

    微信公众号开发以及集成OAuth2.0网页授权

    该套代码主要用于开发微信公众账号,定制菜单和消息自动回复。这两个功能可以参考imooc里的两个微信开发教程来学习。该代码在这基础上集成了OAuth2.0网页授权。

    微信网页授权oauth2.0版

    首先,去微信公众平台测试号管理注册公众号。 地址:http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index IDE:IntelliJ IDEA 2020.1.3 x64 (找度娘破解) 微信开发者工具 (官网去...

    基于ThinkPHP3.2.3的微信OAuth2.0微信网页授权

    综上所述,基于ThinkPHP3.2.3实现微信OAuth2.0网页授权涉及到OAuth2.0协议理解、ThinkPHP框架的应用、微信开放平台接口的调用以及安全策略的实施。开发者需要熟悉这些知识点,才能成功地集成微信授权功能到自己的Web...

    微信OAuth2.0网页授权接口

    微信OAuth2.0网页授权接口 微信OAuth2.0网页授权接口的thinkphp实现版本,主要实现了oauth网页受权,以及部分其他接口。 使用方法 为什么用OAuth2.0受权? 通过OAuth2.0受权的网页将会获取到打开者的微信信息,...

    微信OAuth2.0网页授权接口PHP版用法示例.rar

    微信OAuth2.0网页授权接口PHP版用法示例,测试前请先申请一个公众号供测试,微信提供测试用的公众账号,此帐号只能添加100个关注者且只有__已关注__的用户才可以进行OAuth2.0受权。  1.开通后将```appID```、```app...

    微信登录-Oauth2.0获取用户openid、头像、昵称等相关信息

    使用asp开发的微信登录-Oauth2.0获取用户openid、头像、昵称等相关信息,用于公众号相关应用开发。

    Java 微信网页授权登陆 OAuth2.0源码

    3、网页服务--》网页帐号--》修改--》授权回调页面域名: 882c783d.ngrok.io 该域名为ngrok域名 4、修改程序中 appID值 org.liufeng.course.servlet.OAuthServlet AdvancedUtil.getOauth2AccessToken() org.liufeng....

    微信公众号 Oauth 2.0 授权登录认证

    简单实用的获取微信公众号用户的信息 /* *微信认证获取openid部分: *临时认证code */ //微信认证部分:第二步 获得code string code = Request["code"]; if (string.IsNullOrEmpty(code)) { //如果code没...

    C# 微信oauth2.0 网页授权源码

    C# 微信oauth2.0 网页授权源码 适应于微信二次开发中微信直接登录第三方系统的要求。

    java 微信OAuth2.0网页授权登陆源码

    Java微信OAuth2.0网页授权登录是微信开发者平台提供的一种安全机制,允许第三方应用通过用户授权获取微信用户的个人信息,从而实现用户身份验证和数据交互。在这个源码包中,你将找到实现这一功能的关键代码,确保了...

    OAuth2.0新浪微博简单示例

    这个“OAuth2.0新浪微博简单示例”是为初学者设计的,旨在帮助理解OAuth2.0的工作原理及其在实际应用中的实现方式,特别是与新浪微博的集成。 首先,我们来深入了解一下OAuth2.0的核心概念: 1. **客户端(Client...

    微信Oauth2.0 PHP 客户端 client

    微信OAuth2.0是微信开放平台提供的一种授权机制,用于帮助第三方应用安全地获取微信用户的个人信息。PHP客户端client则是开发者用来实现这一授权流程的代码库。在这个特定的案例中,我们有一个名为`weixin_oauth2....

    基于springboot2.x的Oauth2.0一键授权登录和微信网页扫码支付测试开发案例(含源码)

    使用idea开发工具,基于springboot2.x、jwt鉴权、nginx集群,前后端分离的微信Oauth2.0一键登录和微信网页扫码支付测试开发demo

    基于Django2.1.2的OAuth2.0授权登录

    **基于Django 2.1.2的OAuth2.0授权登录详解** OAuth2.0是一种开放标准,用于授权第三方应用访问用户存储在另一服务提供商(如社交媒体网站)上的私有资源,而无需共享用户的登录凭证。在Django框架中实现OAuth2.0...

Global site tag (gtag.js) - Google Analytics