微信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,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

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

  1. poker 757

    Hey there! Quick question that’s totally off topic. Do you know how
    to make your site mobile friendly? My site looks
    weird when viewing from my apple iphone. I’m trying to find a theme or plugin that might be able
    to resolve this issue. If you have any recommendations, please
    share. Thank you!

    回复

发表评论

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