还是代码好用,几步就能判断用户是否已关注公众号(怎么判断是否关注公众号)

网友投稿 1372 2022-10-05

还是代码好用,几步就能判断用户是否已关注公众号(怎么判断是否关注公众号)

还是代码好用,几步就能判断用户是否已关注公众号(怎么判断是否关注公众号)

现在的活动,很多都引导用户关注公众号,才能参与活动,如何判断用户是否已关注公众号,其实很简单,照着本文章,你就不会再犯愁了,本文的php代码很详细的解说了。

一、微信公众平台配置

1. 获取appid, appsecret,添加白名单

2. 添加网页授权

二、php后端实现

1. 获取全局token

此token有效期为2小时,可以暂存起来,过期后需要重新获取。PS: 项目中必须走同一个接口,否则容易互刷导致过期。

public static function getToken($appid, $appsecret){ $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret; return Curl::callWebServer($url);}正确返回结果: { "access_token": "ACCESS_TOKEN", "expires_in": 7200 } 返回结果参数说明: 参数 说明 access_token 获取到的全局token expires_in 凭证有效时间,单位:秒 错误返回结果: {"errcode": 40013, "errmsg": "invalid appid"} 返回结果参数说明: 返回码 说明 -1 系统繁忙,此时请开发者稍候再试 0 请求成功 40001 AppSecret错误或者AppSecret不属于这个公众号,请开发者确认 AppSecret的正确性 40002 请确保grant_type字段值为client_credential 40164 调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置。(小程序及小游戏调用不要求IP地址在白名单内。)登录后复制

2. 获取用户关联公众号的openid

分两步,先要获取到用户对公众号的授权码,然后拿这个码去获取临时access_token和openid。

获取用户授权码

public static function getCode($appId, $redirect_uri, $state=1, $scope='snsapi_base', $response_type='code'){ $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appId.'&redirect_uri='.$redirect_uri.'&response_type='.$response_type.'&scope='.$scope.'&state='.$state.'#wechat_redirect'; header('Location: '.$url, true, 301);}正确返回结果: 返回code码,并且跳转回调页面$redirect_uri 错误返回结果: {"errcode": 10003, "errmsg": "redirect_uri域名与后台配置不一致"} 返回结果参数说明: 返回码 说明 10003 redirect_uri域名与后台配置不一致 10004 此公众号被封禁 10005 此公众号并没有这些scope的权限 10006 必须关注此测试号 10009 操作太频繁了,请稍后重试 10010 scope不能为空 10011 redirect_uri不能为空 10012 appid不能为空 10013 state不能为空 10015 公众号未授权第三方平台,请检查授权状态 10016 不支持微信开放平台的Appid,请使用公众号Appid登录后复制

通过getCode获取到的code换取网页授权的access_token和openid

public static function getAccessToken($code, $appid, $appsecret, $grant_type='authorization_code'){ $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecret.'&code='.$code.'&grant_type='.$grant_type.''; return Curl::callWebServer($url);} 正确返回结果: { "access_token": "ACCESS_TOKEN", "expires_in": 7200, "refresh_token": "REFRESH_TOKEN", "openid": "OPENID", "scope": "SCOPE" } 返回参数说明 参数 描述 access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 expires_in access_token接口调用凭证超时时间,单位(秒) refresh_token 用户刷新access_token openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID scope 用户授权的作用域,使用逗号(,)分隔 错误返回结果: {"errcode":40029, "errmsg":"invalid code"}登录后复制

3. 获取用户信息

使用第2步中获取的openId和第1步中获取的token去获取用户信息

三、使用

判断是否关注过,此处为入口:

public function isConcern($appId, $appSecret) { $param = ''; // 如果有参数 $this->getCode($appId, U('callback', 'param='.$param), 1 ,'snsapi_base');}登录后复制

授权后回调

public function callback(){ $isconcern = 0; $code = $this->_get('code'); $param = $this->_get('param'); $appId = C('appId'); // config中配置 $appSecret = C('appSecret'); $accessTokenInfo = $this->getAccessToken($code, $appId, $appSecret); $openId = $accessTokenInfo['openid']; $accessToken = $accessTokenInfo['access_token']; $token = $this->getToken($appId, $appSecret); $userInfo = $this->getUserInfo($openId, $token['access_token']); if($userInfo['subscribe'] == 1){ $this->assign('userInfo', $userInfo); $isconcern = 1; // 已关注 } else { $isconcern = 0; // 未关注 } $this->assign('openid', $openId); $this->display('page');}登录后复制

此时页面上可以获取到userInfo和isconcern,isconcern为1时表示已关注公众号,否则未关注。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:bzoj 4408 [Fjoi 2016]神秘数
下一篇:bzoj 3551 [ONTAK2010]Peaks加强版
相关文章

 发表评论

暂时没有评论,来抢沙发吧~