整合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);
}

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

发表评论

发表评论

*

沙发空缺中,还不快抢~