微信网站一般是先要微信网页授权后获取到access_token,才有资格获取用户信息的,所以如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。
第一步是先获取用户授权(具体的请看微信开发者文档):
授权也分两种:静态授权和手动授权:
关于网页授权的两种scope的区别说明
1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
1 /** 2 * 网页授权获取用户openid(静默授权) 3 */ 4 public function getOpenid($code){ 5 $url = ‘https://api.weixin.qq.com/sns/oauth2/access_token?appid=‘. Wxapi::APPID . ‘&secret=‘ . Wxapi::APPSECRET . ‘&code=‘ . $code . ‘&grant_type=authorization_code‘; 6 $result = json_decode($this->CurlGet($url),true); 7 return $result; 8 }
请参考文档来理解:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
1 /** 2 * 网页授权获取用户基本信息(手动同意) 3 */ 4 public function getUserInfo($code,$refresh_token){ 5 if(!empty($code)){ 6 //code换取网页授权access_token 7 $url = ‘https://api.weixin.qq.com/sns/oauth2/access_token?appid=‘. Wxapi::APPID . ‘&secret=‘ . Wxapi::APPSECRET . ‘&code=‘ . $code . ‘&grant_type=authorization_code‘; 8 $result = json_decode($this->CurlGet($url),true); 9 }else if(!empty($refresh_token)){ 10 //刷新access_token 11 $url = ‘https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=‘ . Wxapi::APPID . ‘&grant_type=refresh_token&refresh_token=‘ . $refresh_token; 12 $result = json_decode($this->CurlGet($url),true); 13 if(!empty($result[‘errcode‘])){ 14 $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . Wxapi::APPID . "&redirect_uri=" . $redirect_uri . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";//refresh_token过期失效重新授权 15 header("Location:$url");//跳转授权页面 16 } 17 }else{ 18 return array(‘errcode‘ => ‘???‘,‘errmsg‘ => ‘请传入code或refresh_token‘); 19 } 20 21 //错误返回处理 22 if(!empty($result[‘errcode‘])){ 23 return $result; 24 }else{ 25 //拉取用户信息 26 $url = ‘https://api.weixin.qq.com/sns/userinfo?access_token=‘ . $result[‘access_token‘] . ‘&openid=‘ . $result[‘openid‘] . ‘&lang=zh_CN‘; 27 $user_info = json_decode($this->CurlGet($url),true); 28 $user_info[‘refresh_token‘] = $result[‘refresh_token‘]; 29 30 return $user_info; 31 } 32 }