微信OAuth2.0网页受权获取用户基本信息同时获取关注公众号的状态

最近一个项目涉及到一些微信方面的开发,填了一个小坑。采用OAuth2.0网页受权获取的用户基本信息是不需要事先关注公众号的,但有时候我们又需要知道用户是否关注公众号的状态,如果没有关注,则鼓励提示用户关注。

我们知道要获取用户的关注状态,应该用普通接口
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID
要获得其中的ACCESS_TOKEN,事先用普通接口获得
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
而OPENID则是通过关注该公众号,通过菜单或自动回复等方式获得的。但是如果用户没有关注该公众号,就没有途径赋予他OPENID

而用OAuth2.0网页受权可以在不关注公众号的前提下就获得OPENID,但同时获得的ACCESS_TOKEN却是不能在普通接口使用的。因此解决问题的钥匙就是用普通接口获取一次ACCESS_TOKEN,再用OAuth2.0网页受权获取OPENID,最后再用普通接口获取用户的关注状态以及基本信息(绕个大圈子)。

思路理清后就很好解决了,直接上代码:

$appid="*****";
$appsecret = "***********";
$currentURL='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 
if (isset($_GET['code'])){
	$code=$_GET['code'];
}else{
	$url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".$currentURL."&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
	Header( "Location: ".$url );
}
 
function getPortData($url){//请求函数
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // https请求 不验证证书和hosts
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
	curl_setopt($ch, CURLOPT_URL, $url); //定义表单提交地址
	curl_setopt($ch, CURLOPT_POST, 0);   //定义提交类型 1:POST ;0:GET
	curl_setopt($ch, CURLOPT_HEADER, false); //定义是否显示状态头 1:显示 ; 0:不显示
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//定义是否直接输出返回流
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	$r = curl_exec($ch);
	$r = json_decode($r);
	if($error=curl_error($ch)){
		die($error);
	}
	curl_close($ch);
	return $r;
}
 
//OAuth2.0获取OpenID
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$appsecret."&code=".$code."&grant_type=authorization_code";
$r = getPortData($url);
$user_openid = $r->openid;
 
//普通接口获取ACCESS_TOKEN
$url2 = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
$r = getPortData($url2);
$user_access_token = $r->access_token;
 
$url3 = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$user_access_token."&openid=".$user_openid ;
$r = getPortData($url3);
//var_dump($r);
 
echo $r->subscribe;

最后$r->subscribe就是用户是否关注该公众号的状态了,绕了老半天就为了获取这个0或1,腾讯你也太绕了…

最后提醒,本文只适用于开放了高级接口(认证)后的服务号,不适用于订阅号,但如果要在认证订阅号中实现此功能,可以用服务号进行OAuth2.0网页受权,同时需在微信开放平台中统一认证号和服务号的OPENID。

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/1557.html。百度不可信,搜索请谨慎。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以获取本文的最新版本。

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

发表评论

电子邮件地址不会被公开。 必填项已用*标注