文档
微信官方文档https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
流程
- 1、引导用户进入授权页面同意授权,获取code
- 2、通过code换取网页授权access_token(与基础支持中的access_token不同)
- 3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
要点
- 1.
snsapi_base
的授权是静默的,但是该scope
得到的access_token
无法取得用户的具体信息 - 2.
snsapi_userinfo
的授权是需要要弹出授权允许框供用户测确认允许的的,该scope
得到的access_token
无法可以得用户的具体信息,比如头像
昵称
等。 - 3.微信官方在去年已经明确规定,用户隐私信息不返回或者置空返回。例如:
性别
地区
城市
等等。 4.其他微信接口需要的
access_token
非网页授权的,而是需要使用基础服务的access_token
。官方设定为公众号的全局唯一接口调用凭据。开发
需要的接口
- 微信网页授权链接
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
,用于取得微信授权code
。 取得授权凭证接口
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
,其中code
来自上个链接的回调,code
仅在回调 5 分钟内一次使用。{// 该接口正确返回的数据结构 "access_token":"ACCESS_TOKEN", // 授权凭证 "expires_in":7200, // 超时时间 "refresh_token":"REFRESH_TOKEN", // 刷新凭证 "openid":"OPENID", // 当前用户的openid "scope":"SCOPE" // 应用授权作用域 snsapi_base snsapi_userinfo }
取得用户信息接口
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
,用于取得用户基本信息。{ "openid": "OPENID", "nickname": "NICKNAME", "sex": 1, "province": "PROVINCE", "city": "CITY", "country": "COUNTRY", "headimgurl":"https://thirdwx.qlogo...", "privilege": ["PRIVILEGE1", "PRIVILEGE2"], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
实现
public function 登录方法() {
if((strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false)){
echo "<script>window.location.href='https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=回调地址response_type=code&scope=snsapi_base#wechat_redirect';</script>";exit;
}else{
echo '请使用微信浏览器登录';
exit;
}
}
public function 回调方法()
{
$response = $this->https_request("https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APP_SECRET&code=" . $_GET['code'] . "&grant_type=authorization_code");
$result_user = json_decode($response, true);
// refresh_token
$refresh_response = $this->https_request("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=" . $result_user['refresh_token']);
$refresh_result_user = json_decode($refresh_response, true);
//拉出用户信息
$openid = $this->https_request("https://api.weixin.qq.com/sns/userinfo?access_token=" . $refresh_result_user['access_token'] . "&openid=" . $refresh_result_user['openid'] . "&lang=zh_CN");
$result_userinfo = json_decode($openid, true);
// 用户信息
// [
// 'nickname' => $result_userinfo['nickname'],
// 'avatar' => $result_userinfo['headimgurl']
// ]
}