微信网页授权登录分为四个步骤
1、第一步:用户同意授权,获取code
2、第二步:通过code换取网页授权access_token
3、第三步:刷新access_token(如果需要)
4、第四步:拉取用户信息(需scope为 snsapi_userinfo)
首先个人号可以使用测试账号进行开发,并且获取到appid和appsecret这两个参数
首先通过appid获取code
实例
<?php //获取code
public function auth() { //var_dump(1); //向微信服务器请求成功时 微信服务器回调的url地址, //并且会以get方式带上code参数,此url地址必须是外网可访问的
$redirect = urlencode("http://99d52e5a.ngrok.io/index.php/index/weixin/userinfo"); $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".Config::get("wx.appid")."&redirect_uri=".$redirect."&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"; header("Location:" . $url); //跳转url地址 }
运行实例 »
点击 "运行实例" 按钮查看在线实例
获取code之后,通过code参数及其他已有参数换取access_token,此access_token不是普通的access_token,普通的access_token是通过appid和secret参数获取的,它适用于其他接口的调用,获取用户信息时的access_token是通过code和其他参数获取的,这点一定要区分开。
实例
<?php //通过code 获取access_token 用于获取用户信息
public function auth_access_token($code) { $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".Config::get("wx.appid")."&secret=".Config::get("wx.appsecret")."&code=".$code."&grant_type=authorization_code"; //通过curl的get请求方式发起请求,请求成功返回的是json字符串 $json = $this -> curlRequest($url); //将json字符串转为数组处理 $arr = json_decode($json,true); //判断如果access_token不存在 则返回false if (!isset($arr['access_token'])){
return false; } //返回整个数组 , 此数组有access_token 和openid //注意:此access_token 不要做缓存,因为获取用户信息时是通过openid唯一确定用户的,每次都要从新获取
return $arr; }
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例
<?php //获取用户信息 public function userinfo() {
$code = input("get.code"); //回调成功后,接收code
$res = $this -> model -> auth_access_token($code); //通过code换取access_token //如果获取access_token不成功或者用户刷新导致code丢失,则重定向再次获取code
if(!$res){ header('Location:http://99d52e5a.ngrok.io/index.php/index/weixin/auth'); exit(); } $access_token = $res['access_token'];
$openid = $res['openid'];
$url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
$json = $this -> model -> curlRequest($url);
$arr = json_decode($json,true);
dump($arr); //至此,获取到用户信息 }