首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >整合ThinkPHP功能系列之微信网页OAuth2.0授权登录

整合ThinkPHP功能系列之微信网页OAuth2.0授权登录

作者头像
沈唁
发布2018-07-26 18:01:17
1.1K0
发布2018-07-26 18:01:17
举报
文章被收录于专栏:沈唁志沈唁志

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用

越来越多的平台支持用户使用微信进行授权第三方登录,在顺应这个联合登录的趋势的同时,也有越来越多的平台选择使用微信的授权登录

今天就来说一下微信授权登陆的操作,微信授权登录有两种,一是点击授权登陆,二是静默授权,但是两者的权利不一样,能获取到的数据也是不一样的

点击授权登录

需要登录时,页面跳转到授权页面,也就是我们经常看到的绿色授权页面,用户授权后可从微信拿到openid、unionid

静默授权

静默授权下,不需要跳转页面让用户确认授权,而是直接授权用户登录,但是静默授权只能拿到用户的openid和unionid,无法拿到用户的微信头像、微信名称等个人信息

我们这里主要模拟在微信公众号中使用OAuth2.0进行授权,获取用户的基本信息的过程。详细的开发文档可查看微信的官方文档

微信授权使用的是OAuth2.0授权的方式,主要有以下简略步骤:

第一步:用户同意授权,获取code

第二步:通过code换取网页授权access_token

第三步:刷新access_token(如果需要)

第四步:拉取用户信息(需scope为 snsapi_userinfo)

下面是具体操作

首先判断用户是否登陆过,没有登录开始申请授权

public function _initialize(){
    // 验证用户是否登录
    $userId = S('userId');
    if(!$userId){
        //获取当前网页,授权后返回
        $callBackUrl = urlencode(__SELF__);

        // 微信用户
        $wechat = C('WECHAT');
        $appid = $wechat['appid'];
        $redirect_uri = urlencode ('http://'.$_SERVER['HTTP_HOST'].'/Login/authCallback?mid='.S('mid').'&CallbackUrl='.$callBackUrl);
        $url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid={$appid}&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect";
        header("Location:".$url);
        exit(0);
    }
}

用户授权跳转到回调网址后,我们根据获取到code换取网页授权access_token

public function authCallback($code)
{
    $wechat = C('WECHAT');
    $appid = $wechat['appid'];
    $secret = $wechat['appKey'];

    // 获取用户授权信息
    $authInfo = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$secret}&code={$code}&grant_type=authorization_code";
    $authInfo = $this->getJson($authInfo);

    //第二步:根据全局access_token和openid查询用户信息
    $access_token = $authInfo["access_token"];
    $openid = $authInfo['openid'];
    if(!$openid){
        $this->error('授权失败,稍后请重试!');
    }

    // 根据用户openid查看用户是否存在
    $user = M('User')->where("wx_openid = '%s '",$openid);

    // 存在则直接登录
    if($user){
        $callBackUrl = urldecode(I('get.CallbackUrl'));
        S('userId', $user['id']);
        header("Location:".'http://'.$_SERVER['HTTP_HOST'].$callBackUrl);
        exit(0);
    }

    // 存储openid 进行注册
    S('wx_openid', $openid);
    // ...省略

    // 获取用户微信信息
    $getWxInfourl = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openid}&lang=zh_CN";
    $wxUserInfo = $this->getJson($getWxInfourl);
    S('userInfo', $wxUserInfo);
    header('Location:'.U('/login/login'));
    exit(0);
}

获取网页授权access_token和openid后拉取用户信息,保存在数据库中,完成业务逻辑即可

拉取用户信息的时候,请求的链接返回的是如下json数据

{
    "openid":" OPENID",
    " nickname": NICKNAME,
    "sex":"1",
    "province":"PROVINCE",
    "city":"CITY",
    "country":"COUNTRY",
    "headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
    "privilege":[ "PRIVILEGE1" "PRIVILEGE2"],
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

所以我们封装一个curl去请求该链接

protected function getJson($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);

    return json_decode($output, true);
}

好了,收工,如果有错误的话查看一下对应的错误码

沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:整合ThinkPHP功能系列之微信网页OAuth2.0授权登录

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 点击授权登录
  • 静默授权
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档