最近一个项目涉及到一些微信方面的开发,填了一个小坑。采用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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。
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!