微信开发的网页授权访问用户信息(2)
在微信官方账号配置过程中,很多开发者会在菜单中添加HTML5页面,有时需要访问页面的用户信息。此时,他们需要web授权来获取用户的基本信息。
我们提醒您,本文介绍的内容基于yii2.0框架。
1.设置授权回调域名:开发-界面权限。
找到“网页授权获取用户基本信息”,点击对应的“修改”,在弹出框响应位置填写授权回调域名。此处域名无需添加http://(网页授权回拨域名说明详见公共平台开发者文档)。
2.获得授权。
关于OAuth2.0博主参考http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html,一篇来自方贝工作室的博文(PS:方贝是微信开发大神,其中微信开发的内容比较详细,推荐参考),详细分析了微信官方文档的相关内容,提供了更详细的获取授权的思路和方案。
其实获取用户信息的关键是获取用户的openid。博主想实现用户可以通过点击微信官方账号菜单打开页面自动授权,从而为该用户操作数据库,所以有两种方式:
(1)使用自定义菜单请求授权页面。
一篇博文将在自定义菜单后单独撰写。在这里,我们将通过自定义菜单简要描述授权。这种方式需要高级界面权限,仅限于关注微信官方账号的用户直接从菜单进入页面。
$ menu=' { ' button ' :[{ ' type ' : ' view ',' name' :' mall ',' URL ' : ' https://open . weixin . QQ.com/connect/oauth/authorize?appid=xxxredirect _ uri=http://tx.heivr.com/index.phpresponse _ type=codescope=snsapi _ base state=#微信_ redirect'},{'name' :' express service ',Sub _ button ' :[{ ' type ' : ' click ',' name' :' send express ',' key' :' express'},{'type' 3360' click ',' name' :' express inquiry ',授权视图直接在网址填写微信提供的授权请求地址,其中:
Appid:填写微信公众平台基础配置中的appid;redirect _ uri:填写授权后要跳转的页面地址,即自己的html5页面;状态:跳转到回调页面的参数;response_type:网页授权的两种范围,在官方微信文档中描述如下:
1.以snsapi_base为作用域发起的网页授权,用于获取进入页面的用户的openid,并进行静默授权,自动跳转到回调页面。用户感知到的是直接进入回调页面(往往是业务页面)。
2.以snsapi_userinfo为作用域发起的网页授权用于获取用户的基本信息。但是这种授权需要用户手动同意,既然用户已经同意了,授权后就可以不用关注就可以获取用户的基本信息。按照这个方法,点击“商城”接收返回的openid,然后进行下一步获取用户信息。
(2)使用JS自动请求授权页面。
这种方法比较笨拙,步骤也略显复杂。但是目前还没有研究出一种简化的方法来解决这个需求,而且由于页面的跳转,大部分情况下访问页面的时间都会增加。然而,与以前的方法相比,该方法可以获得无关用户的基本信息。有些程序可能涉及页面共享,但其他用户通过共享直接进入页面时需要记录用户信息,所以此时可以考虑这种方式。(微信开发相关的代码博主打包成工具类调用。这里先贴用过的部分,全部贴完再贴,附下载链接)。
这个方法的思想是:js请求链接获取代码-交换代码为openid -获取用户的基本信息。
A.编辑配置。
为了将一些微信参数单独写入一个类,方便修改、添加和调用。
?phpnamespace常用\工具\微信;/*** 微信请求相关配置类库*/class ConfigTool {/***微信配置参数* @返回数组配置参数*/public函数setConfig() {//用于验证微信接口配置信息的令牌,可以任意填写$config['token']='自己的令牌;//appID$config['appid']='自己的appid ';//appSecret$config['secret']='自己的"秘密";//回调链接地址$ config[' redirect _ uri ']=' http://tx。海弗。com/index。PHP?//是否以HTTPS安全协议访问接口$ config[' https _ request ']=false;//授权作用域,snsapi_base(不弹出授权页面,直接跳转,只能获取用户openid)、//snsapi_userinfo(弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,//即使在未关注的情况下,只要用户授权,也能获取其信息)$ config[' scope ']=' snsapi _ user info ';//语言$ config[' lang ']=' zh _ CN ';//zh_CN简体,zh_TW繁体,en英语//微信公众账户授权地址$ config[' MP _ authorize _ URL ']='https://api.weixin.qq.com/cgi-bin/token';//微信公众账户射流研究…临时票据地址$ config[' jsapi _ ticket _ URL ']='https://api.weixin.qq.com/cgi-bin/ticket/getticket';//授权地址$ config[' authorize _ URL ']='https://open.weixin.qq.com/connect/oauth/authorize';//获取访问令牌的地址$ config[' access _ token _ URL ']='https://api.weixin.qq.com/sns/oauth/access_token';//刷新代币的地址$ config[' refresh _ token _ URL ']='https://api.weixin.qq.com/sns/oauth/refresh_token';//获取用户信息地址$ config[' user info _ URL ']='https://api.weixin.qq.com/sns/userinfo';//验证访问令牌$ config[' valid _ token _ URL ']='https://api.weixin.qq.com/sns/auth';//上传临时素材地址$ config[' media _ temp _ upload _ URL ']=' https://API。微信。QQ。com/CGI-bin/media/upload '?//上传永久素材地址$ config[' media _ forever _ upload _ URL ']=' https://API。微信。QQ。com/CGI-bin/material/add _ material '?返回$ config}}b. https请求工具
?phpnamespace公共\工具;/*** https请求相关类库*/class HttpToL { const time out=;//设置超时时间private $ ch/卷曲对象/*** 发送卷曲请求,并获取请求结果* @param字符串请求地址* @param数组如果是邮政请求则需要传入请求参数* @param字符串请求方法,去拿或者帖子,默认为get* @param bool是否以https协议请求*/public函数send_request($requests,$params=null,$method='get ',$https=true) {//以得到方式提交if($ method==' get '){ if($ params){ $ request=$ requests .$ this-create _ URL($ params);} else { $ request=$ requests } } else { $ request=$ requests } $ this-ch=curl _ init($ request);curl_setopt($this-ch,CURLOPT_RETURNTRANSFER,//设置不显示结果,储存入变量curl_setopt($this-ch,CURLOPT_TIMEOUT,self :超时);//设置超时限制防止死循环//判断是否以https方式访问if($ https){ curl _ setopt($ this-ch,CURLOPT_SSL_VERIFYPEER,//对认证证书来源的检查curl_setopt($this-ch,CURLOPT_SSL_VERIFYHOST,//从证书中检查加密套接字协议层加密算法是否存在}if ($method=='post') { //以邮政方式提交//curl_setopt($this-ch,CURLOPT_SAFE_UPLOAD,false);//php .文件上传必加内容,不需要curl_setopt($this-ch,CURLOPT_POST,);//发送一个常规的邮政请求curl_setopt($this-ch,CURLOPT_POSTFIELDS,$ params);//帖子提交的数据包curl_setopt($this-ch,CURLOPT_RETURNTRANSFER,} $ tmpInfo=curl _ exec($ this-ch);//执行操作if(curl _ errno($ this-ch)){ echo ' errno : ' .curl _ error($ this-ch);//捕抓异常} curl _ close($ this-ch);//关闭卷曲会话//var _ dump($ tmpInfo);退出;返回$ tmpInfo//返回数据}/*** 生成url*/public函数create_url($data) {$temp='?';foreach($ data as $ key=$ item){ $ temp=$ temp .$key .'=' .$项目.'';}返回substr($temp,-);}}关于curl_setopt($this-ch,CURLOPT_SAFE_UPLOAD,false)会在微信图片资源上传博文中详细讲述它出现的心酸史,这里暂时用不到,不做解释
c.授权基类
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)命名空间常用\工具\微信;使用常用\工具\微信\配置工具使用常用工具\ httptool/* * *微信_oauth类库*/class OauthTool { public $ conf;public function _ _ construct(){ $ re=new config tool;$ this-conf=$ re-setConfig();} /*** 生成用户授权的地址* @param字符串自定义需要保持的信息* @参数刺痛请求的路由* @param bool是否是通过公众平台方式认真*/public function authorize _ addr($ route,$state=' ',$ MP=false){ if($ MP){ $ data=[' appid '=$ this-conf[' appid '],' secret'=$this-conf['token'],' grant _ type '=' client _ credential '];$ URL=$ this-conf[' MP _ authorize _ URL '];} else { $ data=[' appid '=$ this-conf[' appid '],//公众号唯一标识重定向uri '=URL编码($ this-conf['重定向uri '].$route),//授权后重定向的回调链接地址response_type'='code ',//返回类型,此处填写代码作用域'=$this-conf['作用域'],//应用授权作用域state'=$state,//重定向后带上状态参数,开发者可以填写任意参数#微信_重定向'='' //直接在微信打开链接,可不填,做页面重定向时必须带此参数];$ URL=$ this-conf[' authorize _ URL '];} $ send=new HttpTool//var _ dump($ URL).$ send-create _ URL($ data));退出;返回$url .$ send-create _ URL($ data);}/*** 获取访问令牌* @param字符串用于换取访问令牌的代码,微信提供*/public function access _ token($ code){ $ data=[' appid '=$ this-conf[' appid '],' secret'=$this-conf['secret'],' code'=$code,' grant _ type '=' authorization _ code '];//生成授权URL $ URL=$ this-conf[' access _ token _ URL '];$ send=新的HttpsTool返回$send-send_request($url,$ data);}/*** 获取用户信息* @param字符串访问令牌* @param字符串用户的open id */public function userinfo($ token,$ OpenID){ $ data=[' access _ token '=$ token,' openid'=$openid,' lang '=$ this-conf[' lang '];//生成授权URL $ URL=$ this-conf['用户信息_ URL '];$ send=新的HttpsTool返回$send-send_request($url,$ data);}}d .授权基类调用及用户数据处理(在控制器调用前,先对用户数据存入或更新)
?phpnamespace微信\控制器\类;使用常用\工具\微信\ OauthTool使用通用\型号\用户;使用通用工具;/*** 微信用户基本信息获取*/class UserinfoClass {/***用户授权并获取代码* @返回字符串用户代码*/public函数getCode($route,$ state){ $ re=new OauthTool;$ request=$ re-authorize _ addr($ route,$ state);$code=isset($_GET['code'])?$_GET['代码']:"";返回[$request,$ code];}/*** 获取用户信息并写入数据库(之后加参数传给code)*/public function info($ code){ $ re=new OauthTool;//获取访问令牌$ access=$ re-access _ token($ code);$token=json_decode($access,true);//标题('内容类型:文本/html;charset=gbk ');//获取用户信息if(count($token)!=){ $ response=$ re-user info($ token[' access _ token '],$ token[' OpenID ']);$user=json_decode($response,true);//用户昵称转换//$user['昵称]=emo jitool : emo Ji _ trans($ user['昵称']);if($ model=user : find one([' open id '=$ user[' open id ']]){//用户已存在更新数据$ model-attributes=$ user;$ model-modify _ time=time();$ model-save(false);}else{ //用户不存在写入$model=新用户;$ model-attributes=$ user;$ model-create _ time=time();$ model-save(false);} }返回isset($model-id)?$ model-id : " ";}} e .控制器调用(这里只贴其中一个方法)
/*** 产品列表* @返回对象所有可用产品信息*/public function actionIndex(){//判断页面是否自动刷新if(isset($ _ GET[' state ']){ $ refresh=;} else { $ refresh=;}//获取用户代码$ user=new user infoclass $ request=$ user-GetCode(' r=store/index ',);//该用户userid $ userid=$ user-info($ request[]);$model=新产品;$ list=$ model-find()-其中([' status '=])-all();返回$this-render('index ',['list'=$list,' refresh'=$refresh,' userid'=$userid,' request '=$ request]);}程序要求用户打开产品列表即获取用户信息并存入数据库,其中设计了几个变量作用如下:
$refresh:判断页面是否刷新。由于第一次打开的页面没有经过oauth验证,它会自动请求验证,以避免重复刷新。这里以回调的状态参数作为判断依据,设置state=1(如果需要特定的参数,可以将state赋给需要的值)。
$request:这是验证请求的地址。
F.自动刷新视图。
只需将以下js代码添加到视图中。
脚本类型='text/javascript'//自动请求获取代码$(function(){var refresh=?=$ refresh?var请求='?=$ request[];';if(refresh==){ console . log();位置=请求;}});/script以上内容介绍了微信开发的网页授权获取用户信息(二)的全旁白。希望这篇文章能对你有所帮助。
版权声明:微信开发的网页授权访问用户信息(2)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。