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);
}
好了,收工,如果有错误的话查看一下对应的错误码
发表评论
沙发空缺中,还不快抢~