other|微信网页授权登陆开发示例
之前做过两次网页请求微信授权登陆,后来转到magento上面,主做国外的电商系统,导致这些开发经验都生疏了。为了后期在遇到同样问题的时候能够快速的找到解决方案,所以专门做个笔记,记录下来。
首先微信授权登陆和其他的qq授权登陆、微博授权登陆都是采用的OAUTH2.0机制,大体的逻辑原理和步骤都很类似。具体的分为三步,
1、根据APPID和回调地址等参数拼装请求的url,比较重要的就是appid,这个是在微信开放平台里面申请的网页应用,需要提交资质认证等。另外就是回调地址,这个必须和微信开放平台后台填写的授权域相同,不然则会提示错误,无法请求。
public function wxlogin(){
$AppID = C('WechatConfig')['AppID'];
$AppSecret = C('WechatConfig')['AppSecret'];
$callback = "http://".$_SERVER['HTTP_HOST'].U("User/auth");
$code=I('get.code');
$state = md5(uniqid(rand(), TRUE)).$code;
$_SESSION["wx_state"] = $state; //存到SESSION
$callback = urlencode($callback);
$wxurl = "https://open.weixin.qq.com/connect/qrconnect?appid=".$AppID."&redirect_uri={$callback}&response_type=code&scope=snsapi_login&state={$state}¶m=abc#wechat_redirect";
header("Location: $wxurl");
}
PS:值得一提的是,在微信开放后台的应用里面修改授权域,此授权域可以为本地测试的域名,不用非得
2、如果参数全都正确,就进入到扫描界面,等使用微信扫描确认之后,即可获取到一个code,有效期五分钟,然后可以使用此code去获取access_token和用户的openid以及unionid等信息,具体的方法可以参照下面代码:
public function getToken($code){
$AppID = C('WechatConfig')['AppID'];
$AppSecret = C('WechatConfig')['AppSecret'];
$url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$AppID.'&secret='.$AppSecret.'&code='.$code.'&grant_type=authorization_code';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$json = curl_exec($ch);
curl_close($ch);
$arr=json_decode($json,1);
if($arr['errcode']!=''){
return '';
}else{
session('access_token',$arr['access_token']);
session('openid',$arr['openid']);
return $arr;
}
}
public function getUserInfo($token,$openid){
$url='https://api.weixin.qq.com/sns/userinfo?access_token='.$token.'&openid='.$openid.'&lang=zh_CN';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$json = curl_exec($ch);
curl_close($ch);
$userinfo=json_decode($json,1);
if($userinfo['errcode']!=''){
return '';
}else{
return $userinfo;
}
}
3、最后特别说明一下,access_token有效期两个小时。然后需要先获取access_token,然后才能用该数据去获取用户的信息。另外还有一种情况,就是在pc端使用此方法没问题,但是如果是在微信客户端下,依旧是扫码界面,那就尴尬了。不过有一个客户的网站在pc端自动展示扫码界面,在微信客户端则自动提示公众号授权的界面,这个是配置方面的问题还是开发方面的具体还不清楚,略坑。最后为了以后的方便使用,封装一个第三方登陆的类,需要的直接引用即可。