php版微信实现登录授权的实例

用户授权也是高级接口那部分内容,只是把它独立出来,这样让整个微信框架条理清晰些,但我们用它首先要在微信后台设置OA2的URL,这里的URL和教程一的有所不同。它是不带http://开头的域名。
首先登陆你的微信后台找到《开发者中心》:

点击修改填入我们的域名如下格式:

好了,最基本要点的OA2要求搞好,下面我们用个WechatAuth类生成一个OA2的URL格式,然后再从服务号里,以链接或者菜单又或者图文,跳到微信内置的WEB里就实现了我们取openid或者授权取用户消息!

例子代码生成snsapi_base或者snsapi_userinfo:
$auth = new WechatAuth(array(
        WechatAuth::APP_ID => 'wx32259fc5sd5aac12B',
        WechatAuth::APP_SECRET => '7ef73d3c56fcd0d984862ff217d2c648',
    ));
    $url = $auth->getLoginUrl(array(
        'redirect_uri' => 'http://www.demo.com/wp/ken',
        'scope' => 'snsapi_userinfo' //snsapi_base
    ));
    echo $url;

执行后,我们会得到如下OA2的URL:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx32259fc5d5aac13d&redirect_uri=http%3A%2F%2Fwww.demo.com%2Fwp%2Fken&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirects

然后我们在服务号里以刚才说到的菜单好,链接好 点击转到微信内置的浏览器里,如果你的scope方式为snsapi_userinfo时会弹出授权界面,base时不会弹默认执行后会返回openid:

好了,OA2无非就是让我们生成特定格式的URL,让我们点过去取openid或者用户信息(无论是否关注了你的服务号,只要确认授权),可以运用本站微信的实例有相关OA2的运用或者留言给我!
WechatAuth类:

<?php
/**
 * 微信 OAuth2.0授权接口
 * Class WechatAuth
 */
class WechatAuth {
 
    const
        JSON = 'json',
        POST = 'post',
        GET = 'get',
        APP_ID = 'appid',
        APP_SECRET = 'secret',
        API_URL_PREFIX = 'https://api.weixin.qq.com/sns';
 
    public
        $_error_number = 0,
        $_error,
        $_APPID,
        $_APPSECRET;
 
    protected
        $_cache = array(),
        $_options,
        $_openid,
        $_access_token,
        $_refresh_token,
        $_timeout = 30;
 
    static protected
        $_instance;
 
    /**
     * 单例模式
     * @param array $options
     * @return WechatAuth
     */
    static public function getInstance(array $options = array()) {
        if (empty(self::$_instance)) {
            self::$_instance = new WechatAuth($options);
        }
 
        return self::$_instance;
    }
 
    /**
     * @param array $options {WechatAuth::APP_ID:"", WechatAuth::APP_SECRET:""}
     */
    public function __construct(array $options = array()) {
        $this->_options = array(
            'timeout' => $this->_timeout,
        );
        $_options = array_merge($this->_options, $options);
        $this->_APPID = $_options['appid'];
        $this->_APPSECRET = $_options['secret'];
        $this->_timeout = $_options['timeout'];
    }
 
    /**
     * 提交请求
     * @param $url
     * @param array $params
     * @param string $type Webchat_API::POST|Webchat_API::GET
     * @return bool|mixed
     */
    public function request($url, $params = array(), $type = self::POST) {
        $ch = curl_init();
        if ($type == self::GET) {
            $url = $url.'?'.http_build_query($params);
        }
        curl_setopt_array($ch, array(
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => $this->_timeout,
            CURLOPT_USERAGENT => 'wordpress_wechat_client/0.1.'.rand(1,6),
            CURLOPT_HEADER => 0,
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_SSL_VERIFYPEER => 0,
            CURLOPT_SSLVERSION => 3,
//            CURLOPT_VERBOSE => 1,
        ));
        if ($type == self::POST) {
            curl_setopt($ch, CURLOPT_PORT, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        }
        if ($type == self::JSON) {
            //微信的破接口竟然不支持unicode转义符,违反JSON协定,只能把JSON字符中的unicode转回来
            $data = preg_replace('/\\\\u([a-f0-9]{4})/e', "json_decode('\"$0\"', 1)", json_encode($params));
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
        }
        $res = curl_exec($ch);
        $this->_error_number = curl_errno($ch);
        $this->_error = curl_error($ch);
        curl_close($ch);
 
        if ($this->_error_number) {
            return false;
        }
        return $this->parseResult($res);
    }
 
    /**
     * 处理返回结果
     * @param $res
     * @return bool|mixed
     */
    protected function parseResult($res) {
        $res = json_decode($res, true);
        if (!empty($res)) {
            if (isset($res['errcode']) && $res['errcode']) {
                $this->_error_number = $res['errcode'];
                $this->_error = $res['errmsg'];
                return false;
            }
 
            return $res;
        }
 
        return false;
    }
 
    /**
     * 获取当前URL
     * @return string
     */
    static public function getCurrentUrl() {
        $pageURL = 'http';
        if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if (isset($_SERVER['SERVER_PORT']) && $_SERVER["SERVER_PORT"] != "80") {
            $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
        } else {
            if(isset($_SERVER["SERVER_NAME"]) && isset($_SERVER["REQUEST_URI"]))
                $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
        }
        return $pageURL;
    }
 
    /**
     * 获取访问token
     * @param bool $refresh 是否强制刷新
     * @return bool|mixed
     */
    public function getAuthAccessToken($refresh = false) {
        $code = isset($_GET['code']) ? $_GET['code'] : '';
        $state = isset($_GET['state']) ? $_GET['state'] : '';
        $cache = $this->cache('auth_access_token');
        if ($cache && ! $refresh) {
            return array('access_token' => $cache, 'code' => $code, 'state' => $state);
        }
        $res = $this->request(self::API_URL_PREFIX.'/oauth2/access_token', array(
            self::APP_ID => $this->_APPID,
            self::APP_SECRET => $this->_APPSECRET,
            'code' => $code,
            'grant_type' => 'authorization_code',
        ), self::GET);
        if ($res) {
            $this->cache('auth_access_token', $res['access_token']);
            $this->cache('auth_refresh_token', $res['refresh_token']);
            $this->cache('auth_openid', $res['openid']);
        } else {
            if ($this->_error_number == 42001) {
                return $this->refreshAccessToken();
            }
        }
       return array('access_token' => $res['access_token'], 'code' => $code, 'state' => $state);
    }
 
    /**
     * 刷新访问token
     * @return mixed
     */
    public function refreshAccessToken() {
        $code = isset($_GET['code']) ? $_GET['code'] : '';
        $state = isset($_GET['state']) ? $_GET['state'] : '';
        $cache = $this->cache('auth_refresh_token');
        if ($cache) {
            $this->_refresh_token = $cache;
        }
 
        $res = $this->request(self::API_URL_PREFIX.'/oauth2/refresh_token', array(
            self::APP_ID => $this->_APPID,
            'refresh_token' => $this->_refresh_token,
            'grant_type' => 'refresh_token',
        ), self::GET);
 
        if ($res) {
            $this->cache('auth_access_token', $res['access_token']);
            $this->cache('auth_refresh_token', $res['refresh_token']);
            $this->cache('auth_openid', $res['openid']);
        }
        return array('access_token' => $res['access_token'], 'code' => $code, 'state' => $state);
    }
 
    /**
     * 获取用户信息
     * @param bool $refresh 是否强制刷新
     * @return bool|mixed
     */
    public function getUserInfo($refresh = false) {
        $this->_access_token = $this->getAuthAccessToken($refresh);
        $cache =  $this->cache('auth_openid');
        if ($cache) {
            $this->_openid = $cache;
        }
 
        $res = $this->request(self::API_URL_PREFIX.'/userinfo', array(
            'access_token' => $this->_access_token,
            'openid' => $this->_openid,
        ), self::GET);
 
 
        if ($res) {
            return $res;
        }
 
        return false;
    }
 
    /**
     * 获取用户授权地址
     * @param array $options
     * @return string
     */
    public function getLoginUrl($options = array()) {
        $_options = array(
            self::APP_ID => $this->_APPID,
            'redirect_uri' => self::getCurrentUrl(),
            'response_type' => 'code',
            'scope' => 'snsapi_base', //snsapi_base | snsapi_userinfo
            'state' => 'STATE',
        );
        $params = array_merge($_options, $options);
 
        return 'https://open.weixin.qq.com/connect/oauth2/authorize?'.http_build_query($params).'#wechat_redirects';
    }
 
    /**
     * 缓存接口Session实现
     * @param $key 缓存索引key
     * @param null $value 缓存值
     * @return bool|mixed
     */
    public function cache($key, $value = null) {
        if (!session_id()) {
            session_start();
        }
        if (empty($value)) {
            if (isset($_SESSION[$key])) {
                return $_SESSION[$key];
            }
            return false;
        }
        $_SESSION[$key] = $value;
        return false;
    }
}

时间: 2024-09-19 17:16:10

php版微信实现登录授权的实例的相关文章

asp.net版微信网页登录授权,获取用户信息例子

asp.net版微信网页登录授权必须要是微信公众号并且类型为"服务号" 首先大家要看下微信的API文档. 微信网页授权,获取用户的微信官方API文档地址: http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 微信认证流程: 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果需要) 4 第四步:拉取用户信

php版微信自动登录并获取昵称的方法_php实例

本文实例讲述了php版微信自动登录并获取昵称的方法.分享给大家供大家参考,具体如下: 微信自动登录并获取昵称是可以通过api接口来获取的也是通过微信开放的接口来实现了,下面我们一起来看一个例子 仅记录:微信获取昵称自动登录 经过反复几次验证,发现我这个方法有缺陷: 微信内 未关注进入网站,无法获得昵称. 关注后用我这个方法可以获得昵称. 是否是因为第一次生成openid 所以还未生成昵称?待测试. /** * 获取当前页面完整URL地址 */ function get_url() { $sys_

微信开发笔记——微信网页登录授权,获取用户信息

原文:微信开发笔记--微信网页登录授权,获取用户信息 微信网页授权,获取用户的微信官方API文档地址:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 三次握手微信认证流程(我自己简称三次握手): 1.用户同意授权,获取code 2.通过code换取网页授权access_token,用户openId等信息 3.通过access_token和用户的openId获取该用户的用户信息 思路: 经过研究,我这边的思

PHP版微信小店接口开发实例_php技巧

本文实例讲述了PHP版微信小店接口开发方法.分享给大家供大家参考,具体如下: 首先 大家可以去下一份小店开发的 API接口 因为 下面所有的 微信小店接口 数据格式 参数 API手册 里面都有现成的 你可以直接拿来用 好了 下面上代码 这里给大家 下载微小店 API文档 这里就先拿查询商品作为例子 //首先第一步是 获取access_token的代码 我这里呢 对token做了存表里的 因为token有限制 private function access_token(){ appid=shopa

php版微信公共平台开发者认证实例

微信公众平台如何成为开发者? 登录微信公众平台后,点击高级功能=>开发模式=>成为开发者=>填写接口配置信息,提交后等待我司工作人员的审核. 1.开发者认证 这个最简单了,直接上个超简单版代码:  代码如下 复制代码 exit($_GET['echostr']); php文件就写上面这一句就行,微信公共平台随便填写token,写上php文件的url,然后验证即可通过.超级简单吧?官方的认证根本没有必要,因为后面的步骤没有使用的验证签名的地方,所以这个地方为了图方便直接输出返回值轻松通过验

php版微信JS-SDK地理位置取街景实例

根据<微信JS-SDK地理位置接口例子>中的QQMapModel和ImageCacheModel类进行扩展.看了下腾讯地图有个静态图的V2版,我顺便也加上去,继续围绕腾讯地图把取街景的接口写上.由于是Demo,像取街景有几个参数可以自行定义,我只用默认!不多说看码吧 QQMapModel.class.php: (注:API_KEY 用QQ在官方申请,目前免费) <?php namespace Home\Model; class QQMapModel {     const        

PHP版微信公众平台红包API_php实例

重写了一下PHP下面的微信API接口, 微信红包支持,JSAPI的动态参数接口支持 http://git.oschina.net/youkuiyuan/yky_test/blob/master/class/wxapi.class.php 微信API类 - 增加红包支持 <?php /******************************************************** * @author Kyler You <QQ:2444756311> * @link htt

PHP版微信第三方实现一键登录及获取用户信息的方法_php技巧

本文实例讲述了PHP版微信第三方实现一键登录及获取用户信息的方法.分享给大家供大家参考,具体如下: 注意,要使用微信在第三方网页登录是需要"服务号"才可以哦,所以必须到官方申请. 一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名 前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可以

php版微信公众账号第三方管理工具开发简明教程_php实例

本文讲述了php版微信公众账号第三方管理工具开发方法.分享给大家供大家参考,具体如下: 最近在捣鼓微信公共平台提供的API,等确实一个获取用户信息的API. 所以没有办法,只能自己去获取,手动填写当然可以解决问题,当然编程不就是为了让生活变的更简单么? 当然,远程抓取微信公共平台数据的想法就油然而生,当然第一个想到了CURL. CURL可以远程提交表达,我感觉微信是提议让我们怎么的,只要不是恶意刷接口,就不会出现验证码. 主要注意的几个问题: ① 远程登录接口是时候的HTTPS协议. ② 登录成