零,前言初学微信开发时,由于没有经验,微信官方文档不够清晰,后看文档,只有“”“捉瞎”,不知道微信开发的流程是怎样的,也不知如何下手,只好查第三方博客。后来终于完成了微信公众号与服务器的连接,实现了网页授权。而且,用户可以直接点击公众号下方的按钮自动获取OpenID登录,无需传统的手动登录。网页授权自动登录,也就是本文需要实现的功能。一、原理1、什么是网页授权?网页授权就是用户授权公众号,让开发者通过用户的唯一识别码(OpenID)获得用户的身份。通俗地说,就是用户向开发者提交一张“身份证”,让开发者知道用户当前访问的是谁。微信官方文档——网页授权二、使用网页授权的优势通常,用户直接访问开发者的服务器,获取服务器返回的数据。由于http协议是匿名的,在这种情况下,服务器并不知道用户当前访问的是谁,识别用户身份的唯一方法就是通过Cookie和Session。但由于Cookie的时效性,用户仍需手动登录。直连开发者服务器流程图:(图片来自梦云知软件开发团队ThinkPHP5.1入门教程)微信网页授权的好处是可以给每个微信账号分配一个唯一的识别码(即OpenID),通过这个识别码,微信服务器可以知道当前登录的用户是谁,然后把用户的信息告诉开发者的服务器,这样开发者就可以获取到用户的身份,并且可以实现用户在微信上的账号网站与用户微信账号绑定,以后用户通过微信登录网站时不再需要手动登录。连接微信服务器获取用户信息流程图:3、什么情况下可以使用网页授权?微信上的公众号有两种——订阅号和服务号。订阅号通常适用于个人(自媒体、学校小团体),服务号适用于企业。订阅号没有网页授权权限,服务号需要认证后才能使用网页授权。微信接口权限说明所以,只有订阅号的小伙伴才能洗漱睡觉。。。但是作为开发者,如果想尝试网页授权学习,可以申请一个微信测试号,里面有所有的微信账号。接口权限。申请接口测试号2.操作本文假设用户已经完成公众号与服务器的绑定,并设置好服务器地址。1.设置公众号的按钮刚创建公众号的时候,主页面是这样的,只有聊天框:我们希望是这样的:那么,如何定义这些按钮呢?微信给我们提供了一个很好的接口测试工具,我们可以使用这个工具来定义按钮。首先选择基础支持,获取AccessToken(这里是公众号的全局AccessToken,而不是网页授权的AccessToken)填写正确的APPID和Secret,下面返回的AccessToken的有效期为7200秒.复制这串字符,然后切换到自定义菜单查询界面,将刚才获取的token粘贴进去。如果这个公众号之前设置过按钮,会出现按钮的代码:{"menu":{"button":[{"name":"StudentMenu","sub_button":[{"type":"view","name":"学生主页","url":"http://awjdjsz.jincheng4917.cn/index/WxIndex/page","sub_button":[]},{"type":"view","name":"课程查询","url":"http://awjdjsz.jincheng4917.cn/index/WxIndex/course","sub_button":[]},{"type":"view","name":"分数查询","url":"http://awjdjsz.jincheng4917.cn/index/WxIndex/score","sub_button":[]},{"type":"view","name":"个人信息","url":"http://awjdjsz.jincheng4917.cn/index/WxIndex/info","sub_button":[]}]},{"name":"教师菜单","sub_button":[{"type":"view","name":"教师主页","url":"http://awjdjsz.jincheng4917.cn/index/WxIndex/tpage","sub_button":[]},{"type":"view","name":"课程管理","url":"http://awjdjsz.jincheng4917.cn/index/WxIndex/tcourse","sub_button":[]},{"type":"view","name":"分数录入","url":"http://awjdjsz.jincheng4917.cn/index/WxIndex/tgrade","sub_button":[]}]},{"type":"scancode_push","name":"扫码进教室","key":"rselfmenu_0_1","sub_button":[]}]}}如果是一次性设置,可以修改上面的代码,然后把界面改成自定义菜单创建界面,然后输入修改后的代码注意:当查询结果代码用于创建按钮时,第二行和倒数第二行删除"menu"{},否则会报错。点击create后,刷新公众号,按钮已经出现了。3.代码分析我们还是要把这张流程图拿出来1、第一阶段其实就是上面刚才已经完成的,就是在公众号按钮里面设置一个链接,让用户可以通过按钮访问ThnkPHP的某个方法。2.第二阶段//你的微信公众号appidprotected$appid='wx4b4890b3f8c0ada5';//你的微信公众号secretprotected$appsecret='7634c6e2889e0d366e4ff2e58bc520fa';//用户访问这个方法publicfunctionweChatAccredit($buttonType){//这个地址就是回调地址$url='http://'.$_SERVER['HTTP_HOST'].'/index/WxIndex/getChatInfo';//调用方法accredit($url,$buttonType);}//访问服务器的方法publicfunctionaccredit($redirect_url,$state){//拼接的URL$url="https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appid}&redirect_uri={$redirect_url}&response_type=code&scope=snsapi_userinfo&state={$state}#wechat_redirect";//重定向$this->redirect($url);}至此,用户重定向到访问微信服务器后,会回调开发者服务器和code,所以我们还要继续把code换成AccessToken3,第三阶段//回调到这个方法publicfunctiongetChatInfo(){$we_chat=newWxController();//实例化微信类$code=$_GET['code'];//获取跳转后的代码$state=$_GET['state'];//获取状态$access_token=getAccessToken($code);//根据code获取token根据access_token和openid获取用户信息$we_chat_user_info=getWeChatUserInfo($access_token['access_token'],$access_token['openid']);$this->gogogo($state,$access_token["openid"]);publicfunctiongetAccessToken($code){$url="https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->appid}&secret={$this->appsecret}&code={$code}&grant_type=authorization_code";$res=file_get_contents($url);//获取文件内容或获取网络请求内容$access_token=json_decode($res,true);返回$access_token;}publicfunctiongetWeChatUserInfo($access_token,$openid){$url="https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openid}&lang=zh_CN";$output=file_get_contents($url);$weChatUserInfo=json_decode($output,true);返回$weChatUserInfo;}在这里,开发服务器已经成功获取到用户信息,接下来就可以自己写gogogo()方法,通过OpenID进行登录操作,实现自动登录,登录后将用户请求的网页返回给用户4、附上完整代码1、\app\index\controller\WxindexController.phpweChatAccredit($this::$page);}publicfunctioncourse(){//跳转到课程查询$this->weChatAccredit($this::$course);}publicfunctionscore(){//跳转到分数查询$this->weChatAccredit($this::$score);}publicfunctioninfo(){//跳转到个人信息$this->weChatAccredit($this::$info);}/***微信按钮跳转授权*/publicfunctionweChatAccredit($button类型){$url='http://'.$_SERVER['HTTP_HOST'].'/index/WxIndex/getChatInfo';$we_chat=newWxController();//实例化类$we_chat->accredit($url,$buttonType);//调用方法}/***获取微信用户信息*/publicfunctiongetChatInfo(){$we_chat=newWxController();//实例化微信类$code=$_GET['code'];//获取跳转后的代码$state=$_GET['state'];//获取状态$access_token=$we_chat->getAccessToken($code);//根据代码获取token$this->gogogo($state,$access_token["openid"]);}//用于跳转到各个方法,传入OpenId和跳转的方法publicfunctiongogogo($state,$openid){Student::login($openid);返回“成功”;//请根据实际情况编写跳转内容}}2、\app\index\controller\WxController.phpappid}&redirect_uri={$redirect_url}&response_type=code&scope=snsapi_userinfo&state={$state}#wechat_redirect";$this->redirect($url);}/***@param$code*@returnbool|string*/publicfunctiongetAccessToken($code){$url="https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->appid}&secret={$this->appsecret}&code={$code}&grant_type=authorization_code";$res=file_get_contents($url);//获取文件内容或获取网络请求内容$access_token=json_decode($res,true);返回$access_token;}/***获取用户信息*@paramunknown$openid*@paramunknown$access_token*@returnunknown*/publicfunctiongetWeChatUserInfo($access_token,$openid){$url="https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openid}&lang=zh_CN";$output=file_get_contents($url);$weChatUserInfo=json_decode($output,true);return$weChatUserInfo;}}五、总结整个流程的核心,就是那张流程图