专栏首页沈唁志整合ThinkPHP功能系列之微信网页OAuth2.0授权登录

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

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授权登录

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微信小程序调用接口获取登录获取用户信息

    沈唁
  • Composer进阶使用之版本约束表达式的使用

    例如我们想要下载5.1版本的ThinkPHP包,我们可以通过composer.json文件:

    沈唁
  • 详解Linux运维工程师必备技能

    沈唁
  • IM在企业市场开战 叫板微信企业号需要多大的勇气?

    很多时候大家都面对BAT这个对手都很头痛,更多的是无奈,不过还有一类是不怕死的,与其战死也不能被吓死,在中国开发者服务联盟(CDSA)成立大会上,融云CEO 韩...

    人称T客
  • Codeforces Round #550 (Div. 3) D. Equalize Them All(思维)

    版权声明:欢迎转载,若转载,请标明出处,如有错误,请指点,也欢迎大佬们给出优化方法 https://blog.csdn.net/Charles_Zaqd...

    Ch_Zaqdt
  • 【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了...

    冰河
  • TP5框架请求响应参数实例分析

    更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》...

    砸漏
  • 小程序:旧时代终结,新时代已至

    王洪涛 | 柚安米商学院院长 目前全球人口总数为75.24亿。其中,社交媒体活跃用户为30.28亿,占到全球人口的40%。这意味着,全球近一半的用户都在使用社交...

    企鹅号小编
  • 基于 Redis 实现简单限流器及其在路由中间件中的应用

    所谓限流器,指的是限制访问指定服务/路由的流量,通俗点说,就是限制单位时间内访问指定服务/路由的次数(频率),从系统架构角度看,通过限流器可以有效避免短时间内的...

    学院君
  • Netty粘包拆包解决方案

    前言 本篇文章是Netty专题的第六篇,前面五篇文章如下: 高性能NIO框架Netty入门篇 高性能NIO框架Netty-对象传输 高性能NIO框架Netty...

    猿天地

扫码关注云+社区

领取腾讯云代金券