网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述
上一篇文章网站实现微信登录之嵌入二维码中描述了如何在自己的登录页面内嵌入登录二维码,今天的这篇文章主要是描述下在扫码成功之后微信重定向回网站后登录逻辑的处理,其实也就是验证身份信息,授权用户登录的逻辑。这里说句题外话,写博客复习已经做过的项目真的有助于自己对已经写过代码和业务逻辑的理解,说不定还有意外的收获。所谓,“温故而知新”,我会保持写博客的习惯。
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。
public function actionCallback($code, $state)
{
// 获取并校验前台存储的随机串,防csrf攻击
$session = Yii::$app->session;
if ($state != $session->get('wx_state')) {
exit();
}
$session->remove('wx_state'); // 微信开放平台网站应用的appid和秘钥secret
$appid = 'appid';
$secret = 'secret'; $curl = new Curl();
$wxresponse = $curl->get('https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid
. '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code');
$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,不成功(新用户),可以考虑添加新用户实现扫码注册的逻辑。
if (isset($wxresult->errcode) && $wxresult->errcode > 0) {
// 向微信请求授权时出错,打印错误码
echo json_encode($wxresult);
exit;
} else {
// 获取用户个人信息(unionid)
$response = $curl->get('https://api.weixin.qq.com/sns/userinfo?access_token=' . $wxresult->access_token
. '&openid=' . $wxresult->openid);
$result = json_decode($response);
$wxUser = WxUser::find()->where(['wx_unionid' => $result->unionid])->one();
if ($wxUser) {
// 登录
$result = Yii::$app->user->login($wxUser->id, 3600 * 24 * 30);
if ($result) {
// 登录成功,设置session
Yii::$app->session['wxuser'] = $wxUser->id;
} else {
// 登录失败
echo 'login 失败';
exit();
}
} else {
// 创建新用户
}
}
第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,小结
微信扫码登录或注册方便了用户,但却增加了开发者的开发、调试等工作量。其实不止是开发阶段的工作量,整个网站在设计时就要考虑到这个功能,登录界面的设计、页面的跳转等。
参考:
完
网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述的更多相关文章
- 网站实现微信登录之嵌入二维码——基于yii2开发的描述
之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...
- 回调函数中使用MFC类的成员或对话框控件的简单方法
在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量.类成员函数,亦或者对话框控件的句柄.由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.. ...
- 【spring 后台跳转前台】使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中
问题: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示: 问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方法 ...
- JavaScript 回调函数中的 return false 问题
今天一个同事问了我一个问题,就是在 Ajax 方法中,请求成功后(success)的回调函数中根据响应的值来判断程序是否继续执行,他不解的是在回调函数中已经 return false 了,但是 Aja ...
- 使用匿名函数在回调函数中正确访问JS循环变量
有时候, 需要以不同的参数调用某个URL,并且在回调函数中仍然可以访问正在使用的参数, 这时候, 需要使用闭包保存当前参数, 否则, 当回调函数执行时, 之前的参数很可能早已被修改为最后一个参数了. ...
- JS回调函数中的this指向(详细)
首先先说下正常的this指向问题 什么是this:自动引用正在调用当前方法的.前的对象. this指向的三种情况 1. obj.fun() fun中的this->obj,自动指向.前的对 ...
- Javascript回调函数中的this指向问题
使用js中的定时器(setInterval,setTimeout),很容易会遇到this指向的问题. 直接上例子: 1 var name = 'my name is window'; 2 var ob ...
- 云平台项目--学习经验--回调函数中call和apply
Js中可以通过call和apply来代替另一个对象调用一个方法,将一个函数对象上下文从初始上下文改变为thisObj指定的新对象.简而言之,改变函数执行的上下文,而call和apply的基本区别在于他 ...
- 【springMVC 后台跳转前台】1.使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中 ----2.前后台都没有报错,不能进入ajax回调函数
问题1: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示: 问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方 ...
随机推荐
- 隐私泄露杀手锏 —— Flash 权限反射
[简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ...
- 【前端性能】高性能滚动 scroll 及页面渲染优化
最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...
- C语言 · 乘法表
问题描述 输出九九乘法表. 输出格式 输出格式见下面的样例.乘号用"*"表示. 样例输出 下面给出输出的前几行:1*1=12*1=2 2*2=43*1=3 3*2=6 3*3=94 ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- .net 分布式架构之业务消息队列
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- 讓TQ2440也用上設備樹(1)
作者:彭東林 郵箱:pengdonglin137@163.com QQ:405728433 開發板 TQ2440 + 64MB 內存 + 256MB Nand 軟件 Linux: Linux-4.9 ...
- 代码的坏味道(14)——重复代码(Duplicate Code)
坏味道--重复代码(Duplicate Code) 重复代码堪称为代码坏味道之首.消除重复代码总是有利无害的. 特征 两个代码片段看上去几乎一样. 问题原因 重复代码通常发生在多个程序员同时在同一程序 ...
- BPM流程中心解决方案分享
一.需求分析 在过去办公自动化的浪潮中,很多企业已经实施了OA流程,但随着客户的发展和对流程管理的越来越重视, 客户对流程应用需求越来越深 入,您可能面临以下需求: 1.流程功能不能满足需求,包括流程 ...
- 通过Mono 在 Heroku 上运行 .NET 应用
英文原文:Running .NET on Heroku 中文原文:在 Heroku 上运行 .NET 应用 自从加入了Heroku之后,我就想在这个平台上运行.NET程序.现在我很高兴向大家宣布,我们 ...