H5中获取微信用户资料的方式有两种,第一种是默认登录方式,即不需要弹出授权框,只会有一个“正在登录”的弹窗,这种方式获取到的数据仅限于该用户已经关注了对应公众号之后,如果是未关注公众号的用户只能获取到openid。那么针对这种情况,就需要使用授权登录来获取用户的资料,下面详细介绍的是此种方式。
1. 首先第一步在用户同意的情况下获取到code,其中scope字段代表授权方式,snsapi_base 默认授权即上面说的第一种默认登录方式,snsapi_userinfo 授权框 授权即在用户点击同意后获取昵称、头像等信息
var fromurl=location.href;
var url='https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的公众号appid3&redirect_uri='
+ encodeURIComponent(fromurl)
+'&response_type=code&scope=snsapi_userinfo&state=STATE%23wechat_redirect&connect_redirect=1#wechat_redirect';
//snsapi_userinfo 授权框 snsapi_base 默认授权
location.href=url;
2. 第二步使用第一步获取的code来获取openid和access_token,这里注意一下,授权的access_token和默认的登录方式中需要获取的access_token为两个token
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的公众号appid&secret=你的公众号appsecret&code=第一步获取的code&grant_type=authorization_code";
这里返回的结果有我们需要的token和openid
{ "access_token":"",
"expires_in":7200,
"refresh_token":"",
"openid":"",
"scope":"" }
3.第三步使用第二步获取到的openid和access_token来请求用户信息
$url = "https://api.weixin.qq.com/sns/userinfo?access_token=".刚请请求的token."&openid=".$刚请求的openid ."&lang=zh_CN"; //把accesstoken和openid放到接口中
返回的结果就是登录授权用户的基本微信信息了,如下
{"openid":"
"nickname":
"sex":
"province":
"city":
"country":
"headimgurl":
"privilege":
"PRIVILEGE1"
"PRIVILEGE2"
"unionid"
}
这个过程有一些地方需要注意,第一需要准备一个认证过的服务号,第二需要一个认证过超过24小时的域名,第三在服务号的功能设置中将域名加入到“JS接口安全域名”和“网页授权域名中”
另外token是有时间限制的,可以做一些过期的判断和处理,并且获取基本信息的过程中支持UnionID机制
最后贴上简单的PHP实现方式抛砖引玉
@$code = $_GET['code'];//前端传来的code值
$appid = "";
$appsecret = "";
//获取openid
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$appsecret&code=$code&grant_type=authorization_code";
$result = https_request($url);
$jsoninfo = json_decode($result, true);
@$openid = $jsoninfo["openid"];//从返回json结果中读出openid
@$access_token = $jsoninfo["access_token"];
$url_getinfo = "https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."&openid=".$openid ."&lang=zh_CN"; //把accesstoken和openid放到接口中
$result = https_request($url_getinfo); //请求info接口
$resultinfo = json_decode($result, true);
echo json_encode($resultinfo);
function https_request($url,$data = null){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
}