之前的文章如下:

这篇文章记录基于公众号开发的网页如何获得用户授权并获取用户的信息

一、网页授权注意事项

1、获取方式

获取的方式是以snsapi_userinfo为scope发起的网页授权

至于两种方式(scope)的区别如下:

  1. 以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
  2. 以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

2、用户的access_token

这个access_token和上篇文章中拿到的access_token是不一样的,也不用保存,用完就失效了,微信给出的区别是:

  1. 微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
  2. 其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。

二、网页授权步骤

主要步骤如下:

  1. 第一步:用户同意授权,获取code
  2. 第二步:通过code换取网页授权access_token(用户的access_token)
  3. 第三步:拉取用户信息(需scope为 snsapi_userinfo)

1、发起授权,获得code

我们看到的微信授权的界面就是为了获得用户的code做准备。

postbird

接口如下:

想要获的用户的code授权,直接跳转到上面的链接就行,如果参数有问题,微信会提示相关参数的错误的问题。

2、得到code,获得access_token(用户的access_token)

接口如下:

返回值:

{
   "access_token":"ACCESS_TOKEN",
   "expires_in":7200,
   "refresh_token":"REFRESH_TOKEN",
   "openid":"OPENID",
   "scope":"SCOPE"
}

3、拉取用户信息

拉取用户信息需要上面的返回的openid和access_token

接口:

返回的用户信息如下:

解析json就可以获得相关的信息,进行保存即可。

{
   "openid":" OPENID",
   " nickname": NICKNAME,
   "sex":"1",
   "province":"PROVINCE"
   "city":"CITY",
   "country":"COUNTRY",
    "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", 
    "privilege":[
    "PRIVILEGE1"
    "PRIVILEGE2"
    ],
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

三、代码:

我从项目中截出来的代码,主要是接收跳转的code并拉取用户的信息

两个函数分别是 获得access_token和获取信息的

还有一个函数是刷新用户的access_token的,不过一般不会用到。

 //获取用户的access_token
    //通过code
    public function getUserAccessToken($code){
        /获取用户access_token/
        //通过code获得用户的access_token(这个access与上面的接口的token不同)
        //应该返回的json
        //{ "access_token":"ACCESS_TOKEN",
        // "expires_in":7200,
        // "refresh_token":"REFRESH_TOKEN",
        // "openid":"OPENID",
        // "scope":"SCOPE" }
        $getUserTokenUrl='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.C('APP_ID').'&secret='.C('APP_SECRET').'&code='.$code.'&grant_type=authorization_code';
        $userToken=file_get_contents($getUserTokenUrl);
        $userToken=json_decode($userToken,true);
        //var_dump($userToken);
        return $userToken;
    }
    //获取用户信息
    public function getUserInfo($userToken){
        //获取用户的信息/
        //正确时返回的JSON数据包如下:
        //{    "openid":" OPENID",
        // " nickname": NICKNAME,
        // "sex":"1",
        // "province":"PROVINCE"
        // "city":"CITY",
        // "country":"COUNTRY",
        // "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIfHe/46",
        //"privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],
        // "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
        //}
        $getUserInfoUrl='https://api.weixin.qq.com/sns/userinfo?access_token='.$userToken["access_token"].'&openid='.$userToken["openid"].'&lang=zh_CN ';
        $userInfo=file_get_contents($getUserInfoUrl);
        $userInfo=json_decode($userInfo,true);
        return $userInfo;
    }
    //刷新AccessToken
    //通过refreshToken
    public function refreshToken($userToken){
        //刷新access_token--通过返回的refresh_token
        //返回的格式和上面的accesstoken的返回格式一样
//        $refreshToken=$userToken['refreshToken'];
//        $refreshUserTokenUrl='https://api.weixin.qq.com/sns/oauth2/refresh_token?appid='.APP_ID.'&grant_type=refresh_token&refresh_token='.$refreshToken;
//        $userToken=file_get_contents($getUserTokenUrl);
//        $userToken=json_decode($userToken,true);

    }

四、效果

只能获取头像、昵称、地区、性别(0-未知、1-男,2-女)

postbird