在很多场景下我们需要用户在微信内打开网页时获取用户的openid并做对应的业务处理,因为openid对同一个公众号是唯一的,所以可以根据openid实现诸如投票,抽奖,注册等等的业务,那么如何获取用户的openid呢,根据微信官方提供的网页授权接口可以分为两种情况,一种是只获取用户的openid另一种是获取用户的基本信息(包括用户的昵称、性别、头像等)。下面分别就这两种情况来介绍一下。

  先说第一种情况,只获取用户的opid,这种情况是无需用户授权的,也成为静默授权,需要经历数次网页跳转,时序图如下。

获取微信用户openid时序图

下面给出PHP代码示例(代码中的CODEURL、OPENIDURL以及其他常量配置信息请自行更换为正确的配置)

//获取用户openid 为避免重复请求接口获取后应做存储
function getOpenId(){
 if(isset($_SESSION['openid'])){
	return $_SESSION['openid'];
 }else{
	//1.用户访问一个地址 先获取到code
	if(!isset($_GET['code'])){
		//构建回调地址为当前地址
		$redurl = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
		$url = self::CODEURL . "appid=" .self::APPID ."&redirect_uri={$redurl}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
		//响应跳转请求
		header("location:{$url}");exit;
	}else{
		//2.根据code获取到openid
		//调用接口获取openid
		$openidurl = self::OPENIDURL . "appid=" . self::APPID . "&secret=".self::SECRET . "&code=" . $_GET['code'] . "&grant_type=authorization_code";
		$data = file_get_contents($openidurl);
		$arr = json_decode($data,true);
		$_SESSION['openid'] = $arr['openid'];                
		return $_SESSION['openid'];
	}
 }
}
//配置参考
const CODEURL = 'https://open.weixin.qq.com/connect/oauth2/authorize?';
const OPENIDURL = 'https://api.weixin.qq.com/sns/oauth2/access_token?';

如果要获取用户基本信息的时序图如下:

获取微信用户基本信息

我们会看到在请求获取code的时候模式不一样,获取到用户的openid(其实还有access_token等信息)后,另外多了一次使用access_token调用微信的接口来拉取用户信息。在请求获取code时scope这个参数需要修改为snsapi_userinfo,拉取用户信息的地址格式如下:

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

另外如果要获取用户的基本信息是需要用户授权的,也就是在请求获取code这个步骤中需要用户授权确认,但是如果用户关注了公众号 在公众号内点击地址进入的话也不需要授权,是静默模式。