当前位置: 首页 > 后端技术 > PHP

微信网页授权获取用户信息

时间:2023-03-30 03:27:08 PHP

首先需要说明的是,网页授权需要公众号为服务号,完成认证。微信开发文档网页授权分为四步:第一步:用户同意授权,获取code2。第二步:网页授权access_token、openid3的交换码。Step3:刷新access_token(如果需要)4.Step4:Pull获取用户信息(要求scope为snsapi_userinfo)snsapi_base:第二步结束,获取openid,其他操作都以此为基础(比如记录用户的访问时间)information)snsapi_userinfo:获取openid和用户信息(昵称、头像、国家、省份、城市、性别、权限)这里主要是微信后台配置的snsapi_userinfo方式登录微信公众平台后,点击左侧菜单:设置→公众号设置点击第二个功能设置点击设置业务域名、JS接口安全域名、网页授权域名配置域名,直接填写你绑定配置的域名即可。二、授权码1、用户授权获取码$redirect_uri=urlencode('http://你的域名/getUserInfo.php');url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_base&state=1#wechat_redirect";this->redirect(this->redirect(url,302));2.接收code获取用户信息//get用户信息publicfunctiongetUserInfo(){code=code=_GET['code'];if(empty(code))code))this->error('Authorizationfailed');//获取openid和access_token1url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=url="https://api.weixin.qq.com/sns/oauth2/accesstoken?appid=this->appId&secret=$this->appSecret&code=$code&grant_type=authorization_code";$curl=newCurl();$curl->setOpt(CURLOPT_SSL_VERIFYPEER,false);$curl->setOpt(CURLOPT_SSL_VERIFYHOST,false);curl->get(curl->get(url);djson=djson=curl->响应;rjson=json_decode(rjson=jsondecode(djson,true);openId=openId=rjson['openid'];//获取openidaccess_token1=accessttoken1=rjson['access_token'];//获取基础用户信息userUrl="https://api.weixin.qq.com/sns/userinfo?access_token=userUrl="https://api.weixin.qq.com/sns/userinfo?accesstoken=access_token1&openid=$openId&lang=zh_CN";$curl=newCurl();$curl->setOpt(CURLOPT_SSL_VERIFYPEER,false);$curl->setOpt(CURLOPT_SSL_VERIFYHOST,false);curl->get(curl->get(userUrl);ujson=ujson=curl->response;result=json_decode(result=jsondecode(ujson,true);//获取publicaccess_tokenaccess_token=accessttoken=this->getSessionAccessToken();//获取用户是否关注(详细用户信息)userInfoUrl="https://api.weixin.qq.com/cgi-bin/user/info?access_token=userInfoUrl="https://api.weixin.qq.com/cgi?bin/user/info?accesstoken=access_token&openid=$openId&lang=zh_CN";$curl2=newCurl();$curl2->setOpt(CURLOPT_SSL_VERIFYPEER,false);$curl2->setOpt(CURLOPT_SSL_VERIFYHOST,false);curl2->get(curl2?>get(userInfoUrl);uujson=uujson=curl2->response;uujson=json_decode(uujson=jsondecode(uujson,true);result['subscribe']=result['subscribe']=uujson['subscribe'];//判断用户是否关注if($result['subscribe']==1){session('ys_monopoly_user',$result);$this->redirect('login');}else{$this->redirect('getQrcode');}}通用access_token的获取和缓存//获取access_tokenpublicfunctiongetSessionAccessToken(){if(session('wx_access_token')&&session('expire_time')>time()){returnsession('wx_access_token');}else{//获取通行证使用的access_token不是网页授权的access_token$access_token_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";$curl1=newCurl();$curl1->setOpt(CURLOPT_SSL_VERIFYPEER,false);$curl1->setOpt(CURLOPT_SSL_VERIFYHOST,false);curl1->get(curl1?>get(access_token_url);ajson=ajson=curl1->response;ajson=json_decode(ajson=jsondecode(ajson,true);//dump($ajson);die;access_token=accesstoken=ajson['access_token'];session('wx_access_token',$access_token);session('expire_time',time()+6000);return$access_token;}}//获取access_tokenpublicfunctiongetSessionAccessToken(){if(session('wx_access_token')&&session('expire_time')>time()){returnsession('wx_access_token');}else{//获取非网页授权的通用access_tokenaccess_token$access_token_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";$curl1=newCurl();$curl1->setOpt(CURLOPT_SSL_VERIFYPEER,false);$curl1->setOpt(CURLOPT_SSL_VERIFYHOST,false);curl1->get(curl1->get(access_token_url);ajson=ajson=curl1->response;ajson=json_decode(ajson=jsondencode(ajson,true);access_token=accesstoken=ajson['access_token'];//将通用的access_token存入缓存session('wx_access_token',$access_token);session('expire_time',time()+6000);return$access_token;}}注:同一个access_token需要统一缓存如果access_token是在不同模块下获取的,获取到新的access_token后,之前的access_token会失效,即使在有效期内也是如此。如果您觉得这篇文章对您有用的话,请给我们的开源项目点个star:http://github.crmeb.net/u/defu非常感谢!