网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述

news/2024/5/10 1:04:50/文章来源:https://blog.csdn.net/weixin_30783629/article/details/97723837

上一篇文章网站实现微信登录之嵌入二维码中描述了如何在自己的登录页面内嵌入登录二维码,今天的这篇文章主要是描述下在扫码成功之后微信重定向回网站后登录逻辑的处理,其实也就是验证身份信息,授权用户登录的逻辑。这里说句题外话,写博客复习已经做过的项目真的有助于自己对已经写过代码和业务逻辑的理解,说不定还有意外的收获。所谓,“温故而知新”,我会保持写博客的习惯。

1,微信扫码成功之后

在用户扫码成功之后,pc端网站上的二维码会出现如下的提示:(这里是用的微信开发文档中的例子1号店网站用来演示效果)。

这里需要注意的是,微信开发文档中的例子请求登录1号店网站,它是给出了一个微信登录的链接https://passport.yhd.com/wechat/login.do,点击登录链接后会重定向到扫描二维码的页面,页面链接如下:https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=e25d9455e8f8e6f60a9fef0ba6509889#wechat_redirect,这个做法与上一篇文章网站实现微信登录之嵌入二维码的做法不同:它没有将二维码用js嵌入到登录页面login.do中,而是直接在登录页面中进行了重定向:

header('Location: https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect');

在实际开发中,应该根据设计的要求或客户需求来选择利用js嵌入还是在页面中重定向的方法。

然后,在手机端的微信中会弹出提示用户确认登陆1号店的界面:

点击登录按钮后,pc端网页会跳转到哪儿去呢?这个也要根据实际的业务逻辑来处理。

2,获取access_token和授权用户的openid

在redirect_uri的URL映射的对应的action中来通过code获取access_token。

 1     public function actionCallback($code, $state)
 2     {
 3         // 获取并校验前台存储的随机串,防csrf攻击
 4         $session = Yii::$app->session;
 5         if ($state != $session->get('wx_state')) {
 6             exit();
 7         }
 8         $session->remove('wx_state');
 9 
10         // 微信开放平台网站应用的appid和秘钥secret
11         $appid = 'appid';
12         $secret = 'secret';
13 
14         $curl = new Curl();
15         $wxresponse = $curl->get('https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid
16             . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code');
17         $wxresult = json_decode($wxresponse);

注意:上面代码第14行用到了一个yii2的curl扩展,感兴趣的可以去github上看下。

第15行请求成功后返回的参数如下:

{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE" 
}

 

参数	        说明
access_token	接口调用凭证
expires_in	access_token接口调用凭证超时时间,单位(秒)
refresh_token	用户刷新access_token
openid	        授权用户唯一标识
scope	        用户授权的作用域,使用逗号(,)分隔

 

actionCallback方法的参数中,$code是用户扫码确认登录后微信返回的,$state是自己设置的参数,详细可见网站实现微信登录之嵌入二维码一文。请求得到access_token和openid最后被存储到$wxresult中。

这里需要注意下,此处返回的openid与第3节中返回的openid是不同的,注意看参数说明。

3,利用上面获取的token和openid获取用户的个人信息,查询数据库验证登录。成功则设置session,不成功(新用户),可以考虑添加新用户实现扫码注册的逻辑。

 1         if (isset($wxresult->errcode) && $wxresult->errcode > 0) {
 2             // 向微信请求授权时出错,打印错误码
 3             echo json_encode($wxresult);
 4             exit;
 5         } else {
 6             // 获取用户个人信息(unionid)
 7             $response = $curl->get('https://api.weixin.qq.com/sns/userinfo?access_token=' . $wxresult->access_token
 8                 . '&openid=' . $wxresult->openid);
 9             $result = json_decode($response);
10             $wxUser = WxUser::find()->where(['wx_unionid' => $result->unionid])->one();
11             if ($wxUser) {
12                 // 登录
13                 $result = Yii::$app->user->login($wxUser->id, 3600 * 24 * 30);
14                 if ($result) {
15                     // 登录成功,设置session
16                     Yii::$app->session['wxuser'] = $wxUser->id;
17                 } else {
18                     // 登录失败
19                     echo 'login 失败';
20                     exit();
21                 }
22             } else {
23                 // 创建新用户
24             }
25         }

第7行请求成功后,返回的参数示例如下:

{ 
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1", 
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"}

 

参数	        说明
openid	        普通用户的标识,对当前开发者帐号唯一
nickname	普通用户昵称
sex	        普通用户性别,1为男性,2为女性
province	普通用户个人资料填写的省份
city	        普通用户个人资料填写的城市
country	        国家,如中国为CN
headimgurl	用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
privilege	用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
unionid	        用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

 

上面代码第10行是依据用户的unionid是否在数据库中来验证其是否为网站的可登录用户,这里为什么要使用用户的unionid呢?这里涉及到了微信授权接口的UnionID机制。

微信开发文档授权后接口调用(UnionID)中对于unionid的解释:此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

我的理解是,每个用户对各公众号的OpenID是唯一的,而对于不同公众号,同一用户的openid是不同的。那么如果有多个公众号(服务号、订阅号),用openid就不能区分用户的唯一身份,就只能用unionid了。就算只有一个公众号,也建议采用unionid来区分用户身份的唯一性。

 

4,小结

微信扫码登录或注册方便了用户,但却增加了开发者的开发、调试等工作量。其实不止是开发阶段的工作量,整个网站在设计时就要考虑到这个功能,登录界面的设计、页面的跳转等。

 

参考:

微信开放平台资源中心


转载于:https://www.cnblogs.com/yangtoude/p/wechat-login-callback-logic-based-on-yii2-development-experience.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_777418.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

据说这是最详细软件测试电商网站测试实战教程总结

目录:导读一、兼容性二、UI测试三、用户体验测试UE四、购物流程及购物规则测试五、支付流程六、订单流程测试七、性能,响应速度测试八、重点(总结)一、兼容性 (1)主要是在浏览器兼容 (2&#x…

chrome无法从该网站添加应用、扩展程序和用户脚本的有效解决方法

解决方案 第一步: 新建一个标签页,在地址栏输入:chrome://flags/#extensions-on-chrome-urls并按回车键 将值改为enabled OK了,就可以完美解决了

OpenCMS模板的导出和OpenCMS网站的导出

1、OpenCMS模板的导出 (1)切换到Administration视图,单击Module Management,如图所示: (2)导出位置:tomcat根目录\webapps\opencms\WEB-INF\packages\modules\文件夹下cn.mysite.tem…

网站开发技巧参考大全

事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x event.y 窗…

DNS原因导致的不能访问网站问题一例

友情提示:大家可以了解下以下在这次问题解决中用到的一些技术名词:智能DNS和BGP了。双线及策略路由。公司的业务发展很快,在偶的老家郑州市和河南建业合作开了新的项目,而且二七塔附近的华联商厦亦在我们的管理之下。基于此&#…

2020年拟在山东招生普通高校专业(类)选考科目要求 网站数据爬虫实战

需要爬取 1622 个高校的数据 , 序号 ,地区 学校代码 , 学校名称 , 选课科目要求 , 学校网址 。 因为此网站禁用了右键, 所以直接用 python 代码分析 网站html 。 form 表格的 一行 html代码如上 。 都是在 td 标签下, 直接改中国大学排名定向爬虫实例 代码。 (1) 获取 ht…

高并发高流量网站架构

高并发高流量网站架构(转) Web2.0的兴起,掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也极大的方便了上网的人们。但Web2.0以用户为导向的理念&a…

C# seo测试小工具1:同时更新多网站的博客(csdn,cnblogs,163,sina)

这几天我一个朋友在学seo,老师要求学生们同时发表一篇博客来测试百度的排名系统。所以就有了这个小程序,给同样有这方面需求的朋友们一个参考,下面介绍一下实现方法。 国内的这几个网站都实现了国际通用的博客api:MetaWeblog。通过…

建站手册-浏览器信息:Internet Explorer 浏览器

ylbtech-建站手册-浏览器信息:Internet Explorer 浏览器1.返回顶部 1、http://www.w3school.com.cn/browsers/browsers_internetexplorer.asp2、Internet Explorer 是目前使用最为广泛的因特网浏览器。 Internet Explorer 8 2009 年 3 月 19 日,微软发布…

做网站用UTF-8还是GB2312?

2019独角兽企业重金招聘Python工程师标准>>> 经常我们打开外国网站的时候出现乱码,又或者打开很多非英语的外国网站的时候,显示的都是口口口口口的字符, WordPress程序是用的UTF-8,很多cms用的是GB2312。 ● 为什么有这…

dedecms 后台网站 标题设置

打开文件夹,找到dede/templets/index2.htm,修改第6行就行了 转载于:https://www.cnblogs.com/moguzi12345/p/8124087.html

国内某知名婚恋网站的Kubernetes落地实践

随着Kubernetes的遍地开花,Kubernetes的优势可以说是深入人心,所以,我们也掀起了一场改革,目的就是改变我们以往的运维模式,利用Kubernetes,来实现更高效的交付和更好地提高我们的资源使用率,推…

网站基本标签及css样式简介(3)

CSS层叠样式&#xff1a;一.内部样式表1).行内样式<td style"font-size:30px;">封面回顾</td>...td为行级标签&#xff0c;其他还有&#xff1a;按钮、输入框&#xff0c;范围、图像、超链接、换行标签2).嵌入样式(在<head>标签中实现)<style t…

在Kubernetes中部署网站的综合指南

最近&#xff0c;我们做了一个把Grofers的所有服务迁移到Kubernetes上的决定。Grofers是杂货领域印度最大的低价在线超市&#xff0c;成立于2013年12月01日&#xff0c;由Albinder Dhindsa和Saurabh Kumar创立&#xff0c;总部位于印度德里的卫星城市Gurugram。其主要提供各种类…

教你用 Docker 搭建网站

2013 年发布至今&#xff0c; Docker 一直广受瞩目&#xff0c;被认为可能会改变软件行业。但是&#xff0c;许多人并不清楚 Docker 到底是什么&#xff0c;要解决什么问题&#xff0c;好处又在哪里&#xff1f;本文就来详细解释&#xff0c;帮助大家理解它&#xff0c;还带有简…

网站标题前的小logo

原因&#xff1a;每个浏览器访问服务器的时候会自动发送一个GET 请求&#xff0c;地址是&#xff1a;/favicon.ico 如果不处理&#xff0c;则只会在浏览器标题前添加一个文本类的图标 前提&#xff1a;有现有的图标favicon.ico&#xff0c;且按开发规范存放在static/img/下 解…

ASP.NET 网站路径

使用网站中的资源时&#xff0c;通常必须指定资源的路径。例如&#xff0c;您可以使用 URL 路径引用页面中的图像文件或网站中其他位置处的页面的 URL。同样&#xff0c;Web 应用程序中的代码可以使用基于服务器的文件的物理文件路径对文件进行读写操作。ASP.NET 提供用于引用资…

帅的一坨,不转不行。优雅实用web标准网站设计欣赏

文章来源于我非常喜爱的Smashing Magazine。网站不支持图片外链接&#xff0c;如果看不到图片请访问原文地址&#xff1a;http://www.smashingmagazine.com/2007/07/04/inspiration-package-usable-elegant-inspiring-design-showcase/以下是原文&#xff1a; Inspiration Pack…

js入门·表单元素(select下拉列表)制作二级联动菜单和网站导航

对于脚本来说&#xff0c;最复杂的表单元素对象就是select了&#xff0c;他是一个复合对象&#xff0c;包含OPTION对象数组的对象 演示一&#xff1a;导航,这个多见于网站友情链接 请选择您要去的网站天轰穿系列教程博客园CSDN演示二&#xff1a;地区二级无刷新联动菜单&#x…

关系网成网络盈利模式 LinkedIn网站探秘

“人传人”的创业群体 2003年&#xff0c;从加州大学伯克利分校经济系毕业后&#xff0c;林文文开始了在加州联合银行的工作。今年7月&#xff0c;她决定转行做市场营销&#xff0c;然而由于缺乏相关的工作经验&#xff0c;她在几大求职网站上投的简历最终都石沉大海。 后来&am…